我正在使用 fop 来生成 pdf 输出,我对此很陌生。经过长时间的工作,我遇到了一个问题:
com.sun.org.apache.xalan.internal.xsltc.compiler.CompilerException:输入文档不是样式表(XSL 命名空间未在根元素中声明)。
有我的 xsl 文件:
<?xml version="1.0"?>
<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="root">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page">
<fo:region-body margin="1in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<!-- LOGO
<fo:block>
</fo:block>
-->
<!-- TEXT -->
<fo:block text-align="justify">
<xsl:value-of select="text" />
</fo:block>
<!-- TABLES -->
<xsl:for-each select="./table">
<fo:block>
<fo:block font-weight="bold"> <!-- Add some adjustment -->
<xsl:value-of select="@name" />
</fo:block>
<table> <!-- Add some border -->
<fo:table-body> <!-- Add some adjustment -->
<fo:table-row>
<xsl:for-each select="./header/cell">
<fo:table-cell>
<fo:block font-weight="bold"> <!-- Add some adjustment and extra border -->
<xsl:value-of select="." />
</fo:block>
</fo:table-cell>
</xsl:for-each>
</fo:table-row>
<xsl:for-each select="./row">
<fo:table-row>
<xsl:for-each select="./cell">
<fo:table-cell>
<fo:block> <!-- Add some adjustment -->
<xsl:value-of select="." />
</fo:block>
</fo:table-cell>
</xsl:for-each>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</table>
</fo:block>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
并且触发了打印文件的Java部分
private void convertToPDF(File xsl, File pdf) throws IOException,
FOPException, TransformerException {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
OutputStream out = new BufferedOutputStream(new FileOutputStream(pdf));
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent,
out);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(
xsl));
Source src = prepareSource();
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
transformer.transform(src, res);
} finally {
out.close();
}
}
赋予此方法的参数 xsl 是从我的项目资源中挑选的文件,我确信这是一个好文件(打印出来)。
我的 xml 源代码是在 java 中动态生成的。如果需要这些文件,那么我将编辑这篇文章并将它们放在那里。
我一直在尝试编辑我的 xsl 文件,对其进行简化,但没有任何效果。
对于编译,我使用带有 Spring Tool Suite 扩展的 Eclipse。
你能帮我吗?
另外,你能告诉我如何在我的 pdf 输出中放置图像吗?