【问题标题】:How can I generate a PDF/UA compatible PDF with iText?如何使用 iText 生成 PDF/UA 兼容的 PDF?
【发布时间】:2015-01-29 18:49:01
【问题描述】:

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

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

【问题讨论】:

    标签: itext accessibility jaws-screen-reader


    【解决方案1】:

    请查看PdfUA 示例。它逐步解释了符合 PDF/UA 所需的内容。在 2014 年的 iText 峰会和 JavaOne 上展示了一个类似的示例。观看iText Summit video tutorial

    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 播放器,它不想播放我的蓝光光盘。”(我知道你投了反对票我的正确答案,因为你不相信这是真的。就这样吧。其他人会发现这个答案很有价值,并理解你的投票是不公平的。)

    请阅读The Best iText Questions on StackOverflow 中的最后一个问题,了解我对使用非官方、流氓、过时版本 iText 的人的看法。 另见https://stackoverflow.com/questions/25696851/can-itext-2-1-7-or-earlier-can-be-used-commercially

    【讨论】:

    • 感谢您的回复。您认为您可以链接到您所指的 Stack Overflow 上的实际问题,而不是电子书的广告吗?
    • 该问题是唯一一个从未在 StackOverflow 上发布过的问题,但我将更新我的答案,并附上另一个问题的链接,该问题解释了为什么不应该使用 iText 2.1.7。这个问题的答案对于 iText 4.2.0 来说更是如此,因为 iText 4.2.0 不是官方版本,而是一个“gork”,它是不受支持的第三方的分叉,而不是第三方,当然不是我们。 God O只有 Really K现在才知道里面有什么。
    • 也是“我的电子书的广告”?电子书免费提供!您为什么要抱怨指向免费文档的链接?
    • 我不认为任何需要注册才能下载的东西是真正免费的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多