

iText
2.1.7を利用して作成したサイトに、動的に作成したＰＤＦを複数置いています。しかし、ユーザーの中には障害を持っているため、JAWSなどの画面リーダーを利用してPDFをレンダリングしているユーザーも数多くおられます。PDFへのタグ指定には`setTagged()`メソッドを利用しますが、PDFの一部の要素の順序が正しくありません。一部は`setTagged()`を呼び出した後、さらにごちゃごちゃになってしまいました！  
PDF/UAに関して読んだところ、問題解決に役立ちそうでした。ですが、PDF/UA文書の作成方法についての良いサンプルコードが見つかりませんでした。サンプルコードをご提供していただけますでしょうか？


CC BY-SA 4.0
2019-06-27T05:14:36.957
56133
2019-06-27T05:26:27.480
30882
question
java pdf
iTextでPDF/UA互換PDFを作成するにはどうしたらいいですか？


PdfUAのサンプルコードをご覧ください。PDF/UA遵守するために必要なことが段階ごとに説明されています。2014年にiText
SummitとJavaOneから類似サンプルコードを提示しました。[iText
Summit動画チュートリアル](https://www.youtube.com/watch?v=9b-ikCV_z8A)をご覧ください。

[code]

     public void manipulatePdf(String dest) throws IOException, XMPException {
     PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest, new WriterProperties().setPdfVersion(PdfVersion.PDF_1_7)));
     Document document = new Document(pdfDoc, new PageSize(PageSize.A4).rotate());
     //TAGGED PDF
     //Make document tagged
     pdfDoc.setTagged();
     //===============
     //PDF/UA
     //Set document metadata
    
     pdfDoc.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true));
     pdfDoc.getCatalog().setLang(new PdfString("en-US"));
     PdfDocumentInfo info = pdfDoc.getDocumentInfo();
     info.setTitle("English pangram");
     //=====================
    
     Paragraph p = new Paragraph();
     //PDF/UA
     //Embed font
     PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.WINANSI, true);
     p.setFont(font);
     //==================
     Text c = new Text("The quick brown ");
     p.add(c);
     Image i = new Image(ImageDataFactory.create(FOX));
     //PDF/UA
     //Set alt text
     i.getAccessibilityProperties().setAlternateDescription("Fox");
     //==============
     p.add(i);
     p.add(" jumps over the lazy ");
     i = new Image(ImageDataFactory.create(DOG));
     *//PDF/UA
     //Set alt text
     i.getAccessibilityProperties().setAlternateDescription("Dog");
     //==================
     p.add(i);
     document.add(p);
     p = new Paragraph("\n\n\n\n\n\n\n\n\n\n\n\n").setFont(font).setFontSize(20);
     document.add(p);
     List list = new List();
     list.add((ListItem) new ListItem("quick").setFont(font).setFontSize(20));
     list.add((ListItem) new ListItem("brown").setFont(font).setFontSize(20));
     list.add((ListItem) new ListItem("fox").setFont(font).setFontSize(20));
     list.add((ListItem) new ListItem("jumps").setFont(font).setFontSize(20));
     list.add((ListItem) new ListItem("over").setFont(font).setFontSize(20));
     list.add((ListItem) new ListItem("the").setFont(font).setFontSize(20));
     list.add((ListItem) new ListItem("lazy").setFont(font).setFontSize(20));
     list.add((ListItem) new ListItem("dog").setFont(font).setFontSize(20));
     document.add(list);
     document.close();
    }
    
[/code]

`setTagged`文書を利用してタグが指定された文書を作成しましたが、それだけでは不十分で、文書データも設定しなければなりません。文書タイトルと文書に使用される言語も表示しなければなりません。XMPメタデータは必須です。

また、すべてのフォントを含めなければなりません。画像がある場合は、代替テキストが必要です。サンプルコードでは、「DOG(犬)」と「FOX(キツネ)」という単語を画像に代替させています。このような画像を正しく「読み上げることができる」よう、`getAccessibilityProperties().setAlternateDescription()`メソッドを使用してください。

サンプルコードの最後に番号付けされたリストを追加しました。投稿者の方は別の質問で、JAWSを利用してリストを読んで話すことができないと言っておられました。上記のサンプルコードで作成したPDFファイル、即ち[pdfua.pdf](http://gitlab.itextsupport.com/itext/sandbox/raw/master/cmpfiles/pdfa/cmp_pdfua.pdf)を確認していただくと、JAWSが番号やテキストとともに、文書を予定した順序どおり読むことができると分かるでしょう。

「作動しない」理由は簡単です。PDF/UAの標準より以前バージョンのiTextを使用しているからです。また、ご利用中のバージョンで`setTagged()`メソッドを使用する場合は、最も低いPDFレベルでタグ構造を作成しなければなりません。iText最新バージョンは、より高いレベルに対応しています。ご希望の作業を実行したければ、最新バージョンのiTextをご利用ください。


CC BY-SA 4.0
2019-06-27T05:26:27.480
56134
2019-06-27T05:26:27.480
30882
56133
answer