itext7研究ノート-第7章

序文

    第1章から第4章では、iText7を使用してPDFドキュメントを作成しました。第5章から第6章では、既存のPDFドキュメントを操作して再利用しました。これらの章で操作するPDFドキュメントはすべて、PDFファイルのコア標準であるISO32000仕様に準拠しています。PDFのISO標準はISO32000だけではありません。特定の理由で、多くの下位標準が作成されています。この章では、次の2つに焦点を当てます。

  • ISO 14289、PDF / UAとも呼ばれます。UAはユニバーサルアクセシビリティを意味します。視覚障害のある人や目の見えない人も含め、誰でもPDF / UA標準を使用するPDFドキュメントを表示できます(私の神、それはとても素晴らしいですか?)
  • ISO 19005、PDF / Aとも呼ばれます。Aはアーカイブを意味します。目標は、デジタルドキュメントの長期保存です。

    この章では、一連のPDF / AおよびPDF // UAファイルを作成することにより、PDF / AおよびPDF / UAについて学習します。

PDF / UAドキュメントを作成する

    PDF / UAの例を始める前に、解決したい問題を見てみましょう。第1章では、写真付きのドキュメントを作成しました。「クイックブラウンフォックスが怠惰な犬を飛び越える」という文で、「dag」と「fox」を対応する写真に置き換えます。このファイルを読み取ると当時、マシンは最初の画像のコードがキツネであり、2番目の画像が犬を表していることを認識できないため、このファイルは「クイックブラウンが怠惰なものを飛び越える」と見なされます。

通常のPDFでは、コンテンツはキャンバスに描画されます。Listなどの高度なオブジェクトを使用する場合がありますTableが、PDFが作成されると、これらのオブジェクトは保存されません。1つListは一連の行で構成されていますが、list要素のテキストフラグメントは、それがリストの一部であることを認識していません。1つはTable、特定の場所にあるテキストのグループで構成されます。同様に、テキストフラグメントは、特定の行と列に属していることを認識しません。

    PDFをタグ付きPDFに変換しない限り、ドキュメントには意味構造が含まれません。ドキュメントがセマンティック構造で保存されていない場合、PDFにアクセスできない(アクセスできない)と言います。認識可能/理解可能であるために、このドキュメントは、ページのどの部分が実際のコンテンツであり、どの部分が実際のコンテンツではないか(ヘッダー、ページ番号など)を区別できる必要があります。テキスト行がparagraphその一部でない場合は、自分がtitle、もちろん他の要件もあります。すべての情報を1つの方法でページに追加できます。この方法では结构树(structure)、コンテンツを作成して定義します带标签的内容これは複雑に聞こえるかもしれませんが、iText7の高度なオブジェクトを使用するsetTagged()と、この目標を達成するために効率的使用できますラベル付きのドキュメントおよび導入後のベルト構造などのオブジェクト
    定義PdfDocumentすることにより、でタグ付けされたPDFに反映されます。     もちろん、これはPDF知覚の要件の1つにのみ当てはまります(アクセス可能です。どの翻訳が優れているかはわかりません。当面は知覚に変換するだけです)。次のコードは、他の要件を理解するのに役立ちます。ListTableParagraph

PdfDocument pdf =  new PdfDocument(new PdfWriter(dest, new WriterProperties().addXmpMetadata()));
Document document = new Document(pdf);
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
        new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/UA example");
