Explorar el Código

Added support for piping:

- input from stdin (-imagein not supported)
- output to stdout

Syntax: fop -xml # -xsl mystylesheet.xsl -pdf #
(reads the XML from stdin and sends the generated PDF to stdout)

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@675698 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-1_0
Jeremias Maerki hace 16 años
padre
commit
058fb8cefc

+ 110
- 39
src/java/org/apache/fop/cli/CommandLineOptions.java Ver fichero

@@ -59,7 +59,7 @@ public class CommandLineOptions {
/** Used to indicate that only the result of the XSL transformation should be output */
public static final int RENDER_NONE = -1;

/* These following constants are used to describe the input (either .FO, .XML/.XSL or
/* These following constants are used to describe the input (either .FO, .XML/.XSL or
* intermediate format)
*/

@@ -96,11 +96,15 @@ public class CommandLineOptions {
private int inputmode = NOT_SET;
/* output mode */
private String outputmode = null;
/* true if System.in (stdin) should be used for the input file */
private boolean useStdIn = false;
/* true if System.out (stdout) should be used for the output file */
private boolean useStdOut = false;
/* rendering options (for the user agent) */
private Map renderingOptions = new java.util.HashMap();
/* target resolution (for the user agent) */
private int targetResolution = 0;
private FopFactory factory = FopFactory.newInstance();
private FOUserAgent foUserAgent;

@@ -149,7 +153,7 @@ public class CommandLineOptions {
}
checkSettings();
setUserConfig();
//Factory config is set up, now we can create the user agent
foUserAgent = factory.newFOUserAgent();
foUserAgent.getRendererOptions().putAll(renderingOptions);
@@ -372,7 +376,12 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the fo file for the '-fo' option");
} else {
fofile = new File(args[i + 1]);
String filename = args[i + 1];
if (isSystemInOutFile(filename)) {
this.useStdIn = true;
} else {
fofile = new File(filename);
}
return 1;
}
}
@@ -396,7 +405,12 @@ public class CommandLineOptions {
throw new FOPException("you must specify the input file "
+ "for the '-xml' option");
} else {
xmlfile = new File(args[i + 1]);
String filename = args[i + 1];
if (isSystemInOutFile(filename)) {
this.useStdIn = true;
} else {
xmlfile = new File(filename);
}
return 1;
}
}
@@ -412,7 +426,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the PDF output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
if (pdfAMode != null) {
if (renderingOptions.get("pdf-a-mode") != null) {
throw new FOPException("PDF/A mode already set");
@@ -423,13 +437,25 @@ public class CommandLineOptions {
}
}

private void setOutputFile(String filename) {
if (isSystemInOutFile(filename)) {
this.useStdOut = true;
} else {
outfile = new File(filename);
}
}

private boolean isSystemInOutFile(String filename) {
return "#".equals(filename);
}

private int parseMIFOutputOption(String[] args, int i) throws FOPException {
setOutputMode(MimeConstants.MIME_MIF);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the MIF output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -440,7 +466,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the RTF output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -451,7 +477,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the TIFF output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -462,7 +488,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the PNG output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -508,7 +534,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the PDF output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -519,7 +545,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the PostScript output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -530,7 +556,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the text output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -541,7 +567,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the SVG output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -552,7 +578,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the AFP output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -563,7 +589,7 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the FO output file");
} else {
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
}
}
@@ -588,7 +614,7 @@ public class CommandLineOptions {
throw new FOPException("you must specify the output format and the output file");
} else {
setOutputMode(mime);
outfile = new File(args[i + 2]);
setOutputFile(args[i + 2]);
return 2;
}
}
@@ -599,7 +625,7 @@ public class CommandLineOptions {
fofile = new File(args[i]);
} else if (outputmode == null) {
outputmode = MimeConstants.MIME_PDF;
outfile = new File(args[i]);
setOutputFile(args[i]);
} else {
throw new FOPException("Don't know what to do with "
+ args[i]);
@@ -612,15 +638,15 @@ public class CommandLineOptions {
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the area-tree output file");
} else if ((i + 2 == args.length)
} else if ((i + 2 == args.length)
|| (args[i + 2].charAt(0) == '-')) {
// only output file is specified
outfile = new File(args[i + 1]);
setOutputFile(args[i + 1]);
return 1;
} else {
// mimic format and output file have been specified
mimicRenderer = args[i + 1];
outfile = new File(args[i + 2]);
setOutputFile(args[i + 2]);
return 2;
}
}
@@ -631,7 +657,12 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the Area Tree file for the '-atin' option");
} else {
areatreefile = new File(args[i + 1]);
String filename = args[i + 1];
if (isSystemInOutFile(filename)) {
this.useStdIn = true;
} else {
areatreefile = new File(filename);
}
return 1;
}
}
@@ -642,14 +673,19 @@ public class CommandLineOptions {
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the image file for the '-imagein' option");
} else {
imagefile = new File(args[i + 1]);
String filename = args[i + 1];
if (isSystemInOutFile(filename)) {
this.useStdIn = true;
} else {
imagefile = new File(filename);
}
return 1;
}
}

