我正在处理PDF辅助功能,即在标记的PDF中添加替代文本。我在Add alternative text for an image in tagged pdf (PDF/UA) using iText处获得了相同的示例代码。令我感到非常兴奋的是,我的任务将在很短的时间内结束,而没有太多的研发工作
根据代码创建了一个Java项目,当我执行它时,该代码对于iText中使用的输入PDF来说是完美的。这是iText的样本输入PDF:no_alt_attribute.pdf。但是坏处是一样的source-code
对于使用Acrobat的PDF Tagged,不起作用。
问题所在:
// This line works and returns RootElement
PdfDictionary structTreeRoot = catalog.getAsDict(PdfName.STRUCTTREEROOT);
// --> This line always returns NULL,
// Instead of returning the child elements of RootElement
PdfArray kids = structTreeRoot.getAsArray(PdfName.K);
// --> As per the structure Kids are present
比较两个PDF的结构,以下是我的观察:
/T:StructElem
,而在MY-PDF中找不到(即使重新标记也没有运气)。 Tag Tree Structure已通过我们提供的各种带标签的PDF进行了验证,并且它们都相似(没有/T:StructElem
),这些PDF均经过验证并通过了可访问性合规检查。
[关于如何使此源代码与我们现有的PDF一起使用,或者在Acrobat中进行标记时,有一种自动在PDF中添加缺失的/T:StructElem
的方法,需要一些思考。
任何帮助将不胜感激!
如果需要更多信息,请告诉我。
注意:我仍然不确定添加此/T:StructElem
是否可行,因为PDF是在PAC中传递的。如果这确实是一个问题,那么这些PDF将不会通过验证,对吗?但这是我在这两个PDF之间发现的唯一区别。
PS:我使用的Acrobat版本是“ Adobe Acrobat(Pro)DC”
-谢谢,SaRaVaNaN
Bruno在referenced answer中的代码不会遍历整个结构树,因为他没有实现K内容的所有情况。结构元素K条目是这样指定的:
此结构元素的子元素。此项的值可以是以下对象之一,也可以是由以下一个或多个对象以任意组合组成的数组:[...]
(ISO 32000-2,表355-结构元素字典中的条目)
但是,布鲁诺的代码始终将值假定为数组:
PdfArray kids = element.getAsArray(PdfName.K);
((很可能他只考虑了相关PDF的结构树来实现了该代码。)
因此,替换
PdfArray kids = element.getAsArray(PdfName.K); if (kids == null) return; for (int i = 0; i < kids.size(); i++) manipulate(kids.getAsDict(i));
通过类似
PdfObject kid = element.getDirectObject(PdfName.K); if (kid instanceof PdfDictionary) { manipulate((PdfDictionary)kid); } else if (kid instanceof PdfArray) { PdfArray kids = (PdfArray)kid; for (int i = 0; i < kids.size(); i++) manipulate(kids.getAsDict(i)); }
由于您没有共享示例文档,因此我无法测试代码。如果有问题,请分享一个示例PDF。