如何在Java中使用XML创建PDF?
目前,我正在用Java创建一个XML文件,并通过使用XSL / XSLT转换它在JSP页面中显示它。 现在我需要获取该XML文件并在PDF中显示相同的信息。 有没有办法通过使用某种XSL文件来做到这一点?
我见过iText Java-PDF库,但我找不到任何方法可以将它与XML和样式表一起使用。
任何援助将不胜感激。 提前致谢!
您可以使用XSL格式化对象。 这里有一些关于如何做的好文章:
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页面 。