//Fonts need to be embedded
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.WINANSI, true);
Paragraph p = new Paragraph();
p.setFont(font);
p.add(new Text("The quick brown "));
Image foxImage = new Image(ImageFactory.getImage(FOX));
//PDF/UA: Set alt text
foxImage.getAccessibilityProperties().setAlternateDescription("Fox");
p.add(foxImage);
p.add(" jumps over the lazy ");
Image dogImage = new Image(ImageFactory.getImage(DOG));
//PDF/UA: Set alt text
dogImage.getAccessibilityProperties().setAlternateDescription("Dog");
p.add(dogImage);
document.add(p);
document.close();

    作成PdfDocumentDocument、私たちが使用して、この時間は自動的にXMPメタデータを追加します。PDF / UAでは、同じメタデータをXML形式でPDFに保存する必要があります。XMLは圧縮されない場合があります。PDFコンテンツ形式に精通していないプロセッサ/処理プログラムは、このXMPメタデータを検出し、正しく処理できる必要があります。XMPデータストリームは、Infoディクショナリエントリに自動的に作成されます。この情報辞書はPDFオブジェクトであり、ドキュメントのタイトルなどのデータが含まれています。XMPデータストリームを追加することに加えて、PDF / UA標準に準拠させるために、次の操作も実行する必要があります。WriterPropertiesaddXmpMetadata()

  • これPdfDocumentをラベル付きとして設定します(4行目)
  • 言語指定子を追加します。この例では、ファイルは、このファイルで使用されている主な言語がアメリカ英語であることを認識しています(5行目)
  • ドキュメントのタイトルが常にPDFビューアのトップバーに表示されるようにビューアの設定を変更します
    (6〜7行目)。次に、タイトルをドキュメントのメタデータに配置します(8〜9行目)。
  • すべてのフォントを埋め込む必要があります(11行目)。実際、フォントには他にもいくつかの要件がありますが、それらについて説明するには時期尚早です。
  • すべてのコンテンツにタグを付ける必要があります。写真に出会ったときは、別の写真テキストを使用して写真の説明を提供する必要があります(17行目と22行目)

    これで、PDF / UAの作成作業が完了しました。結果を次の2つの図1と2に示します。前の図との違いはあまり明白ではないかもしれませんが、タグページを開くと(Adobe Acrobat Proを使用する必要があり、Adobe Acrobat Reader DCは機能しません):

itext7-1

図1.PDF / UAドキュメントとその構造

itext7-2

図2.ctrl + dドキュメントのプロパティ

タグにはタグがあり、タグは2つと2つ構成されて<Document>いる    ことがわかり<P>ますこの章の後半で、より複雑なPDF / UAドキュメントを作成します。次に、PDF / Aの作成方法を見てみましょう。<P><Span><Figures>

PDF / Aドキュメントの作成PDF / A-1

    ISO19005のパート1は2005年にリリースされました。これは、公式のAdobe PDF 1.4ステートメントで定義されています(このステートメントは、当時ISO標準ではありませんでした)。SO 19005-1は、一連の義務と制限を導入しました。

  • ドキュメントのすべてのリソースと情報は、それ自体で保存する必要があります。すべてのフォントを埋め込む必要があります。拡張アニメーション、ビデオ、サウンド、およびその他のバイナリファイルは許可されていません。
  • ドキュメントはメタデータをXMP(eXensible Metadata Platform)形式で保存する必要があります:ISO 16684(XMP)は、メタデータをXML形式でバイナリファイルに保存する方法を説明しているため、バイナリファイルの読み取りと解釈の方法を知らないソフトウェアは引き続き使用できますファイルのメタデータを抽出できます。
  • 一部の将来の(高度な、宣言されていない、または将来追加されない)機能は許可されていません:PDFにJavaScriptを含めることはできず、暗号化することもできません

    SO 19005-1:2005(PDF / A-1)は、次の2つのコンプライアンスレベルを定義しています。

  • レベルB(「基本」):長期保存ファイルの視覚的な外観を保証します。
  • レベルA(「アクセス可能」):長期保存ファイルの外観を保証するだけでなく、構造的および意味的な機能も導入します。このPDFはタグ付きPDFである必要があります。(PDF / UAに似ていますが、異なることに注意してください。理由は次の例で説明します)

    次のコードは、以前に作成した「クイックブラウンフォックス」PDFをPDF / A-1b標準に準拠させる方法を示しています。

//Initialize PDFA document with output intent
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
    PdfAConformanceLevel.PDF_A_1B,
    new PdfOutputIntent("Custom", "", "http://www.color.org",
            "sRGB IEC61966-2.1", new FileInputStream(INTENT)));
Document document = new Document(pdf);
//Fonts need to be embedded
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.WINANSI, true);
Paragraph p = new Paragraph();
p.setFont(font);
p.add(new Text("The quick brown "));
Image foxImage = new Image(ImageFactory.getImage(FOX));
p.add(foxImage);
p.add(" jumps over the lazy ");
Image dogImage = new Image(ImageFactory.getImage(DOG));
p.add(dogImage);
document.add(p);
document.close();

PdfDocumentインスタンスを使用しなく    なり、代わりにPdfADocumentインスタンスを使用していることがわかります。まず、PdfADocumentインスタンスを作成します。PdfADocumentインスタンスコンストラクター最初のパラメーターはPdfWriter1、2番目のパラメーターはコンプライアンスレベル(ここではPdfAConformanceLevel.PDF_A_1B)、3番目のパラメーターは1PdfOutpuyIntextです。この出力インテントは、ドキュメントに格納されているものを解釈する方法をドキュメントに指示します。色。10行目で、フォントが埋め込まれていることを確認します。

    生成されたPDFは次の図3のようになります。