private PDFEncryptionParams getPDFEncryptionParams() throws FOPException {
PDFEncryptionParams params = (PDFEncryptionParams)renderingOptions.get(
PDFRenderer.ENCRYPTION_PARAMS);
PDFRenderer.ENCRYPTION_PARAMS);
if (params == null) {
if (!PDFEncryptionManager.checkAvailableAlgorithms()) {
throw new FOPException("PDF encryption requested but it is not available."
@@ -760,7 +796,7 @@ public class CommandLineOptions {

if (inputmode == XSLT_INPUT) {
// check whether xml *and* xslt file have been set
if (xmlfile == null) {
if (xmlfile == null && !this.useStdIn) {
throw new FOPException("XML file must be specified for the transform mode");
}
if (xsltfile == null) {
@@ -777,7 +813,7 @@ public class CommandLineOptions {
+ "\n fofile: "
+ fofile.getAbsolutePath());
}
if (!xmlfile.exists()) {
if (xmlfile != null && !xmlfile.exists()) {
throw new FileNotFoundException("Error: xml file "
+ xmlfile.getAbsolutePath()
+ " not found ");
@@ -795,10 +831,10 @@ public class CommandLineOptions {
}
if (xmlfile != null || xsltfile != null) {
log.warn("fo input mode, but xmlfile or xslt file are set:");
log.error("xml file: " + xmlfile.toString());
log.error("xslt file: " + xsltfile.toString());
log.error("xml file: " + xmlfile);
log.error("xslt file: " + xsltfile);
}
if (!fofile.exists()) {
if (fofile != null && !fofile.exists()) {
throw new FileNotFoundException("Error: fo file "
+ fofile.getAbsolutePath()
+ " not found ");
@@ -813,10 +849,10 @@ public class CommandLineOptions {
}
if (xmlfile != null || xsltfile != null) {
log.warn("area tree input mode, but xmlfile or xslt file are set:");
log.error("xml file: " + xmlfile.toString());
log.error("xslt file: " + xsltfile.toString());
log.error("xml file: " + xmlfile);
log.error("xslt file: " + xsltfile);
}
if (!areatreefile.exists()) {
if (areatreefile != null && !areatreefile.exists()) {
throw new FileNotFoundException("Error: area tree file "
+ areatreefile.getAbsolutePath()
+ " not found ");
@@ -830,7 +866,7 @@ public class CommandLineOptions {
log.warn("image input mode, but XML file is set:");
log.error("XML file: " + xmlfile.toString());
}
if (!imagefile.exists()) {
if (imagefile != null && !imagefile.exists()) {
throw new FileNotFoundException("Error: image file "
+ imagefile.getAbsolutePath()
+ " not found ");
@@ -944,6 +980,22 @@ public class CommandLineOptions {
return suppressLowLevelAreas;
}

/**
* Indicates whether input comes from standard input (stdin).
* @return true if input comes from standard input (stdin)
*/
public boolean isInputFromStdIn() {
return this.useStdIn;
}

/**
* Indicates whether output is sent to standard output (stdout).
* @return true if output is sent to standard output (stdout)
*/
public boolean isOutputToStdOut() {
return this.useStdOut;
}

/**
* Returns the input file.
* @return either the fofile or the xmlfile
@@ -986,15 +1038,17 @@ public class CommandLineOptions {
+ " (Examples for prof: PDF/A-1b or PDF/X-3:2003)\n\n"
+ " [INPUT] \n"
+ " infile xsl:fo input file (the same as the next) \n"
+ " (use # for infile to pipe input from stdin)\n"
+ " -fo infile xsl:fo input file \n"
+ " -xml infile xml input file, must be used together with -xsl \n"
+ " -atin infile area tree input file \n"
+ " -imagein infile image input file \n"
+ " -imagein infile image input file (piping through stdin not supported)\n"
+ " -xsl stylesheet xslt stylesheet \n \n"
+ " -param name value <value> to use for parameter <name> in xslt stylesheet\n"
+ " (repeat '-param name value' for each parameter)\n \n"
+ " [OUTPUT] \n"
+ " outfile input will be rendered as PDF into outfile\n"
+ " (use # for outfile to pipe output to stdout)\n"
+ " -pdf outfile input will be rendered as PDF (outfile req'd)\n"
+ " -pdfa1b outfile input will be rendered as PDF/A-1b compliant PDF\n"
+ " (outfile req'd, same as \"-pdf outfile -pdfprofile PDF/A-1b\")\n"
@@ -1027,6 +1081,7 @@ public class CommandLineOptions {
+ " Fop -fo foo.fo -pdf foo.pdf (does the same as the previous line)\n"
+ " Fop -xml foo.xml -xsl foo.xsl -pdf foo.pdf\n"
+ " Fop -xml foo.xml -xsl foo.xsl -foout foo.fo\n"
+ " Fop -xml # -xsl foo.xsl -pdf #\n"
+ " Fop foo.fo -mif foo.mif\n"
+ " Fop foo.fo -rtf foo.rtf\n"
+ " Fop foo.fo -print\n"
@@ -1057,11 +1112,19 @@ public class CommandLineOptions {
break;
case FO_INPUT:
log.info("FO ");
log.info("fo input file: " + fofile.toString());
if (this.useStdIn) {
log.info("fo input file: from stdin");
} else {
log.info("fo input file: " + fofile.toString());
}
break;
case XSLT_INPUT:
log.info("xslt transformation");
log.info("xml input file: " + xmlfile.toString());
if (this.useStdIn) {
log.info("xml input file: from stdin");
} else {
log.info("xml input file: " + xmlfile.toString());
}
log.info("xslt stylesheet: " + xsltfile.toString());
break;
default:
@@ -1074,7 +1137,7 @@ public class CommandLineOptions {
log.info("awt on screen");
if (outfile != null) {
log.error("awt mode, but outfile is set:");
log.info("out file: " + outfile.toString());
log.error("out file: " + outfile.toString());
}
} else if (MimeConstants.MIME_FOP_PRINT.equals(outputmode)) {
log.info("print directly");
@@ -1087,10 +1150,18 @@ public class CommandLineOptions {
if (mimicRenderer != null) {
log.info("mimic renderer: " + mimicRenderer);
}
log.info("output file: " + outfile.toString());
if (this.useStdOut) {
log.info("output file: to stdout");
} else {
log.info("output file: " + outfile.toString());
}
} else {
log.info(outputmode);
log.info("output file: " + outfile.toString());
if (this.useStdOut) {
log.info("output file: to stdout");
} else {
log.info("output file: " + outfile.toString());
}
}

log.info("OPTIONS");

+ 43
- 24
src/java/org/apache/fop/cli/InputHandler.java Ver fichero

@@ -5,9 +5,9 @@
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,8 +21,8 @@ package org.apache.fop.cli;

// Imported java.io classes
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Vector;

@@ -58,7 +58,7 @@ import org.apache.fop.render.awt.viewer.Renderable;
* parameters) or FO File input alone
*/
public class InputHandler implements ErrorListener, Renderable {
/** original source file */
protected File sourcefile = null;
private File stylesheet = null; // for XML/XSLT usage
@@ -66,12 +66,12 @@ public class InputHandler implements ErrorListener, Renderable {

/** the logger */
protected Log log = LogFactory.getLog(InputHandler.class);
/**
* Constructor for XML->XSLT->FO input
* @param xmlfile XML file
* @param xsltfile XSLT file
* @param params Vector of command-line parameters (name, value,
* @param params Vector of command-line parameters (name, value,
* name, value, ...) for XSL stylesheet, null if none
*/
public InputHandler(File xmlfile, File xsltfile, Vector params) {
@@ -95,7 +95,7 @@ public class InputHandler implements ErrorListener, Renderable {
* @param out the output stream to write the generated output to (may be null if not applicable)
* @throws FOPException in case of an error during processing
*/
public void renderTo(FOUserAgent userAgent, String outputFormat, OutputStream out)
public void renderTo(FOUserAgent userAgent, String outputFormat, OutputStream out)
throws FOPException {

FopFactory factory = userAgent.getFactory();
@@ -107,7 +107,7 @@ public class InputHandler implements ErrorListener, Renderable {
}

// if base URL was not explicitly set in FOUserAgent, obtain here
if (fop.getUserAgent().getBaseURL() == null) {
if (fop.getUserAgent().getBaseURL() == null && sourcefile != null) {
String baseURL = null;

try {
@@ -124,7 +124,7 @@ public class InputHandler implements ErrorListener, Renderable {

transformTo(res);
}
/** {@inheritDoc} */
public void renderTo(FOUserAgent userAgent, String outputFormat) throws FOPException {
renderTo(userAgent, outputFormat, null);
@@ -140,34 +140,53 @@ public class InputHandler implements ErrorListener, Renderable {
Result res = new StreamResult(out);
transformTo(res);
}
/**
* Creates a Source for the main input file. Processes XInclude if
* available in the XML parser.
*
*
* @return the Source for the main input file
*/
protected Source createMainSource() {
Source result;
InputStream in;
String uri;
if (this.sourcefile != null) {
try {
in = new java.io.FileInputStream(this.sourcefile);
uri = this.sourcefile.toURI().toASCIIString();
} catch (FileNotFoundException e) {
//handled elsewhere
return new StreamSource(this.sourcefile);
}
} else {
in = System.in;
uri = null;
}
try {
InputSource is = new InputSource(new FileInputStream(
this.sourcefile));
is.setSystemId(this.sourcefile.toURI().toASCIIString());
InputSource is = new InputSource(in);
is.setSystemId(uri);
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://xml.org/sax/features/namespaces", true);
spf.setFeature("http://apache.org/xml/features/xinclude", true);
XMLReader xr = spf.newSAXParser().getXMLReader();
result = new SAXSource(xr, is);
} catch (SAXException e) {
result = new StreamSource(this.sourcefile);
} catch (IOException e) {
result = new StreamSource(this.sourcefile);
if (this.sourcefile != null) {
result = new StreamSource(this.sourcefile);
} else {
result = new StreamSource(in, uri);
}
} catch (ParserConfigurationException e) {
result = new StreamSource(this.sourcefile);
if (this.sourcefile != null) {
result = new StreamSource(this.sourcefile);
} else {
result = new StreamSource(in, uri);
}
}
return result;
}
/**
* Creates a Source for the selected stylesheet.
* @return the Source for the selected stylesheet or null if there's no stylesheet
@@ -179,7 +198,7 @@ public class InputHandler implements ErrorListener, Renderable {
return null;
}
}
/**
* Transforms the input document to the input format expected by FOP using XSLT.
* @param result the Result object where the result of the XSL transformation is sent to
@@ -190,15 +209,15 @@ public class InputHandler implements ErrorListener, Renderable {
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer;
Source xsltSource = createXSLTSource();
if (xsltSource == null) { // FO Input
transformer = factory.newTransformer();
} else { // XML/XSLT input
transformer = factory.newTransformer(xsltSource);
// Set the value of parameters, if any, defined for stylesheet
if (xsltParams != null) {
if (xsltParams != null) {
for (int i = 0; i < xsltParams.size(); i += 2) {
transformer.setParameter((String) xsltParams.elementAt(i),
(String) xsltParams.elementAt(i + 1));

+ 10
- 8
src/java/org/apache/fop/cli/Main.java Ver fichero

@@ -62,7 +62,7 @@ public class Main {
fopJar = new File(baseDir, "fop.jar");
}
if (!fopJar.exists()) {
throw new RuntimeException("fop.jar not found in directory: "
throw new RuntimeException("fop.jar not found in directory: "
+ baseDir.getAbsolutePath() + " (or below)");
}
List jars = new java.util.ArrayList();
@@ -99,7 +99,7 @@ public class Main {
}*/
return urls;
}
/**
* @return true if FOP's dependecies are available in the current ClassLoader setup.
*/
@@ -115,7 +115,7 @@ public class Main {
return false;
}
}
/**
* Dynamically builds a ClassLoader and executes FOP.
* @param args command-line arguments
@@ -123,7 +123,7 @@ public class Main {
public static void startFOPWithDynamicClasspath(String[] args) {
try {
URL[] urls = getJARList();
//System.out.println("CCL: "
//System.out.println("CCL: "
// + Thread.currentThread().getContextClassLoader().toString());
ClassLoader loader = new java.net.URLClassLoader(urls, null);
Thread.currentThread().setContextClassLoader(loader);
@@ -137,13 +137,13 @@ public class Main {
System.exit(-1);
}
}
/**
* Executes FOP with the given ClassLoader setup.
* @param args command-line arguments
*/
public static void startFOP(String[] args) {
//System.out.println("static CCL: "
//System.out.println("static CCL: "
// + Thread.currentThread().getContextClassLoader().toString());
//System.out.println("static CL: " + Fop.class.getClassLoader().toString());
CommandLineOptions options = null;
@@ -155,7 +155,7 @@ public class Main {
if (!options.parse(args)) {
System.exit(1);
}
foUserAgent = options.getFOUserAgent();
String outputFormat = options.getOutputFormat();

@@ -164,6 +164,8 @@ public class Main {
out = new java.io.BufferedOutputStream(
new java.io.FileOutputStream(options.getOutputFile()));
foUserAgent.setOutputFile(options.getOutputFile());
} else if (options.isOutputToStdOut()) {
out = new java.io.BufferedOutputStream(System.out);
}
if (!MimeConstants.MIME_XSL_FO.equals(outputFormat)) {
options.getInputHandler().renderTo(foUserAgent, outputFormat, out);
@@ -190,7 +192,7 @@ public class Main {
System.exit(1);
}
}
/**
* The main routine for the command line interface
* @param args the command line parameters

Cargando…
Cancelar
Guardar