如何解决Apache fop、XSL FO、jdom2:生成带有动态页眉/页脚的 pdf
我从 java 对象生成一个 .pdf,我想将值从 java 对象传递到 .xsl 中的页眉/页脚。 这是我的 .xsl 的一部分:
<fo:page-sequence master-reference="content">
<fo:static-content flow-name="Header">
<fo:table border-collapse="collapse" font-size="8pt">
<fo:table-body>
<fo:table-row>
<fo:table-cell border="0.5pt solid black" overflow="hidden" > Œ
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
supplier’s name: <xsl:value-of select="@name" />
</fo:block>
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
supplier’s code: <xsl:param name="supplierCodeLol" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:static-content flow-name="Footer">
<fo:table border-collapse="collapse" font-size="8pt">
<fo:table-body>
<fo:table-row>
<fo:table-cell border="0.5pt solid black" overflow="hidden" >
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
Export requestor: <xsl:param name="exportRequestor" />
</fo:block>
</fo:table-cell>
<fo:table-cell border="0.5pt solid black" overflow="hidden">
<fo:block></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="10pt">
<xsl:for-each select="block">
<xsl:call-template name="block-template" select="."></xsl:call-template>
</xsl:for-each>
</fo:block>
<fo:block id="theEnd" />
</fo:flow>
</fo:page-sequence>
我在哪里创建 .pdf:
public void convertToPDF(String xml,String fileName) throws IOException,FOPException,TransformerException {
ClassLoader classLoader = getClass().getClassLoader();
File xsltFile = new File(classLoader.getResource("template/xml/xsl_test.xsl").getFile());
StreamSource xmlSource;
if (xml == null) {
xmlSource = new StreamSource(new File(classLoader.getResource("template/xml/xml_test.xml").getFile()));
} else {
xmlSource = new StreamSource(new ByteArrayInputStream(xml.getBytes()));
}
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
OutputStream out;
out = new java.io.FileOutputStream(fileName);
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,foUserAgent,out);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltFile));
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(xmlSource,res);
} finally {
out.close();
}
}
这是我用 java 对象(标题部分)创建和填充 .pdf 的地方:
public String exportPlanetoPdfa(PLANE plane,UserBean user,String fileName) {
Pdfhelper pdfhelper = new Pdfhelper();
Document doc = new Document(toXmlElement(plane,userName));
XMLOutputter outter = new XMLOutputter(Format.getPrettyFormat());
String xml = outter.outputString(doc);
pdfhelper.convertToPDF(xml,"/" + fileName);
return fileName;
}
private Element toXmlElement(PlaneBean plane,String userName) {
Element planeRoot = new Element(XmlHelper.PLANE);
XmlHelper.addAllContents(planeRoot,toHeaderXmlElement(plane));
return planeRoot;
}
private Element toHeaderXmlElement(PlaneBean plane) {
Element header = new Element(XmlHelper.BLOCK);
header.setAttribute(XmlHelper.NAME,"Equipment");
Element row = new Element(XmlHelper.ROW);
XmlHelper.addAllContents(row,XmlHelper.newFieldElement("supplier's name",plane.name),XmlHelper.newFieldElement("supplier's code",plane.code)));
XmlHelper.addAllContents(header,row);
return header;
}
创建一个块并显示它有效,但我不知道如何将块的值传递给标题。 我搜索了 xsl:value-of/param 但我不知道这是否是这样做的方法。非常感谢您的帮助!
编辑: 我找到了答案here
解决方法
让你开始。
您可以将 xsl:param name="someName"
声明为 xsl:stylesheet
的子项。然后将其用作全局变量 xsl:value-of select="$someName"
即像这样:
<xsl:stylesheet version="1.0"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="supplierCodeLol" />
<xsl:param name="exportRequestor" />
<xsl:template match="/">
<fo:page-sequence master-reference="content">
<fo:static-content flow-name="Header">
<fo:table border-collapse="collapse" font-size="8pt">
<fo:table-body>
<fo:table-row>
<fo:table-cell border="0.5pt solid black" overflow="hidden" > Œ
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
Supplier’s name: <xsl:value-of select="@name" />
</fo:block>
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
Supplier’s code: <xsl:value-of select="$supplierCodeLol" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:static-content flow-name="Footer">
<fo:table border-collapse="collapse" font-size="8pt">
<fo:table-body>
<fo:table-row>
<fo:table-cell border="0.5pt solid black" overflow="hidden" >
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
Export requestor: <xsl:value-of select="$exportRequestor" />
</fo:block>
</fo:table-cell>
<fo:table-cell border="0.5pt solid black" overflow="hidden">
<fo:block></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="10pt">
<xsl:apply-templates select="block"/>
</fo:block>
<fo:block id="theEnd" />
</fo:flow>
</fo:page-sequence>
</xsl:template>
<xsl:template match="block">
<!-- Do something with the block -->
</xsl:template>
</xsl:stylesheet>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。