【问题标题】:Accessing "alternate text" for an image via PDFBox通过 PDFBox 访问图像的“替代文本”
【发布时间】:2012-09-13 14:26:51
【问题描述】:

有没有办法使用PDFBox为特定图像提取“替代文本”?

我有一个 PDF 文件,如 http://www.w3.org/WAI/GL/2011/WD-WCAG20-TECHS-20110621/pdf.html#PDF1 所述,在图像中添加了替代文本。使用 PDFBox,我可以通过 PDFDocument.getDocumentCatalog().getAllPages() [iterator] .getResources.getImages() 通过对象模型找到图像本身(PDXObjectImage)的方法,但我看不到任何从图像中获取的方法将其自身添加到替代文本中。

可以在http://dl.dropbox.com/u/12253279/image_test_pass.pdf 找到一个小的示例 PDF(带有指定了一些替代文本的单个图像)(它应该说“这是图像的替代文本。”)。

【问题讨论】:

  • 马特,你想做什么?将 PDF 转换为另一种格式? PDFBox 链接对我不起作用
  • 作为可访问性检查工具的一部分,我的目标是自动检查每个图像是否有一些与之关联的“替代文本”。
  • 嗨@MattSheppard!你找到解决办法了吗?从你那里得到一些信息对我很有帮助。谢谢,加博尔
  • 我最终得到了基于 stackoverflow.com/a/12557302/797 的东西,它递归地向下走,并检查页面资源上 isImageXObject 返回 true 的任何 page.getResources().getXObjectNames()。

标签: java pdf accessibility pdfbox


【解决方案1】:

我不知道如何/是否可以使用 PDFBox 完成此操作,但我可以告诉您,此功能与 PDF 规范中称为逻辑结构/标记 PDF 的部分有关,并非每个 PDF 工具都完全支持在外面。

假设您使用的工具支持它,您将必须遵循 4 个主要步骤来检索此信息(我将使用您发布的示例 PDF 文件进行以下说明)。

假设您可以访问 PDF 文件的内部结构,您需要:

1-解析页面内容,找到包裹你感兴趣的图片的Tag元素的MCID号。

页面内容:

BT
/P <</MCID 0 >>BDC 
/GS0 gs
/TT0 1 Tf
0.0004 Tc -0.0028 Tw 10.02 0 0 10.02 90 711 Tm
(This is an image test )Tj
EMC 
ET
/Figure <</MCID 1 >>BDC 
q
106.5 0 0 106.5 90 591.0599976 cm
/Im0 Do
Q
EMC 

您的图片:

2- 在页面对象中,检索键 StructParents。

3- 现在检索结构树(目录对象的键 StructTreeRoot,它是每个 PDF 文件中的根对象),以及其中的 ParentTree。

4- ParentTree 以一个数组开头,您可以在其中找到成对的元素(有关详细信息,请参阅 PDF 规范中的数字树)。在这个特定的树中,每对的第一个元素是一个数值,对应于在步骤 2 中检索到的 StructParents 键,第二个元素是一个对象数组,其中索引对应于在步骤 1 中检索到的 MCID 值。所以, 您将在此处搜索与您的图像的 MCID 值对应的元素,您将找到一个 PDF 对象。在此对象中,您将找到替代文本。

看起来很简单,不是吗?

此答案中使用的工具:
PDF Vole(基于 iText)
Amyuni PDF Analyzer

【讨论】:

    【解决方案2】:

    PDFBox 邮件列表中的 Eric 给我发了以下内容,虽然我还没有测试过...


    嗨,

    对于您的测试文件,这是一种访问“/Alt”条目的方法:

        PDDocument document = PDDocument.load("image_test_pass.pdf");
        PDStructureTreeRoot treeRoot =
            document.getDocumentCatalog().getStructureTreeRoot();
    
        // get page for each StructElement
        for (Object o : treeRoot.getKids()) {
            if (o instanceof PDStructureElement) {
                PDStructureElement structElement = (PDStructureElement)o;
                System.out.println(structElement.getAlternateDescription());
                PDPage page = structElement.getPage();
                if (page != null) {
                    page.getResources().getImages();
                }
            }
        }
    

    请参阅 PDF 规范 http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf,尤其是 §14.6、§14.7、 §14.9.3 和 §14.9.4 了解所有规则以便找到“/Alt” 入口。似乎有几种方法可以定义这些信息。

    BR, 埃里克

    【讨论】:

    • 此代码可能适用于您发送的特定文件,但不适用于所有可能的 pdf
    • 这段代码有很多问题: 1- 它只会显示树的第一层的元素,我们都知道树不是列表。 2-使用这种方法,图像的替代文本与其对应的图像没有直接关联。 3- StructElement 对象中的 page 属性是可选的,因此您甚至可能没有页面关联。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多