如何在Java中使用XML创建PDF?

目前,我正在用Java创建一个XML文件,并通过使用XSL / XSLT转换它在JSP页面中显示它。 现在我需要获取该XML文件并在PDF中显示相同的信息。 有没有办法通过使用某种XSL文件来做到这一点?

我见过iText Java-PDF库,但我找不到任何方法可以将它与XML和样式表一起使用。

任何援助将不胜感激。 提前致谢!

A – 解释

您应该使用Apache FOP框架生成pdf输出。 只需以xml格式提供数据并使用xsl-fo文件呈现页面,并在此xsl-fo文件中指定边距页面布局等参数。

我将提供一个简单的演示,我使用maven构建工具来收集所需的jar文件。 请在页面末尾通知,pdf中嵌入了一个svg图形。 我还想certificate你可以在pdf中嵌入svg图形。

B – 示例XML输入数据

    User Bill Data Thursday December 9 2016 00:04:29   John Doe 34239 123AD329248 17.84   Michael Doe 54823 942KFDSCW322 34.50   Jane Brown 66742 ABDD324KKD8 69.36   

C – XSL-FO模板

                      Bill Id: , Date:      XXX COMPANY        Page  of         MONTHLY BILL REPORT         Full Name   Postal Code   National ID   Payment                                         

D – 项目目录结构

在此处输入图像描述

E – Pom文件

  4.0.0 com.levent.fopdemo apache-fop-demo jar 1.0-SNAPSHOT apache-fop-demo http://maven.apache.org  2.1     org.apache.xmlgraphics fop ${fop.version}    Apache Fop Demo   org.apache.maven.plugins maven-compiler-plugin 3.5.1  1.8 1.8      

F – 演示代码:PdfGenerationDemo.java

 package com.levent.fopdemo; import java.io.File; import java.io.IOException; import java.io.OutputStream; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import org.apache.fop.apps.MimeConstants; public class PdfGenerationDemo { public static final String RESOURCES_DIR; public static final String OUTPUT_DIR; static { RESOURCES_DIR = "src//main//resources//"; OUTPUT_DIR = "src//main//resources//output//"; } public static void main( String[] args ) { try { convertToPDF(); } catch (FOPException | IOException | TransformerException e) { e.printStackTrace(); } } public static void convertToPDF() throws IOException, FOPException, TransformerException { // the XSL FO file File xsltFile = new File(RESOURCES_DIR + "//template.xsl"); // the XML file which provides the input StreamSource xmlSource = new StreamSource(new File(RESOURCES_DIR + "//data.xml")); // create an instance of fop factory FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI()); // a user agent is needed for transformation FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); // Setup output OutputStream out; out = new java.io.FileOutputStream(OUTPUT_DIR + "//output.pdf"); try { // Construct fop with desired output format Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out); // Setup XSLT TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource(xsltFile)); // Resulting SAX events (the generated FO) must be piped through to // FOP Result res = new SAXResult(fop.getDefaultHandler()); // Start XSLT transformation and FOP processing // That's where the XML is first transformed to XSL-FO and then // PDF is created transformer.transform(xmlSource, res); } finally { out.close(); } } } 

G – 样本输出:output.pdf

在此处输入图像描述

你也可以在这里检查apache项目

BIRT有一个Eclipse GUI,可以让你从XML,DB,CSV等定义PDF。

您可能希望查看那些可以将PDF创建作为转换的XSL-FO库。 我会尝试找到一个链接。

试试xhtmlrenderer项目。 请参阅文章“ 使用Flying Saucer和iText生成有趣和利润的PDF ”。

您可以将XSL-Fo应用于XML并使用Java转换器对其进行转换:

 File xmlfile = new File(baseDir, xml); File xsltfile = new File(baseDir, xsl); File pdffile = new File(outDir, "ResultXMLPDF.pdf"); FopFactory fopFactory = FopFactory.newInstance(); FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); OutputStream out = new java.io.FileOutputStream(pdffile); out = new java.io.BufferedOutputStream(out); try { Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out); // Setup XSLT TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource(xsltfile)); transformer.setParameter("versionParam", "1.0"); Source src = new StreamSource(xmlfile); Result res = new SAXResult(fop.getDefaultHandler()); transformer.transform(src, res); } finally { out.close(); } System.out.println("Success!"); 

使用JasperReports。 您可以从数据库或XML中提取数据。 您可以导出多种格式:pdf,excel,html等…

即将推出,您可以使用带有可编辑字段的Adobe设计器创建静态PDF,然后创建匹配的XDP XML文档。

有两种方法可以做到这一点。

  • 首先,您可以创建一个普通的PDF,当回读时,它不会为您提供原始XML文件的层次结构。 在'Section 9.4.2 Parsing XML' 'iText in Action : Edition 2' 'Section 9.4.2 Parsing XML'中对此进行了非常精细的解释。

  • 其次,您可以创建一个标记的PDF,其中既包含XML的层次结构,也包含数据。 这使您可以回读PDF文件并从中创建XML文件(与原始XML文件完全匹配)。 这个概念也在'iText in Action : Edition 2' '15.2.3 Adding structure'中详细讨论。

根据您的要求,您可以使用上述任一方法。

XML,CSS,XHTML等构成了开放标准的“活生态系统”,而XSL-FO则是一个独立的标准。

……历史上,XSL-FO和XSLT是作为双胞胎兄弟创建的,但只有XSLT仍然是“活标准”,XSL-FO将大量DNA集中在专有(Adobe)标准中……现在已经过时了。

严格来说,XSL-FO是一种不会发展的“废弃方式”的一部分,它忽略了CSS,即在“活生态系统”中表达布局的“新方式”。

这不是Java问题

请参阅此答案,了解如何使用带有XML或XHTML的CSS页面