Xml 在承载在j2ee容器上的web应用程序中通过XSLT创建pdf

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可供修改 现在,我需要

以下是设置:

托管在jboss上的web应用程序可以是任何其他容器。 用户使用浏览器从web应用程序查询后端的各种报告。报告将显示在屏幕上。供应商提供了将报告结果保存为csv、xml和html的选项。这是通过使用xsl转换完成的

当用户单击Save to csv(保存到csv)时,会调用一个js脚本,将屏幕上的报告数据发送到xsl,转换完成后,会提示用户保存生成的文件(或在与文件类型关联的任何应用程序中打开)

请注意,以上所有操作都是动态完成的。有些代码隐藏已关闭,但XSL可供修改

现在,我需要扩展web应用程序,使用通过js传递的查询数据,基于自定义模板生成pdf

我想我可以使用html转换作为转换为pdf的基础。xsl for html转换如下所示:

<?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>&#xa;</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>