3

这是设置:

托管在 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>&#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>

不涉及物理文件。

我的问题是,如何扩展上面的 xsl 以将生成的 html 打印成 pdf?在这一点上,我不得不承认我什至不知道如何从代码中访问结果数据,因为我是 xslt 的新手,而且我不知道如何在运行时调试 xsl。

如果这是可能的,那么我想我可以将结果数据传递给iTextApache FOP 处理器

无论哪种方式,都不应在服务器端创建任何物理文件。输出应发送给用户以打开或保存。

我遇到过许多其他工具和转换器,例如XDocReport、JODConverter、docx4j 等。

如果我能弄清楚如何在现有框架内将它们放在一起就好了!

仍然存在使用自定义模板(可能使用 word 创建)的问题,但这将是第 2 阶段。我只想先打印到 pdf

4

0 回答 0