“从选择中查找标签”在加标签的pdf中不起作用?

时间:2019-08-21 12:16:10

标签: java pdf itext pdfbox

我已使用pdfbox标记了pdf。

如何为我加标签:我不是在提取文本和添加标签,而是在现有内容流中添加mcid(打开和关闭ex:/ 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);             

什么不起作用:标记一个将来后,标记结构中缺少该标记。有一个名为“从选择中查找标签”的选项。不管用。当我选择一些测试并按根结构中的“从选择中查找标签”时,这将是最后一个标签。请在下面的链接中找到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之类的控件。它将显示类似的选项 下拉>“基于标记结构读取”或>“左上至右下” 并在两个单选按钮下方

  

阅读当前页面   阅读所有页面   您可以看到的图像。 Adobe DC中的Shift + CTL + 5   you can see image here

我选择了“基于标签结构阅读并阅读当前页面”,现在下颌不阅读标签结构。但是,如果我对“阅读整个文档”使用相同的文档,那么阅读是否完美?

链接到文档:

https://drive.google.com/file/d/1CguMHa4DikFMP15VGERnPNWRq5vO3u6I/view?usp=sharing

有帮助吗?

1 个答案:

答案 0 :(得分:4)

一个嵌套问题

  

我是如何标记的:我不是在提取文本和添加标签,而是在现有内容流中添加了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 

在文本对象和标记内容的开头和结尾处,我们看到您有BT ... BDC ... ET ... BT ... EMC

根据规范,

  

当标记内容运算符 BMC BDC EMC 与文本对象运算符 BT 结合使用时>和 ET (请参见9.4,“文本对象”),每对匹配的运算符( BMC EMC BDC ... EMC BT ... ET )应正确(单独)嵌套。因此,序列

BMC             BT
  BT              BMC
    …    and         …
  ET              EMC
EMC             ET
     

有效,但是

BMC             BT
  BT              BMC
    …    and         …
  EMC             ET
BT              EMC
     

无效。

(ISO 32000-1第14.6节“标记内容”)

第二个共享PDF res1.pdf中已解决此问题。

缺少ParentTree和StructParents

您的问题关注的问题是

  

有一个名为“从选择中查找标签”的选项。不起作用。

从选择中找到标签实质上意味着您具有某些内容流指令的 MCID ,并且您在结构树中搜索引用了已标记内容ID的结构元素。

PDF规范ISO 32000-1的14.7.4.4节“从内容项中查找结构元素”(或ISO 32000-2的14.7.5.4节)中描述了PDF处理器如何实现此目标:

  

因为流不能包含对象引用,所以标记内容序列的内容项无法直接引用回其父结构元素(它们属于内容项)。取而代之的是,为此目的应提供不同的机制结构父树。为了保持一致性,作为完整PDF对象的内容项(例如XObjects)也应使用父树来引用其父结构元素。

     

父树是一棵数字树,可从文档结构树根的 ParentTree 条目中访问。该树应为每个对象(至少一个结构元素的内容项)和每个包含至少一个标记内容序列(内容项)的内容流包含一个条目。

您的PDF根本没有该 ParentTree ,并且您的页面不包含用于在父树中查找的 StructParents 条目。因此,从标记的内容到结构树的规定方法是不可能的。

在第三个共享PDF new.pdf中添加了 ParentTree

不正确的ParentTree条目

new.pdf中,您有一个 ParentTree ,但其内容显然不正确:

Screenshot ParentTree

ParentTree 是一个数字树,即整数被映射到此处,因此显然同一对象不能有多个条目整数键。

此外,查看这些值之一:

Screenshot ParentTree, first entry opened

有人发现您声称以下 StructElem 是所有已标记内容ID的值:

common value of all content IDs

进一步检查此 StructElem ,人们发现它代表了最后一页上的最后一段。

因此,您的观察

  

现在而不是“未找到选择”,它突出显示了父树中的最后一个

标签。不管我们选择什么。

是人们可以期待的。如果人们根本希望任何合理的行为,那就是 ParentTree 结构被严重破坏。

实际上,不仅有带有{strong> ParentTree 的new.pdfres.pdftagged without altext.pdf,还有所有这些 ParentTree new.pdf的树一样被打破。

在分析有害行为时,您可能想开始检查创建的结构。

父树条目的另一个问题

先前描述的父树中的问题已得到解决,不同的页面现在具有不同的结构父,并且父树数组现在引用了不同MCID的结构元素。

对于某些文档,现在会发生其他错误,例如“ res29_08_19.pdf”。这里的父树是这样开始的:

Screenshot ParentTree

尤其是数组中的第一个条目用于MCID 3,第二个条目用于MCID 4,...

根据规范,这是无效的

  

每个序列对应的数组元素应通过使用序列的标记内容标识符作为数组中从零开始的索引来找到。

(ISO 32000-1第14.7.4.4节“从内容项中查找结构元素”)

因此,第一个条目必须是MCID 0,第二个条目是MCID 1,...

您反对发表评论

  

不,我使用0和1麦迪德作为伪像。

但是,上述推论是:不要将MCID赋予没有结构元素的标记内容序列! MCID用于在结构层次结构和内容之间来回移动流。如果您在没有结构元素的情况下标记了一条内容,请不要为其赋予MCID。

父树条目还有另一个问题

您再次报告最新文件mathpdf.pdf的问题。确实存在问题。 Adobe Acrobat Preflight报告了5页不一致的父树映射列表,如下所示:

preflight report excerpt

与之前的问题相比,仅通过查看父树并不能清楚原因,还必须查看结构层次。

尽管如此,一个独特之处立即引起了注意:在父树中,您没有引用MCID的实际父结构元素,而是引用了一个新的结构树节点,该节点声称从结构中获得了实际的父节点。作为其父级(实际上不是其孩子之一)的层次结构,并且还声称该MCID是孩子。

例如,让我们看第一页上的MCID 0。在结构层次结构中,您可以:

structure hierarchy screen shot

在父树中,您有:

parent tree screen shot

您应该直接从第一页的父树数组中直接引用对象238(MCID 0的结构层次结构父对象),而不是直接声明对象62之间的中间对象(该对象声称对象238为父对象,MCID 0为孩子)

报告的不一致可能是由于从父树(在对象62中)引用的节点声称是 P 段落,而父节点(在对象238中)是跨度。这是不允许的,一个段落可能包含一个跨度,但不能包含一个。