You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ar...@locus.apache.org on 2000/04/04 11:45:13 UTC

cvs commit: xml-fop/src/org/apache/fop/apps PrintCommandLine.java

arved       00/04/04 02:45:12

  Added:       src/org/apache/fop/apps PrintCommandLine.java
  Log:
  Added: format and print class
  
  Revision  Changes    Path
  1.1                  xml-fop/src/org/apache/fop/apps/PrintCommandLine.java
  
  Index: PrintCommandLine.java
  ===================================================================
  package org.apache.fop.apps;
  
  /*
    originally contributed by
    Stanislav Gorkhover: stanislav.gorkhover@jcatalog.com
    jCatalog Software AG
   */
  
  
  import org.xml.sax.Parser;
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  import org.xml.sax.SAXParseException;
  
  import java.awt.Graphics;
  import java.awt.print.*;
  import java.io.PrintWriter;
  import java.io.IOException;
  import java.util.Vector;
  
  import org.apache.fop.render.awt.AWTRenderer;
  import org.apache.fop.layout.AreaTree;
  import org.apache.fop.layout.Page;
  
  
  /**
   * This class prints a xsl-fo dokument without interaction.
   * At the moment java has not the possibility to configure the printer and it's
   * options without interaction (30.03.2000).
   * This class allows to print a set of pages (from-to), even/odd pages and many copies.
   * - Print from page xxx: property name - start, value int
   * - Print to page xxx: property name - end, value int
   * - Print even/odd pages: property name - even, value boolean
   * - Print xxx copies: property name - copies, value int
   *
   */
  public class PrintCommandLine extends CommandLine {
  
  
    public static void main(String[] args) {
  
      String version = Version.getVersion();
      System.err.println(version);
  
      if (args.length != 1) {
        System.err.println("usage: java [-Dstart=i] [-Dend=i]"
          + " [-Dcopies=i] [-Deven=true|false]"
          + " org.apache.fop.apps.PrintCommandLine formatting-object-file");
        System.exit(1);
      }
  
      Parser parser = createParser();
  
      if (parser == null) {
        System.err.println("ERROR: Unable to create SAX parser");
        System.exit(1);
      }
  
      PrintRenderer renderer = new PrintRenderer();
      try {
        Driver driver = new Driver();
  
        driver.setRenderer(renderer);
        driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
        driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
        driver.buildFOTree(parser, fileInputSource(args[0]));
        driver.format();
        driver.render();
      } catch (Exception e) {
        System.err.println("FATAL ERROR: " + e.getMessage());
        System.exit(1);
      }
  
      int copies = PrintRenderer.getIntProperty("copies", 1);
      renderer.setCopies(copies);
  
      PrinterJob pj = PrinterJob.getPrinterJob();
      pj.setPageable(renderer);
  
      pj.setCopies(copies);
      try {
        pj.print();
      } catch(PrinterException pe) {
        pe.printStackTrace();
      }
    }
  
  
    static class PrintRenderer extends AWTRenderer {
  
      static int EVEN_AND_ALL = 0;
      static int EVEN = 1;
      static int ODD = 2;
  
      int startNumber;
      int endNumber;
      int mode = EVEN_AND_ALL;
      int copies = 1;
  
      PrintRenderer() {
        super(null);
  
        startNumber = getIntProperty("start", 1) - 1;
        endNumber = getIntProperty("end", -1);
  
        mode = EVEN_AND_ALL;
        String str = System.getProperty("even");
        if (str != null) {
          try {
            mode = Boolean.valueOf(str).booleanValue() ? EVEN : ODD;
          } catch (Exception e) {
          }
        }
  
      }
  
  
      static int getIntProperty(String name, int def) {
        String propValue = System.getProperty(name);
        if (propValue != null) {
          try {
            return Integer.parseInt(propValue);
          } catch(Exception e) {
            return def;
          }
        }
        else {
          return def;
        }
      }
  
      public void render(AreaTree areaTree, PrintWriter writer) throws IOException {
        tree = areaTree;
        if (endNumber == -1) {
          endNumber = tree.getPages().size();
        }
  
        Vector numbers = getInvalidPageNumbers();
        for (int i = numbers.size() - 1; i > -1; i--)
          tree.getPages().removeElementAt(Integer.parseInt((String)numbers.elementAt(i)));
  
      }
  
      public void renderPage(Page page) {
        pageWidth  = (int)((float)page.getWidth() / 1000f);
        pageHeight = (int)((float)page.getHeight() / 1000f);
        super.renderPage(page);
      }
  
  
      private Vector getInvalidPageNumbers() {
  
        Vector vec = new Vector();
        int max = tree.getPages().size();
        boolean isValid;
        for (int i = 0; i < max; i++) {
          isValid = true;
          if (i < startNumber || i > endNumber) {
            isValid = false;
          }
          else if (mode != EVEN_AND_ALL) {
            if (mode == EVEN && ((i + 1) % 2 != 0))
              isValid = false;
            else if (mode == ODD && ((i + 1) % 2 != 1))
              isValid = false;
          }
  
          if (!isValid)
            vec.add(i + "");
        }
  
        return vec;
      }
  
      void setCopies(int val) {
        copies = val;
        Vector copie = tree.getPages();
        for (int i = 1; i < copies; i++) {
          tree.getPages().addAll(copie);
        }
  
      }
  
    } // class PrintRenderer
  } // class PrintCommandLine