3

現在メモリ内文字列として保存されている XML ドキュメントがあり、それを PDF としてレンダリングしたいと考えています。つまり、PDF コンテンツは XML ドキュメントになります。メソッドによってレンダリングされる XML は汎用的です。複数の種類の XML ドキュメントが送信される可能性があります。

さまざまな Java ベースのフレームワークを使用して達成する方法を理解するのに少し苦労しています。

アパッチ FOP

このフレームワークでは、ドキュメント内の XML 要素を FOP エンティティに特定の変換する必要があるように見えます。問題のメソッドは一般的な XML を受け入れる必要があるため、このフレームワークは私の要件に合わないと思います。

iText

iText/Flying Saucer (org.xhtmlrenderer) の組み合わせを使用してドキュメントをレンダリングしようとしましたが、PDF をレンダリングしますが、コンテンツにはスペースで区切られたデータ値のみが含まれ、xml 要素や属性は含まれません。以下のコードとテストデータを使用します。

ファイル

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <elem1>value1</elem1>
  <elem2>value2</elem2>
</root>

コード

File inputFile = new File(PdfGenerator.class.getResource("test.xml").getFile());
OutputStream os = new FileOutputStream("c:\\temp\\Sample.pdf");
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(inputFile);
renderer.layout();
renderer.createPDF(os);
os.close();  

content 値を含むvalue1 value2がタグを含まない PDF が生成されます。

私の質問は 、誰かが上記のフレームワークのいずれかを使用して XML コンテンツを含む PDF をレンダリングするためのコード スニペットを提供できるか、それとも私のニーズにより適した別のフレームワークがあるかということです。

編集: 同じ質問がここで尋ねられたことは理解していますが、提示された解決策には、css ファイル内の着信 XML ドキュメントの構造に関する詳細な知識が必要なようです。

4

3 に答える 3

3

fopを使用した例を示すためだけに、ここにあります。誰もがこれに従うことができるように、私はfopコマンドラインツールを使用しています。

同じことをJavaコード内で簡単に実行できるため、いつでもxmlをファイルとして保持する必要はありません。

PDFを生成するXSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:template match="/">
<fo:root>
  <fo:layout-master-set>
    <fo:simple-page-master master-name="content"
        page-width="210mm" page-height="297mm" margin="20mm 20mm 20mm 20mm">
      <fo:region-body/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="content">
    <fo:flow flow-name="xsl-region-body">
      <fo:block>
        <xsl:apply-templates />
    </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>
</xsl:template>

<xsl:template match="@*">
  <xsl:text> </xsl:text>
  <xsl:value-of select="name()" />
  <xsl:text>="</xsl:text>
    <xsl:value-of select="." />
  <xsl:text>"</xsl:text>
</xsl:template>

<xsl:template match="*">
  <xsl:param name="indent">0</xsl:param>
  <fo:block margin-left="{$indent}">
    <xsl:text>&lt;</xsl:text>
    <xsl:value-of select="name()" />
    <xsl:apply-templates select="@*" />
    <xsl:text>&gt;</xsl:text>
    <xsl:apply-templates>
      <xsl:with-param name="indent" select="$indent+10" />
    </xsl:apply-templates>
    <xsl:text>&lt;/</xsl:text>
    <xsl:value-of select="name()" />
    <xsl:text>&gt;</xsl:text>
  </fo:block>
</xsl:template>

</xsl:stylesheet>

このファイルをxml2pdf.xslと呼びます

コードの簡単な説明

  • テンプレートmatch="/"は、他のテンプレート一致メソッドを呼び出す行、またはより正確にはテンプレート一致= "*"を呼び出す行を除いて、主にpdfを作成します。

  • template match = " "は、要素の開始と終了を書き込み、要素の各属性(存在する場合)に対してテンプレートmatch="@"を呼び出します。最後にそれは

  • with-paramステートメントのselect="$ indent + 10"属性を使用して、テンプレートが到達するレベルごとに、インデントパラメーターが10ずつ増加します。

コードを使用する

# fop -xsl xml2pdf.xsl -xml sample.xml -pdf result.pdf
于 2013-01-17T13:05:51.453 に答える
2

グーグルで検索してみてください。多数のコード スニペットがあります。例: http://www.vogella.com/articles/JavaPDF/article.html

FOP よりも iText をお勧めします。iText の方が高速で、メモリの消費が少なく、結果をより細かく制御できます。

于 2013-01-16T15:11:20.153 に答える