aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/apps/PrintStarter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/apache/fop/apps/PrintStarter.java')
-rw-r--r--src/org/apache/fop/apps/PrintStarter.java197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/org/apache/fop/apps/PrintStarter.java b/src/org/apache/fop/apps/PrintStarter.java
new file mode 100644
index 000000000..e246335cc
--- /dev/null
+++ b/src/org/apache/fop/apps/PrintStarter.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
+ * For details on use and redistribution please refer to the
+ * LICENSE file included with these sources."
+ */
+
+
+package org.apache.fop.apps;
+
+/*
+ originally contributed by
+ Stanislav Gorkhover: stanislav.gorkhover@jcatalog.com
+ jCatalog Software AG
+ */
+
+
+import org.xml.sax.XMLReader;
+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.OutputStream;
+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;
+import org.apache.fop.messaging.MessageHandler;
+
+
+/**
+ * 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 PrintStarter extends CommandLineStarter {
+
+ public PrintStarter (CommandLineOptions options) {
+ super(options);
+ }
+
+ public void run () {
+ Driver driver = new Driver();
+ if (errorDump) {
+ driver.setErrorDump(true);
+ }
+
+ String version = Version.getVersion();
+ MessageHandler.errorln(version);
+
+ XMLReader parser = inputHandler.getParser();
+
+ setParserFeatures(parser,errorDump);
+
+ PrintRenderer renderer = new PrintRenderer();
+
+ try {
+ driver.setRenderer(renderer);
+ driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
+ driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
+ driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
+ driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
+ driver.buildFOTree(parser, inputHandler.getInputSource());
+ driver.format();
+ driver.render();
+ } catch (Exception e) {
+ MessageHandler.errorln("FATAL ERROR: " + e.getMessage());
+ if (errorDump) {
+ e.printStackTrace();
+ }
+
+ 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,
+ OutputStream stream) 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
+
+