iText 的 Alt-Text 添加示例代码不适用于使用 Acrobat 标记的 PDF
iText's Alt-Text adding sample code not working for PDFs tagged using Acrobat
我正在处理 PDF 辅助功能作业,即在标记的 PDF 中添加替代文本。我在以下位置获得了相同的示例代码:Add alternative text for an image in tagged pdf (PDF/UA) using iText
非常兴奋我的任务将在很短的时间内结束,没有太多的研发。
根据代码创建了一个 Java 项目,当我执行它时,它非常适合 iText 中使用的输入 PDF。
不幸的是,对于使用 Acrobat 标记的 PDF,相同的源代码不起作用。
示例输入: iText PDF:no_alt_attribute.pdf & My PDF: SARO_Sample_v1.7.pdf
问题:
// 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的结构,以下是我的观察:
- 标记结构 - 两个 PDF 完全相同 Tagging Structure
- 内容结构 - 几乎相同,但在我创建的 PDF 中添加了一些内容。 Content Structure
- 标签树结构 - 与标签几乎相同,但有一个主要区别:iText 的 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 条目指定如下:
The children of this structure element. The value of this entry may be one of the following objects or an array consisting of one or more of the following objects in any combination: [...]
(ISO 32000-2,Table 355 — 结构元素字典中的条目)
不过,Bruno 的代码总是假定值是一个数组:
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。
我正在处理 PDF 辅助功能作业,即在标记的 PDF 中添加替代文本。我在以下位置获得了相同的示例代码:Add alternative text for an image in tagged pdf (PDF/UA) using iText
非常兴奋我的任务将在很短的时间内结束,没有太多的研发。
根据代码创建了一个 Java 项目,当我执行它时,它非常适合 iText 中使用的输入 PDF。
不幸的是,对于使用 Acrobat 标记的 PDF,相同的源代码不起作用。
示例输入: iText PDF:no_alt_attribute.pdf & My PDF: SARO_Sample_v1.7.pdf
问题:
// 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的结构,以下是我的观察:
- 标记结构 - 两个 PDF 完全相同 Tagging Structure
- 内容结构 - 几乎相同,但在我创建的 PDF 中添加了一些内容。 Content Structure
- 标签树结构 - 与标签几乎相同,但有一个主要区别:iText 的 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 条目指定如下:
The children of this structure element. The value of this entry may be one of the following objects or an array consisting of one or more of the following objects in any combination: [...]
(ISO 32000-2,Table 355 — 结构元素字典中的条目)
不过,Bruno 的代码总是假定值是一个数组:
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。