我有一个 XML 文档,当前存储为内存字符串,并且希望将其呈现为 PDF。换句话说,PDF 内容将是 XML 文档。该方法呈现的 XML 是通用的——可能会发送多种类型的 XML 文档。
我在弄清楚如何使用各种基于 Java 的框架来完成任务时遇到了一些困难。
阿帕奇FOP
该框架似乎需要将文档中的 XML 元素特定转换为 FOP 实体。由于问题中的方法必须接受通用 XML,因此我认为这个框架不符合我的要求。
iText
我尝试使用 iText/Flying Saucer (org.xhtmlrenderer) 的组合来渲染文档,虽然它确实渲染了 PDF,但内容仅包含空格分隔的数据值,没有 xml 元素或属性。使用下面的代码和测试数据:
File
<?xml version="1.0" encoding="UTF-8"?>
<root>
<elem1>value1</elem1>
<elem2>value2</elem2>
</root>
Code
File inputFile = new File(PdfGenerator.class.getResource("test.xml").getFile());
OutputStream os = new FileOutputStream("c:\\temp\\Sample.pdf");
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(inputFile);
renderer.layout();
renderer.createPDF(os);
os.close();
生成包含内容值的 PDFvalue1 value2
,但没有标签。
我的问题是有人可以提供一个代码片段,用于使用上述框架之一呈现包含 XML 内容的 PDF,或者是否有其他框架更适合我的需求?
Edit:我意识到有人问了同样的问题here https://stackoverflow.com/questions/7634950/print-xml-in-pdf-using-itext?rq=1,但似乎提出的解决方案需要深入了解 css 文件中传入的 XML 文档的结构。
只是为了给出一个使用 fop 的例子 - 这里你已经有了。为了让每个人都能遵循这一点,我使用了 fop 命令行工具。
可以在 Java 代码中轻松执行相同的操作,然后您无需随时将 xml 作为文件。
生成 PDF 的 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="content"
page-width="210mm" page-height="297mm" margin="20mm 20mm 20mm 20mm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="content">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates />
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="@*">
<xsl:text> </xsl:text>
<xsl:value-of select="name()" />
<xsl:text>="</xsl:text>
<xsl:value-of select="." />
<xsl:text>"</xsl:text>
</xsl:template>
<xsl:template match="*">
<xsl:param name="indent">0</xsl:param>
<fo:block margin-left="{$indent}">
<xsl:text><</xsl:text>
<xsl:value-of select="name()" />
<xsl:apply-templates select="@*" />
<xsl:text>></xsl:text>
<xsl:apply-templates>
<xsl:with-param name="indent" select="$indent+10" />
</xsl:apply-templates>
<xsl:text></</xsl:text>
<xsl:value-of select="name()" />
<xsl:text>></xsl:text>
</fo:block>
</xsl:template>
</xsl:stylesheet>
我们将此文件称为 xml2pdf.xsl
代码的简短解释
模板 match="/" 主要构建 pdf,除了调用其他模板匹配方法或更精确的模板 match="*" 的行之外。
模板匹配=“" 写入元素开始和结束并调用,进而调用模板 match="@“对于元素中的每个属性(如果有)。最后它调用
通过 with-param 语句中的 select="$indent+10" 属性,模板每达到一个级别,缩进参数就会增加 10。
使用代码
# fop -xsl xml2pdf.xsl -xml sample.xml -pdf result.pdf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)