Xml 在承载在j2ee容器上的web应用程序中通过XSLT创建pdf
以下是设置: 托管在jboss上的web应用程序可以是任何其他容器。 用户使用浏览器从web应用程序查询后端的各种报告。报告将显示在屏幕上。供应商提供了将报告结果保存为csv、xml和html的选项。这是通过使用xsl转换完成的 当用户单击Save to csv(保存到csv)时,会调用一个js脚本,将屏幕上的报告数据发送到xsl,转换完成后,会提示用户保存生成的文件(或在与文件类型关联的任何应用程序中打开) 请注意,以上所有操作都是动态完成的。有些代码隐藏已关闭,但XSL可供修改 现在,我需要扩展web应用程序,使用通过js传递的查询数据,基于自定义模板生成pdf 我想我可以使用html转换作为转换为pdf的基础。xsl for html转换如下所示:Xml 在承载在j2ee容器上的web应用程序中通过XSLT创建pdf,xml,xslt,servlets,pdf,jboss,Xml,Xslt,Servlets,Pdf,Jboss,以下是设置: 托管在jboss上的web应用程序可以是任何其他容器。 用户使用浏览器从web应用程序查询后端的各种报告。报告将显示在屏幕上。供应商提供了将报告结果保存为csv、xml和html的选项。这是通过使用xsl转换完成的 当用户单击Save to csv(保存到csv)时,会调用一个js脚本,将屏幕上的报告数据发送到xsl,转换完成后,会提示用户保存生成的文件(或在与文件类型关联的任何应用程序中打开) 请注意,以上所有操作都是动态完成的。有些代码隐藏已关闭,但XSL可供修改 现在,我需要
<?xml version="1.0"?>
;
此操作不涉及任何物理文件
我的问题是,如何扩展上面的xsl以将生成的html打印成pdf?在这一点上,我不得不承认我甚至不知道如何从代码中访问生成的数据,因为我是xslt的新手,也不知道如何在运行时调试xsl
如果这是可能的,那么我想我可以将结果数据传递给或
无论哪种方式,都不应该在服务器端创建物理文件。输出应发送给用户以打开或保存
我遇到过许多其他工具和转换器,如JODConverter、docx4j等
如果我能弄清楚如何在现有框架内将所有内容组合在一起就好了
仍然存在使用自定义模板的问题(可能是使用word创建的),但这将是第2阶段。我只想先打印成pdf格式
<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>