这是设置:
托管在 jboss 上的 Web 应用程序可以是任何其他容器。从 Web 应用程序中,用户使用浏览器查询各种报告的后端。报告显示在屏幕上。供应商提供了将报告结果保存为 csv、xml 和 html 的选项。这是通过使用 xsl 转换来完成的。
当用户单击 Save to csv 时,会调用一个 js 脚本,将屏幕上的报告数据发送到 xsl,一旦转换完成,系统会提示用户保存生成的文件(或在与文件类型关联的任何应用程序)
请注意,以上所有内容都是即时完成的。后面的一些代码已关闭,但 xsls 可用于修改。
现在,我需要扩展 Web 应用程序以使用通过 js 传递的查询数据基于自定义模板生成 pdf。
我在想我可以使用 html 转换作为转换为 pdf 的基础。用于 html 转换的 xsl 如下所示:
<?xml version="1.0"?>
<xsl:template match="/">
<html>
<body topmargin="2" leftmargin="2">
<title>
<xsl:value-of select="/responseDetails/window/panes/pane/dataSection/enqResponse/title" />
</title>
<TABLE cellSpacing="0" cellPadding="0">
<table>
<xsl:choose>
<!-- Process each report page data -->
<xsl:when test="/responseDetails/window/panes/pane/dataSection/enqResponse/pageData !=''">
<xsl:for-each select="/responseDetails/window/panes/pane/dataSection/enqResponse/pageData">
<xsl:call-template name="Header"/>
<xsl:call-template name="ColumnHeaders"/>
<xsl:call-template name="Datam"/>
<xsl:call-template name="Footer"/>
</xsl:for-each>
</xsl:when>
<!-- Process report data -->
<xsl:otherwise>
<xsl:call-template name="Header"/>
<xsl:call-template name="ColumnHeaders"/>
<xsl:call-template name="Datam"/>
<xsl:call-template name="Footer"/>
</xsl:otherwise>
</xsl:choose>
</table>
</TABLE>
</body>
</html>
</xsl:template>
<!-- Template for Header which decides to extract header data page by page or whole -->
<xsl:template name="Header">
<xsl:choose>
<xsl:when test="/responseDetails/window/panes/pane/dataSection/enqResponse/pageData!=''">
<tr>
<xsl:for-each select="./header/r">
<xsl:call-template name="Headers"/>
</xsl:for-each>
</tr>
</xsl:when>
<xsl:otherwise>
<tr>
<xsl:for-each select="/responseDetails/window/panes/pane/dataSection/enqResponse/header/r">
<xsl:call-template name="Headers"/>
</xsl:for-each>
</tr>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Template for datam which decides to extract data page by page or whole -->
<xsl:template name="Datam">
<xsl:choose>
<xsl:when test="/responseDetails/window/panes/pane/dataSection/enqResponse/pageData!=''">
<xsl:for-each select="./r">
<xsl:call-template name="Data"/>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="/responseDetails/window/panes/pane/dataSection/enqResponse/r">
<xsl:call-template name="Data"/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Template for footer which decides to extract footer data page by page or whole -->
<xsl:template name="Footer">
<xsl:choose>
<xsl:when test="/responseDetails/window/panes/pane/dataSection/enqResponse/pageData!=''">
<xsl:for-each select="./footer">
<xsl:call-template name="Footers"/>
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Template for headers -->
<xsl:template name="Headers">
<tr>
<xsl:for-each select="c">
<xsl:choose>
<xsl:when test="cap != '' ">
<td>
<b>
<font color="#FF8400">
<xsl:value-of select="cap"/>
</font>
</b>
</td>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="class!=''">
<td>
<b>
<font color="#FF8400">
<xsl:value-of select="cap" />
</font>
</b>
</td>
</xsl:when>
<xsl:otherwise>
<td>
<b>
<font color="#FF8400">
<xsl:value-of select="." />
</font>
</b>
</td>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</tr>
</xsl:template>
<!-- Template for column headers -->
<xsl:template name="ColumnHeaders">
<tr>
<xsl:for-each select="/responseDetails/window/panes/pane/dataSection/enqResponse/cols">
<xsl:for-each select="c">
<td>
<b>
<font color="#FF8400">
<xsl:value-of select="." />
</font>
</b>
</td>
</xsl:for-each>
</xsl:for-each>
</tr>
</xsl:template>
<!-- Template for data -->
<xsl:template name="Data">
<xsl:choose>
<xsl:when test="position() mod 2 = 0">
<td>
<tr>
<xsl:for-each select="c">
<td bgColor="white">
<xsl:value-of select="cap" />
</td>
</xsl:for-each>
</tr>
</td>
</xsl:when>
<xsl:otherwise>
<td>
<tr>
<xsl:for-each select="c">
<td bgColor="#eeeeee">
<xsl:value-of select="cap" />
</td>
</xsl:for-each>
</tr>
</td>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Template for footers -->
<xsl:template name="Footers">
<tr>
<xsl:for-each select="r">
<tr>
<xsl:for-each select="c">
<xsl:choose>
<xsl:when test="cap != '' ">
<td>
<b>
<font color="#FF8400">
<xsl:value-of select="cap"/>
</font>
</b>
</td>
</xsl:when>
<xsl:otherwise>
<td>
<b>
<font color="#FF8400">
<xsl:value-of select="." />
</font>
</b>
</td>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</tr>
</xsl:for-each>
</tr>
</xsl:template>
不涉及物理文件。
我的问题是,如何扩展上面的 xsl 以将生成的 html 打印成 pdf?在这一点上,我不得不承认我什至不知道如何从代码中访问结果数据,因为我是 xslt 的新手,而且我不知道如何在运行时调试 xsl。
如果这是可能的,那么我想我可以将结果数据传递给iText或Apache FOP 处理器
无论哪种方式,都不应在服务器端创建任何物理文件。输出应发送给用户以打开或保存。
我遇到过许多其他工具和转换器,例如XDocReport、JODConverter、docx4j 等。
如果我能弄清楚如何在现有框架内将它们放在一起就好了!
仍然存在使用自定义模板(可能使用 word 创建)的问题,但这将是第 2 阶段。我只想先打印到 pdf