【发布时间】:2018-12-25 01:04:39
【问题描述】:
在一个 Java 应用程序中,我使用 Saxon HE (9.9) 进行 XML-FO 转换。之后我使用 Apache FOP (2.3) 创建 PDF 文件。与随后两种转换在 cli 上的执行时间相比,FOP 转换很慢(仅 FOP 部分大约为 12 秒对 2 秒)。
// XML->FO
Processor proc = new Processor(false);
ExtensionFunction highlightingImage = new OverlayImage();
proc.registerExtensionFunction(highlightingImage);
ExtensionFunction mergeImage = new PlanForLandRegisterMainPageImage();
proc.registerExtensionFunction(mergeImage);
ExtensionFunction rolImage = new RestrictionOnLandownershipImage();
proc.registerExtensionFunction(rolImage);
ExtensionFunction fixImage = new FixImage();
proc.registerExtensionFunction(fixImage);
ExtensionFunction decodeUrl = new URLDecoder();
proc.registerExtensionFunction(decodeUrl);
XsltCompiler comp = proc.newXsltCompiler();
XsltExecutable exp = comp.compile(new StreamSource(new File(xsltFileName)));
XdmNode source = proc.newDocumentBuilder().build(new StreamSource(new File(xmlFileName)));
Serializer outFo = proc.newSerializer(foFile);
XsltTransformer trans = exp.load();
trans.setInitialContextNode(source);
trans.setDestination(outFo);
trans.transform();
// FO->PDF
FopFactory fopFactory = FopFactory.newInstance(fopxconfFile);
OutputStream outPdf = new BufferedOutputStream(new FileOutputStream(pdfFile));
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outPdf);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Source src = new StreamSource(foFile);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
到目前为止,我很确定,它不依赖于生成的 FO 文件的某些文件处理问题。如果我将完全不同的 FO 文件转换为使用 Saxon 生成的文件,则 FO 转换甚至会很慢。甚至在不执行 XML-FO 转换时控制台中的输出也不一样:
Dec 25, 2018 1:54:47 AM org.apache.fop.apps.FOUserAgent processEvent
INFO: Rendered page #1.
Dec 25, 2018 1:54:47 AM org.apache.fop.apps.FOUserAgent processEvent
INFO: Rendered page #2.
之前执行 XML-FO 转换时,不会在控制台中打印此输出。
XML-FO 转换步骤中有什么必须关闭的吗?
这种行为的原因是什么?
【问题讨论】:
-
您是否想要或需要创建中介
foFile?但是我不太确定您认为哪个部分太慢了,您能否更具体地说一下您是否认为 Saxon 完成的 XSLT 转换或 Apache FOP 完成的 XSL-FO 到 PDF 转换太慢? -
(嵌入式)Apache FOP 仅在 Saxon 创建 FO 文件后创建 PDF 时速度较慢。在 cli 上运行这两种转换,XML-FO 需要 5 秒,FO-PDF 需要 2 秒。嵌入的 XML-FO 转换需要 5 秒,而 FO-PDF 转换需要 12 秒。当不执行撒克逊人的 XML-FO 转换时,嵌入式 FO-PDF 转换与 cli 一样快。但是您通过结合这两个步骤的回答解决了我的执行问题。
标签: xslt xsl-fo saxon apache-fop