Back to FOPAvalonization and FOPProjectPages
Alternative new-API proposal
Note: This proposal is now implemented as a general XSL-FO API with adapters for several XSL-FO implementations (FOP 0.20.5, FOP 1.0dev, JFOR, FOray). This is still work-in-progress and may not be fit for productive use, yet. It can be found here:
http://www.jeremias-maerki.ch/dev/jafop
Author: JeremiasMaerki (jm)
public interface FOProcessorFactory {
public FOProcessor newFOProcessor();
public FOProcessorHandler newFOProcessorHandler();
}
public class DefaultFOProcessorFactory implements FOProcessorFactory {
public static DefaultFOProcessorFactory newInstance();
public static DefaultFOProcessorFactory newInstance(File cfgFile);
public static DefaultFOProcessorFactory newInstance(InputStream cfg);
public void setLogger(Logger);
public Logger getLogger();
public void setSourceResolver(SourceResolver);
public SourceResolver getSourceResolver();
}
public class AvalonFOProcessorFactory extends AbstractLogEnabled
implements Serviceable, Configurable, Initializable {
public void service(ServiceManager);
public void configure(Configuration);
public void initialize();
}
public interface FOProcessor {
public void addEventListener(FOPEventListener);
public void removeEventListener(FOPEventListener);
public void process(Source, FOPResult);
}
public interface FOPEvent extends EventObject {
//todo: figure out details, maybe further refine by sublassing
}
public interface FOPEventListener extends EventListener {
public void error(FOPException);
public void warning(FOPException);
public void notification(FOPEvent);
public void layoutProblem(FOPEvent);
//...todo: figure out details
}
public interface FOProcessorHandler
extends ContentHandler... {
public void setResult(FOPResult);
public FOProcessor getFOProcesor();
}
//Sample bean: For use with FOPResult.setOutputProperty()
public class DocumentMetadata {
public void setAuthor(String);
public String getAuthor();
public void setTitle(String);
public String getTitle();
public void setKeywords();
public String getKeywords();
//...
}
public abstract class FOPResult {
public void setOutputProperty(String, Object);
public Object getOutputProperty(String);
public void setOutputProperties(Properties);
public Properties getOutputProperties();
}
/** For PDF, PS, PCL, RTF, TIFF etc. */
public class StreamFOPResult implements FOPResult {
public void setMIMEType(String);
public String getMIMEType();
public void setOutputStream(OutputStream);
public OutputStream getOutputStream();
public void setSystemID(File);
public void setSystemID(String);
public String getSystemID();
}
/** For SVG and AT */
public class SAXFOPResult implements FOPResult {
public void setContentHandler(ContentHandler);
public ContentHandler getContentHandler();
}
/** For SVG and AT */
public class DOMFOPResult implements FOPResult {
public void setNode(Node);
public Node getNode();
}
/** For embedding and AWT preview */
public class Java2DFOPResult implements FOPResult {
public Java2DHook getJava2DHook();
}
public interface Java2DHook {
public int getPageCount();
public Rectangle getPageSize(int pagenum);
public void renderPage(int pagenum, Graphics2D);
}
public class PrintFOPResult implements FOPResult {
public Printable getPrintable();
public Pageable getPageable();
}
Example usage
XSL-FO to PDF with encryption
FOProcessorFactory fopFactory = DefaultFOProcessorFactory.newInstance(new File("C:\userconfig.xml"));
fopFactory.setLogger(new ConsoleLogger());
FOProcessor fop = fopFactory.newFOProcessor();
Source src = new StreamSource(new File("C:\myfile.fo"));
FOPResult res = new StreamFOPResult("application/pdf", new File("C:\myfile.pdf"));
PDFEncryptionParams pdfcrypto = new PDFEncryptionParams("userpwd", "ownerpwd", false, false, false, true);
//org.apache.fop.pdf.PDFEncryptionParams: This class already exists today. Can be reused.
res.setOutputProperty("encryption", pdfcrypto);
DocumentMetadata metadata = new DocumentMetadata();
metadata.setTitle("my document");
metadata.setAuthor("Superman");
res.setOutputProperty("metadata", metadata);
fop.process(src, res);
XML to Printer
FOProcessorFactory fopFactory = DefaultFOProcessorFactory.newInstance(new File("C:\userconfig.xml"));
fopFactory.setLogger(new ConsoleLogger());
TransformerFactory traxFactory = TransformerFactory.newInstance();
Transformer transformer = traxFactory.newTransformer(new StreamSource(new File("C:\cool.xsl")));
Source src = new StreamSource(new File("C:\myfile.xml"));
FOProcessorHandler handler = fopFactory.newFOProcessorHandler();
FOPResult res = new PrinterFOPResult();
handler.setResult(res);
transformer.transform(src, new SAXResult(handler));
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPageable(res.getPageable());
pj.print();
Additional comments
- StreamFOPResult could be subclasses to PDFFOPResult providing strong typing for the parameters.
public class PDFFOPResult extends StreamFOPResult {
public void setEncryptionParams(PDFEncryptionParams params) {
setOutputProperty("encryption", params);
}
public PDFEncryptionParams getEncryptionsParams() {
return (PDFEncryptionParams)getOutputProperty("encryption");
}
//....
}