2

我们的网站上有许多使用 iText 4.2.0 动态生成的可打印表单文件。但是,我们也有大量有打印障碍的用户,他们使用 JAWS 等屏幕阅读器来呈现我们的 PDF。我们使用 .setTagged() 方法标记 PDF,但 PDF 的某些元素出现乱序。有些甚至在调用 setTagged 后变得更加混乱!

我在 2013 年与 Bruno Lowagie 对 iText 的采访中读到了 PDF/UA,这似乎有助于解决我们的问题。但是,我还没有找到一个很好的例子来说明如何生成 PDF/UA 文档。你能举个例子吗?另外,生成符合 PDF/UA 的 PDF 文档所需的 iText 的最低版本是多少?

4

1 回答 1

4

请看一下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

于 2015-01-30T10:00:21.957 回答