0

Adobe の PDF/A に関する ISO 32000 仕様では、XFA データを PDF/A-2 確認 PDF の特別な場所に保存できると規定されています。その節の本文はこちら。

PDF/A-2 準拠ファイルへの XFA データセットの組み込み PDF/A-2 準拠ファイルをサポートするために、ExtensionLevel 3 は、XFAResources 名前ツリーを介して XML フォーム データ (XFA データセット) のサポートを追加します。ドキュメントカタログ。

(23 ページの「表 3.28 名前辞書のエントリ」を参照してください。) Acrobat フォーム (およびフォーム データ) は PDF/A-2 準拠ファイルで許可されていますが、XML フォームは許可されていません。このような XML フォームは、インタラクティブ フォーム ディクショナリから参照される XDP ストリームとして指定されます。XDP ストリームには、XFA データセットを含めることができます。

PDF ドキュメントを PDF/A-2 に変換するアプリケーションの場合、XFAResources ネーム ツリーは、PDF ドキュメント内の XDP ストリームから XFAResources ネーム ツリーへの XML フォーム データの再配置をサポートします

XFAResourcesネーム ツリーは、文字列名とストリームへの間接参照で構成されます文字列名は、ドキュメントが PDF/A-2 準拠のファイルに変換されるときに作成されます。ストリームには、要素で構成される XFA の要素が含まれます。

XML フォーム フィールドのデータ値に加えて、この要素を使用すると、フォーム フィールドにバインドされていないデータや 1 つ以上の XML 署名など、他のワークフローに役立つ可能性のある他の種類の情報を保存および取得できます。

参考文献の XML アーキテクチャ、XML Forms Architecture (XFA) 仕様、バージョン 2.6 を参照してください。

xml を渡す XFA フォームがあり、そのドキュメントを PDF/A-2 に変換する必要があります。

現在、これが可能かどうかを確認するために XFA Worker をテストしていますが、これを実行する XFA Worker のサンプルを見つけることができませんでした。

最初に XFA Worker でフラット化を試みましたが、データが完全に削除され、抽出できなくなりました。

Adobe が XFA Worker を使用して配置するように指示している場所に、XFA xml データをどのように取得しますか?

更新: ブルーノに感謝します。私のコードでは、XFA フォームを PDF/A-2 に変換できません。これが私が使用したコードです。

    xfa.fillXfaForm(new ByteArrayInputStream(xmlSchemaStream.toByteArray()));

    stamper.close();
    reader.close();

    try (ByteArrayOutputStream outputStreamDest = new ByteArrayOutputStream()) {
        PdfReader pdfAReader = new PdfReader(output.toByteArray());

        PdfAStamper pdfAStamper = new PdfAStamper(pdfAReader, outputStreamDest, PdfAConformanceLevel.PDF_A_2A);
....

com.itextpdf.text.pdf.PdfAConformanceException: Only PDF/A documents can be open in PdfAStamper というエラーが表示されます。

したがって、新しい PdfAStamper はコンバーターではなく、XFA PDF のバイト配列を読み取るだけであると想定しています。

4

1 に答える 1

0

父親としてのアドバイスから始めさせてください。XFA は ISO-32000-2 (PDF 2.0) で廃止される予定です。XFA ドキュメントを PDF/A ドキュメントに変換していることは素晴らしいことです。しかし、なぜ PDF/A-2 を選択するのでしょうか? PDF/A-3 は、1 つの例外を除いて PDF/A-2 と同じです。PDF/A-3 では、XML ファイルを埋め込むことができます。添付された XML と PDF の間の関係を示すこともできます。PDF/A-3 ファイルを作成し、元のデータ (XFA ファイルではなく) を添付ファイルとして添付する方が賢明ではないでしょうか?

この父親の忠告を無視するとしたら、何ができるでしょうか?

ISO-19005-2 (および -3) の附属書 D は、ドキュメント カタログのNamesディクショナリにエントリを追加する必要があることを示しています。残念ながら、iText 5 では、ファイルの作成中にこの名前辞書に独自のエントリを追加することはできないため、ドキュメントを後処理する必要があります。

にファイルがあると仮定すると、次のようにエントリとエントリのエントリfilePathを取得できます。CatalogNamesCatalog

PdfReader reader = new PdfReader(filePath);
PdfDictionary catalog = reader.getCatalog();
PdfDictionary names = catalog.getAsDict(PdfName.NAMES);

このnamesディクショナリにエントリを追加できます。例: カスタム エントリとしてコンテンツを含むストリームを追加しsome bytesたい場合、次のコードを使用します。

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    PdfDictionary catalog = reader.getCatalog();
    PdfDictionary names = catalog.getAsDict(PdfName.NAMES);
    if (names == null) {
        names = new PdfDictionary();
    }
    PdfStream stream = new PdfStream("Some bytes".getBytes());
    PdfIndirectObject objref = stamper.getWriter().addToBody(stream);
    names.put(new PdfName("ITXT_Custom"), objref.getIndirectReference());
    catalog.put(PdfName.NAMES, names);
    stamper.close();
    reader.close();
}

結果は次のようになります。

ここに画像の説明を入力

あなたの場合、という名前のエントリは望ましくありませんITXT_Custom。というエントリを追加するXFAResources必要があり、そのエントリの値は、文字列名とストリームへの間接参照で構成される名前ツリーである必要があります。これを実現するために私の例を適応させるのはかなり簡単なはずです。

注: Stack Overflow で私が提供するすべてのコードは、 Stack Exchange Network Terms of Service で定義されているCC-BY-SA の下で使用できます。CC-BY-SA が気に入らない場合は、iText で使用されているのと同じライセンス、より具体的にはAGPLの下でこのコードも提供します。

于 2016-11-04T06:55:43.763 に答える