これはセットアップです:
jboss でホストされる Web アプリケーションは、他のコンテナである可能性があります。Web アプリからブラウザーを使用して、ユーザーはバックエンドにさまざまなレポートを照会します。レポートが画面に表示されます。ベンダーは、レポート結果を csv、xml、および html に保存するオプションを提供しています。これは、xsl 変換を使用して行われます。
ユーザーが [csv に保存] をクリックすると、画面上のレポート データを xsl に送信する js スクリプトが呼び出され、変換が完了すると、ユーザーは生成されたファイルを保存する (またはそれをファイルの種類に関連付けられているアプリ)
上記はすべてオンザフライで行われることに注意してください。一部のコード ビハインドはクローズされていますが、xsl は変更可能です。
ここで、js 経由で渡されるクエリ データを使用して、カスタム テンプレートに基づいて pdf を生成するように Web アプリを拡張する必要があります。
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 など、他の多くのツールやコンバーターに出くわしました。
既存のフレームワーク内ですべてをまとめる方法を理解できれば!
カスタム テンプレート (おそらくワードを使用して作成) を使用するという問題はまだありますが、それはフェーズ 2 になります。最初に PDF に印刷したいだけです。