itext7-3

図3.PDF / A-1B標準ドキュメント

    上の写真から、「このファイルはPDF / A標準に準拠しており、変更されないように読み取り専用モードで開かれています」という小さな青いバーが表示されます。この点で、私たちはこの文を2つの方法で解釈します。

  • この文は、このPDFが実際にPDF / A標準に準拠していることを意味するのではなく、準拠している可能性があることを示しているだけです。標準に準拠しているかどうかを確認するには、Adobe Acrobatで[標準]パネルを開き、[準拠を確認]をクリックする必要があります。リンク、Acrobatは、ドキュメントが記載されているものと同じであるかどうかを検証します。この例では、結果は「検証成功」です。このようにして、最終的にPDF / A-1B標準ドキュメントを作成します。
  • ドキュメントは読み取り専用モードで開かれていますが、変更が許可されていないためではありません(PDF / AはPDFの変更を保護できません)が、変更を加えるとPDFの変換が非準拠に変更される可能性があるため、AdobeAcrobatは読み取り専用モードで表示されます。 PDF /標準PDF。PDF / Aのステータスを破壊することなくPDF / Aを更新することができます。

    次に、PDF / A-1aの作成方法を見てみましょう。コードは次のとおりです。

//Initialize PDFA document with output intent
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
    PdfAConformanceLevel.PDF_A_1A,
    new PdfOutputIntent("Custom", "", "http://www.color.org",
            "sRGB IEC61966-2.1", new FileInputStream(INTENT)));
Document document = new Document(pdf);
//Setting some required parameters
pdf.setTagged();
//Fonts need to be embedded
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.WINANSI, true);
Paragraph p = new Paragraph();
p.setFont(font);
p.add(new Text("The quick brown "));
Image foxImage = new Image(ImageFactory.getImage(FOX));
//Set alt text
foxImage.getAccessibilityProperties().setAlternateDescription("Fox");
p.add(foxImage);
p.add(" jumps over the lazy ");
Image dogImage = new Image(ImageFactory.getImage(DOG));
//Set alt text
dogImage.getAccessibilityProperties().setAlternateDescription("Dog");
p.add(dogImage);
document.add(p);
document.close();

    コードを解釈してみましょう。3行目で、にPdfConformanceLevel.PDF_A1B変更しましたPdfConformanceLevel.PDF_A1A8行目で、これPdfADocumentをタグ付きPDFに変換し、画像のテキスト説明を追加します。最終結果を以下の図4に示します。

itext7-4

図4.PDF / A-1A標準ドキュメント

    標準パネルを開くと、Adobe AcrobatProがこのファイルをPDF / A-1AおよびPDF / UA-1と見なしていることがわかりますが、今回はコンプライアンスリンクを確認しなかったため、プリプレス検査ツール(英語版)を使用する必要があります。プリフライトです。めまいがします。中国語版を見つけるのに時間がかかりました。ここで共有します。誰もが中国語を使用していると推定されます。具体的な手順は次のとおりです。ツールでPDF標準を開く→プリプレス検査(または直接左側)下の図5に示すように、クリックしてプリプレス検査を開きます)→PDF / A仕様の下でPDF / A-1b仕様を見つけます→分析):

itext7-8

図5.コンプライアンス接続を表示および検証するための飛行前検査ツール

    引き続き英語版の写真を見て、エラーが見つからなかったことがわかります。PDF / UAには、ローカルコンピューターでは検証できない要件が含まれているため、PDF / UAへの準拠を検証できません。例:キツネの画像の説明を犬の画像の説明と交換すると、マシンは気づきません。これにより、ファイルがスクリーンリーダーに基づく人々に誤った情報を広めるため、ファイルにアクセスできなくなります。いずれにせよ、いくつかの基本的な要素(最初の例でも設定されている言語など)を省略しているため、作成したドキュメントがPDF / UA標準に準拠していないことを知っておく必要があります。

    当初から、ISO19005の認定部分が無効になることはないと判断されていました。新規および後続のセクションでは、新しい便利な機能のみを定義します。これらのフォローアップ定義は、これから紹介するPDF / A-2およびPDF / A-3です。

