请看一下PdfUA示例。它逐步解释了符合 PDF/UA 所需的内容。2014 年的 iText 峰会和 JavaOne 上也展示了一个类似的示例。观看iText 峰会视频教程。
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document(PageSize.A4.rotate());
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
writer.setPdfVersion(PdfWriter.VERSION_1_7);
//TAGGED PDF
//Make document tagged
writer.setTagged();
//===============
//PDF/UA
//Set document metadata
writer.setViewerPreferences(PdfWriter.DisplayDocTitle);
document.addLanguage("en-US");
document.addTitle("English pangram");
writer.createXmpMetadata();
//=====================
document.open();
Paragraph p = new Paragraph();
//PDF/UA
//Embed font
Font font = FontFactory.getFont(FONT, BaseFont.WINANSI, BaseFont.EMBEDDED, 20);
p.setFont(font);
//==================
Chunk c = new Chunk("The quick brown ");
p.add(c);
Image i = Image.getInstance(FOX);
c = new Chunk(i, 0, -24);
//PDF/UA
//Set alt text
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox"));
//==============
p.add(c);
p.add(new Chunk(" jumps over the lazy "));
i = Image.getInstance(DOG);
c = new Chunk(i, 0, -24);
//PDF/UA
//Set alt text
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog"));
//==================
p.add(c);
document.add(p);
p = new Paragraph("\n\n\n\n\n\n\n\n\n\n\n\n", font);
document.add(p);
List list = new List(true);
list.add(new ListItem("quick", font));
list.add(new ListItem("brown", font));
list.add(new ListItem("fox", font));
list.add(new ListItem("jumps", font));
list.add(new ListItem("over", font));
list.add(new ListItem("the", font));
list.add(new ListItem("lazy", font));
list.add(new ListItem("dog", font));
document.add(list);
document.close();
}
您制作带有文档标记的setTagged
文档,但这还不够。您还需要设置文档数据:需要显示文档标题,并且需要指明文档中使用的语言。XMP 元数据是强制性的。
此外,您需要嵌入所有字体。当你有图像时,你需要一个替代描述。在示例中,我们将单词“dog”和“fox”替换为图像。为了确保这些图像被正确“读出”,我们需要使用该setAccessibleAttribute()
方法。
在示例的最后,我添加了一个编号列表。在您的重复问题https://stackoverflow.com/questions/28222490/numbered-list-across-a-page-break-causes-jaws-to-read-numbers-out-of-order-in-it中,您声称JAWS 没有正确读出该列表。如果您检查使用上述示例创建的 PDF 文件,更具体地说是pdfua.pdf,您会发现 JAWS 按预期读取文档,其中数字和文本的顺序正确。
尝试此操作时“它不起作用”的原因很简单。您声称您正在使用 iText,但事实并非如此。您正在使用 iText 的“gork”。“gork”是一种非官方的“叉子”,只有上帝才真正知道里面是什么。您需要最新的 iText 版本来实现您想要的,因为 PDF/UA 是自 2012 年以来的标准,而您使用的是自 2009 年以来的 iText 版本。
我建议您删除另一个问题,因为:
- 它是这个问题的副本(如果您不同意,请阅读我的回答:这不正是您在两个问题中所问的吗?),
- 从某种意义上说,这听起来像是“我正在使用一个古老的 DVD 播放器,它不想播放我的蓝光光盘”,这是题外话。(我知道你对我的正确答案投了反对票,因为你不相信这是真的。就这样吧。其他人会发现这个答案很有价值,并理解你的投票是不公平的。)
请阅读StackOverflow 上的最佳 iText 问题中的最后一个问题,了解我对使用非官方、流氓、过时版本 iText 的人的看法。另请参阅https://stackoverflow.com/questions/25696851/can-itext-2-1-7-or-earlier-can-be-used-commercially