fas*_*der 5 java pdf itext pdfbox
我已经使用 pdfbox 标记了 pdf。
我是如何被标记的:我没有提取文本和标记,而是将 mcid 添加到现有的内容流中(打开和关闭,例如:/p<< MCID 0 >> BDC .. .. .. EMC)然后我添加标记内容以记录根目录结构。
什么工作:几乎一切都像完全标记的pdf一样正常工作。它也通过了 PAC3 可访问性检查器。
//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);
Run Code Online (Sandbox Code Playgroud)
什么不起作用:标记一个未来后 标记结构中缺少。有一个名为“从选择中查找标签”的选项。不管用。当我选择一些测试并在根结构中按“从选择中查找标签”时,它将是最后一个标签。请在下面的链接中找到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
请帮我解决这个问题。
新问题: 我观察到
当大白鲨阅读我的标记文档时,我正在按下 Windows 机器中的 ctl+shift+5 等控件。它将显示诸如下拉>“基于标记结构读取”或>“左上到右下”以及两个单选按钮下方的选项
阅读当前页面 阅读您可以看到的所有页面图像。在 adobe dc 中按 Shift+CTL+5 你可以在这里看到图片
我选择了“根据标签结构阅读并阅读当前页面”现在下巴没有阅读标签结构。但是,如果我对“阅读整个文档”使用相同的文档,它是否阅读完美?
链接到文档:
https://drive.google.com/file/d/1CguMHa4DikFMP15VGERnPNWRq5vO3u6I/view?usp=sharing
有什么帮助吗?
我如何被标记:除了提取文本和标记我加入MCID对现有的内容流(包括打开和关闭前:
/p<< MCID 0 >> BDC .. .. .. EMC)
你这样做是错误的。例如,请参阅文档中页面内容流的开头:
BT
0 i
/C0_0 18 Tf
41.91 740.175 Td
/H2 <</MCID 0 >> BDC
( \) F M M P 8 P S M E) Tj
ET
/TouchUp_TextEdit MP
BT
/C0_1 14 Tf
EMC
Run Code Online (Sandbox Code Playgroud)
关注文本对象和标记内容的开头和结尾,我们看到您有 BT ... BDC ... ET ... BT ... EMC
但是,根据规范:
当标记内容操作符BMC、BDC和EMC与文本对象操作符BT和ET 组合时(见 9.4 “文本对象”),每对匹配操作符(BMC ... EMC、BDC ... EMC或BT ... ET ) 应正确(单独)嵌套。因此,序列
Run Code Online (Sandbox Code Playgroud)BMC BT BT BMC … and … ET EMC EMC ET是有效的,但是
Run Code Online (Sandbox Code Playgroud)BMC BT BT BMC … and … EMC ET BT EMC无效。
(ISO 32000-1 第 14.6 节“标记内容”)
此问题已在第二个共享 PDF 中修复res1.pdf。
你的问题关注的问题是
有一个名为“从选择中查找标签”的选项。不管用。
从选择中查找标签本质上意味着您拥有某些内容流指令的MCID,并且您在引用标记内容 ID 的结构树中搜索结构元素。
PDF 规范 ISO 32000-1 的第 14.7.4.4 节“从内容项中查找结构元素”(或 ISO 32000-2 的第 14.7.5.4 节)中描述了 PDF 处理器如何执行此操作:
因为流不能包含对象引用,所以标记内容序列的内容项无法直接引用回它们的父结构元素(它们作为内容项属于的那些元素)。相反,应为此目的提供不同的机制,即结构父树。为保持一致性,作为整个 PDF 对象的内容项,例如 XObjects,也应使用父树来引用它们的父结构元素。
父树是一个数字树,从文档结构树根中的ParentTree条目访问。对于作为至少一个结构元素的内容项的每个对象和包含至少一个作为内容项的标记内容序列的每个内容流,该树应包含一个条目。
您的 PDF 根本没有该ParentTree,并且您的页面不包含要在父树中查找的StructParents条目。因此,从标记内容到结构树的规定方法是不可能的。
甲ParentTree是在第三共享PDF加入new.pdf。
虽然new.pdf您有一个ParentTree,但其内容显然不正确:
该ParentTree是数树,即整数被映射到的东西在这里,所以显然不能成为相同的整数键多个条目。
此外,查看这些值之一:
有人看到您声称以下StructElem是所有标记内容 ID 的值:
进一步检查这个StructElem,可以看到它代表了最后一页的最后一段。
因此,你的观察
现在,不是“未找到选择”,而是突出显示父树中的最后一个 <P> 标记。不管我们选择了什么。
是可以期待的。如果人们期望任何合理的行为,即ParentTree结构被破坏得如此严重。
其实有不仅如此new.pdf,但也res.pdf并tagged without altext.pdf与ParentTree S,但所有这些ParentTree小号被打破喜欢的树new.pdf。
在分析不需要的行为时,您可能希望开始检查您创建的结构。
同时,先前描述的父树中的问题已得到解决,不同的页面现在具有不同的父结构,父树数组现在引用不同 MCID 的结构元素。
但是,对于某些文档,现在会出现不同的错误,例如“res29_08_19.pdf”。这里的父树是这样开始的:
特别是数组中的第一个条目用于 MCID 3,第二个用于 MCID 4,...
根据规范,这是无效的
通过使用序列的标记内容标识符作为数组中从零开始的索引,可以找到对应于每个序列的数组元素。
(ISO 32000-1 第 14.7.4.4 节“从内容项中查找结构元素”)
因此,第一个条目必须用于 MCID 0,第二个条目必须用于 MCID 1,...
你在评论中反对
不,我将 0 和 1 Mcid 用于 Artifacts。
但作为上述推论:不要为没有结构元素的标记内容序列提供 MCID!MCID 用于在结构层次结构和内容流之间来回移动。如果在没有结构元素的情况下标记一段内容,请不要为其指定 MCID。
您再次报告最新文件mathpdf.pdf 的问题。确实存在一些问题;Adobe Acrobat Preflight 报告了一个 5 页的不一致父树映射列表,如下所示:
与之前的问题相比,仅通过查看父树并不能明确原因,还必须查看结构层次结构。
但是,这样做时,一个特性立即引起了人们的注意:在您的父树中,您没有引用 MCID 的实际父结构元素,而是引用了一个新的结构树节点,该节点声称将结构层次结构中的实际父节点作为它的自己的父母(实际上不是它的孩子之一)并且还声称拥有有问题的 MCID 作为孩子。
例如,让我们看看第一页上的 MCID 0。在结构层次结构中,您有:
在父树中,您有:
您应该直接从第一页的父树数组中直接引用对象 238(MCID 0 的结构层次结构父对象),而不是中间的对象 62,它声称对象 238 作为父对象,MCID 0 作为子对象。
报告的不一致可能是由于从父树(在对象 62 中)引用的节点声称是P段落,而父节点(在对象 238 中)是Span。这是不允许的,一个段落可以包含一个跨度,但不能包含在一个跨度中。
| 归档时间: |
|
| 查看次数: |
631 次 |
| 最近记录: |