我用pdfbox标记了一个pdf。
我是如何被贴上标签的:而不是提取文本和标记我添加mcid的现有内容流(包括开放和关闭ex:/p〈〈MCID 0〉〉BDC...... EMC),然后将标记的内容添加到文档根目录结构中。
工作内容:几乎一切都工作正常,就像完全标记的pdf一样。它也通过了pac 3可访问性检查。
//Adding tags
tokens.add(++ind, type_check(t_ype, page));
currentMarkedContentDictionary = new COSDictionary();
currentMarkedContentDictionary.setInt(COSName.MCID, mcid);
if (altText != null && !altText.isEmpty()) {
currentMarkedContentDictionary.setString(COSName.ALT, altText);
}
mcid++;
tokens.add(++ind, currentMarkedContentDictionary);
tokens.add(++ind, Operator.getOperator("BDC"));
// Adding marked content to root structure
structureElement.appendKid(markedContent);
currentSection.appendKid(structureElement);
什么不起作用:标记后,一个未来是从标签结构中丢失。有一个选项称为“从选择中查找标签”。不工作。它将最后一个标签,而我选择一些测试,并按“从选择中查找标签”在根结构中。请在下面的链接中找到PDF。
https://drive.google.com/file/d/11Lhuj50Bb9kChvD0kL_GOHQn4RNKZ0hR/view?usp=sharing
父树:
https://drive.google.com/file/d/109xhUpqsQSFLPJB2nhXoU9ssMKnyht3G/view?usp=sharing
带有标记和父树的额外文档:https://drive.google.com/file/d/1yzZSsjkb5_dGfq1Wu3VxsH73vr3alRmC/view?usp=sharing
请帮我解决这个问题。
**新问题:**我观察到
当Jaws阅读我的标记文档时,我在windows机器中按下ctl+shift+5等控件。它将显示下拉〉“基于标记结构读取”或〉“从左上到右下”等选项以及两个单选按钮下方
读取当前页面读取您可以看到的所有页面图像。Shift+CTL+5在adobe dc you can see image here中
我选择了“基于标签结构阅读并阅读当前页面”,现在钳口不阅读标签结构。但如果我使用相同的文档“阅读整个文档”,它是阅读完美?
链接到文档:
https://drive.google.com/file/d/1CguMHa4DikFMP15VGERnPNWRq5vO3u6I/view?usp=sharing
有人帮忙吗?
1条答案
按热度按时间kg7wmglp1#
嵌套问题
我是如何被贴上标签的:而不是提取文本和标记我添加mcid的现有内容流(包括开放和关闭ex:
/p<< MCID 0 >> BDC .. .. .. EMC
)您这样做不正确。例如,请参阅文档中页面内容流的开头:
关注文本对象和标记内容的开头和结尾,我们可以看到您有
BT ... BDC ... ET ... BT ... EMC
根据规范,虽然:
当标记内容运算符BMC、BDC和EMC与文本对象运算符BT和ET(参见9.4“文本对象”)组合时,每对匹配运算符(BMC...EMC、BDC...EMC或BT...ET)应正确(单独)嵌套。因此,序列
有效,但
无效。
res1.pdf
中修复。*缺少ParentTree和StructParents
你的问题关注的问题是
有一个名为“从所选内容中查找标记”的选项。不起作用。
从选择中查找标记本质上意味着您拥有某个内容流指令的MCID,并且您在引用该标记的内容ID的结构树中搜索结构元素。
PDF处理器如何执行此操作,请参见14.7.4.4PDF规范ISO 32000-1的www.example.com“从内容项中查找结构元素”部分(或14.7.5.4ISO 32000-2的www.example.com部分):
由于流不能包含对象引用,因此作为标记内容序列的内容项无法直接引用回其父结构元素相反,应为此目的提供不同的机制,即 * 结构化父树 *。为了一致性,作为整个PDF对象的内容项,例如XObjects,还应当使用父树来引用它们的父结构元素。
父树是一棵数字树,从文档结构树根中的ParentTree条目访问。该树应包含至少一个结构元素的内容项的每个对象和至少包含一个内容项的标记内容序列的每个内容流的条目。
您的PDF根本没有那个ParentTree,您的页面也不包含要在父树中查找的StructParents条目。因此,从 * 标记内容 * 到 * 结构树 * 的规定方式是不可能的。
new.pdf
中添加了ParentTree。*不正确的ParentTree条目
在
new.pdf
中,你有一个ParentTree,它的内容显然是不正确的:ParentTree是一个 * 数字树 *,也就是说整数在这里被 * Map * 到某个东西,所以显然不能有多个条目对应同一个整数键。
此外,看看其中一个价值观:
可以看到您声明以下StructElem是所有标记内容ID的值:
进一步检查这个StructElem,可以看到它表示最后一页的最后一段。
因此,你的观察
现在,它不是“selection not found“,而是突出显示父树中的最后一个标签。不管我们选择了什么。
如果一个人期望任何合理的行为,也就是说,一个ParentTree结构被破坏得如此严重。
new.pdf
,还有res.pdf
和tagged without altext.pdf
,它们都有ParentTree,但所有这些ParentTree都像new.pdf
的树一样被破坏了。*您可能希望在分析不需要的行为时开始检查创建的结构。
父树条目的另一个问题
同时,先前描述的父树中的问题已经得到解决,不同的页面现在具有不同的结构父,并且父树数组现在引用不同MCID的结构元素。
但是,对于某些文档,现在会出现不同的错误,例如“res29_08_19.pdf”。这里的父树开始如下:
特别地,阵列中的第一条目用于MCID 3,第二条目用于MCID 4,…
根据规范,这是无效的
对应于每个序列的数组元素应通过使用序列的标记内容标识符作为数组中的从零开始的索引来找到。
因此,第一个条目必须用于MCID 0,第二个条目用于MCID 1,…
你在评论中表示反对
不,我使用0和1 Mcid作为伪影。
但作为上述的推论:* 不要为没有结构元素的标记内容序列给予MCID!* MCID用于在结构层次结构和内容流之间来回移动。如果您在没有结构元素的情况下标记了一段内容,请不要为其提供MCID。
父树条目的另一个问题
您再次报告了最新文件mathpdf.pdf的问题。Adobe Acrobat印前检查报告了一个5页的不一致父树Map列表,如下所示:
与前面的问题相比,仅通过查看父树并不能清楚地了解原因,还必须查看结构层次。
然而,这样做,一个特点立即击中了眼睛:在你的父树中,你不引用MCID的实际父结构元素,而是引用一个新的结构树节点,该节点声称拥有结构层次中的实际父节点作为它自己的父节点(实际上不是它的子节点之一),并且还声称拥有所讨论的MCID作为子节点。
例如,让我们看看第一页上的MCID 0。在结构层次结构中,您有:
在父树中,您有:
您应该直接从第一页的父树数组引用对象238(MCID 0的结构层次父),而不是中间的对象62,它声称将对象238作为父对象,将MCID 0作为子对象。
所报告的不一致性可能是由于从父树(在对象62中)引用的节点声称是P段落,而父节点(在对象238中)是跨度。这是不允许的,段落可以 * 包含 * 跨度,但不能 * 包含 * 跨度。