PDF / Aドキュメントの作成PDF / A-2およびPDF / A-3

    ISO 19005-2:2011(PDF / A-2)は、ISO標準(Adobeの公式PDFドキュメントではありません)に従ってPDF / A標準に追加されました。PDF / A-2には、PDF1.5および1.6.1.7で多くの機能と改善点があります。

  • 便利な追加機能は次のとおりです。JPEG2000サポート、コンテナ、オブジェクトレベルのXMP、およびオプションのコンテンツ
  • 便利な改善には、透明性、タイプアノテーション、アノテーション、およびデジタル署名のサポートの向上が含まれます。

    コンプライアンスに関しては、元のレベルAとレベルBに加えて、PDF / A-2は追加のレベルも定義しています。

  • レベルU(「ユニコード」):ドキュメントの視覚的な外国貿易を長期間保存できること、およびすべてのテキストの保存形式がユニコードであることを確認します。

    ISO 19005-3:2012(PDF / A-3)は、PDF / A-2とほぼ同じです。唯一の違いは、PDF / A-3では、添付ファイルがPDF / A形式である必要はないということです。任意のファイル形式をPFA / A-3の添付ファイルと見なすことができます。たとえば、ドキュメントの結果としてエクセル形式のファイルを処理したり、PDFドキュメントを作成するためのワード形式のファイルを処理したりできます。ドキュメント自体は、PDF / A仕様のすべての義務と制限に準拠する必要がありますが、これらの義務と制限はその添付ファイルには適用されません。

    次の例では、PDF / UA標準とPDF / A-3A標準の両方を作成します。PDF/ A-3を選択する理由は、CSVファイルを使用してPDFを作成する必要があるためです。コードは次のとおりです。

 PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
    PdfAConformanceLevel.PDF_A_3A,
    new PdfOutputIntent("Custom", "", "http://www.color.org",
            "sRGB IEC61966-2.1", new FileInputStream(INTENT)));
Document document = new Document(pdf, PageSize.A4.rotate());
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
        new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/A-3 example");
//Add attachment
PdfDictionary parameters = new PdfDictionary();
parameters.put(PdfName.ModDate, new PdfDate().getPdfObject());
PdfFileSpec fileSpec = PdfFileSpec.createEmbeddedFileSpec(
    pdf, Files.readAllBytes(Paths.get(DATA)), "united_states.csv",
    "united_states.csv", new PdfName("text/csv"), parameters,
    PdfName.Data, false);
fileSpec.put(new PdfName("AFRelationship"), new PdfName("Data"));
pdf.addFileAttachment("united_states.csv", fileSpec);
PdfArray array = new PdfArray();
array.add(fileSpec.getPdfObject().getIndirectReference());
pdf.getCatalog().put(new PdfName("AF"), array);
//Embed fonts
PdfFont font = PdfFontFactory.createFont(FONT, true);
PdfFont bold = PdfFontFactory.createFont(BOLD_FONT, true);
// Create content
Table table = new Table(new float[]{4, 1, 3, 4, 3, 3, 3, 3, 1});
table.setWidthPercent(100);
BufferedReader br = new BufferedReader(new FileReader(DATA));
String line = br.readLine();
process(table, line, bold, true);
while ((line = br.readLine()) != null) {
    process(table, line, font, false);
}
br.close();
document.add(table);
//Close document
document.close();

    コードを1行ずつ説明しましょう。

  • 1-5行目:作成しましたPdfADocument(タイプはPdfAConformanceLevel.PDF_A_3A)Document
  • 7行目:PDFをタグ付きPDF-PDF / UAおよびPDF / A-3A標準に変換します。
  • 8〜12行目:言語、ドキュメントタイトル、ビューアの設定を設定します-PDF / UA標準。
  • 14〜20行目:特定のパラメーターを使用して添付ファイルを追加します-PDF / A-3A標準。
  • 26〜27行目:画像とフォントの埋め込み-PDF / UAおよびPDF / A-3A標準。
  • 28〜38行目:抽出されたコンテンツは、第1章の前のコードと同じです。
  • 30行目:ドキュメントを閉じてコンテンツを保存します

    下の図6に示すように、我々が見ることができるオブジェクトを我々が使用Tableし、CellビットHTMLのように、表データ構造で保存され、タグパネルの文書に追加されます。

itext7-5

図6.PDF / A-3A標準ドキュメント

    同時に、添付パネルを開くと、CSVソースファイルが表示され、図7に示すように簡単に抽出できます。

itext7-6

図7.PDF / A-3A標準ドキュメントとその添付ファイル

    上記の例では、一般的なPDFファイルと比較して、PDF / UAまたはPDF / Aドキュメントを作成するときに追加情報を追加する必要があります。* "iTextを使用して既存の通常のPDFドキュメントを次のように変更できますかPDF / UAまたはPDF / A標準に準拠するドキュメントはどうですか?」*は、フォーラムやコンサルテーションで最もよく聞かれる質問です。この章を通じて、次の理由でiTextを自動的に変換できないことを誰もが理解できることを願っています。

  • 以前のようにキツネと犬の写真が含まれているドキュメントがある場合、iTextはこれらの写真の意味を認識する準備ができていないため、不足している置換説明情報を写真に自動的に追加できません(率直に言って、機械学習、人工知能モジュールがないことを意味します。コンテンツを特定する)
  • フォントが埋め込まれておらず、対応するフォントプログラムが提供されていない場合、iTextはフォントがどのように見えるかを認識せず、ドキュメントにフォントを埋め込むこともできません。

    もちろん、これらは自動的に変換できない2つの小さな理由です。PDFは、ドキュメントがPDF / A標準に準拠しているように見えることを示す小さな青いバーを表示するのは簡単ですが、すべてのステートメントが正しいわけではありません。
    最後に、PDF / Aドキュメントのステッチを見てみましょう。

PDF / Aドキュメントのステッチ

    PDF / Aファイルをステッチする場合、最も注意を払う価値があるのは、ステッチするすべてのドキュメントがPDF / Aファイルである必要があり、1つのPDF / Aファイル、1つの通常のファイル、およびPDF / Aのレベルでもないことです。同様に、一方が構造ツリーを持ち、もう一方が構造ツリーを持たないため、一方をAにし、もう一方をBにすることはできません。スプライスすると、結果が正しくなくなります。

    前の2つのPDF / AAレベルのドキュメントをつなぎ合わせました。結果のファイルを下の図8に示します。

itext7-7

図8.2つのPDF / AAのスプライシング

    タブパネルから1つが表示され<P>、その後に<Table>このドキュメントの作成方法を示す次のコード続きます。

PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
    PdfAConformanceLevel.PDF_A_1A,
    new PdfOutputIntent("Custom", "", "http://www.color.org",
            "sRGB IEC61966-2.1", new FileInputStream(INTENT)));
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
        new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/A-1a example");
//Create PdfMerger instance
PdfMerger merger = new PdfMerger(pdf);
//Add pages from the first document
PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(SRC1));
merger.addPages(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages());
//Add pages from the second pdf document
PdfDocument secondSourcePdf = new PdfDocument(new PdfReader(SRC2));
merger.addPages(secondSourcePdf, 1, secondSourcePdf.getNumberOfPages());
//Merge
merger.merge();
//Close the documents
firstSourcePdf.close();
secondSourcePdf.

    全体として、このコードは前の例と非常に似ていると言えます。

  • 前のコードと変わらない1〜11行目については説明しません。
  • 12〜25行目は、前の章のオスカー賞のスプライシングの例で説明されています。作成時PdfMergerに、PdfADocumentオブジェクトを渡し、このPdfMergerオブジェクトにPdfDocumentタイプ追加しますPdfADocumentタイプの場合、ドキュメントがチェックされます。合法性。

    PDF / UAおよびPDF / A規格についてはまだ多くの議論がありますが、もちろん他の準規格もあります。たとえば、PDF / A-3にはドイツ語の発音ZUGFeRD規格があり、これについては他のシリーズで説明します(これは公式文書です)。個人的にはニーズ次第ですが、時間があればこのピットを開けます)

総括する

    この章では、他のPDF規格に準拠したドキュメントの作成とスプライシングについて説明し、PDF / UAおよびPDF / Aドキュメントの作成方法を学習しました。このシリーズはここで終了します。もちろん、さらに深く理解するには、他のシリーズが必要です。 iText7について学びます。

itext7スタディノートはこれで終了ですが、現在のitex7スタディノートやトークシリーズなど、他のシリーズも制作しており、itex7公式サイトには多くの例や記事が掲載されています。同時に、記事の形式や内容にも注目していきます。改善を続けてください。私のitex7シリーズを引き続きサポートしてください。記事を読んだ後は、フォローすることを忘れないでください。

おすすめ

転載: blog.csdn.net/u012397189/article/details/78882454