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

2024-02-05

我已经使用 pdfbox 标记了 pdf。

我是如何被标记的:我不是提取文本和标记,而是将 mcid 添加到现有内容流(打开和关闭 ex: /p> 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/11Lhuj50Bb9kChvD0kL_GOHQn4RNKZ0hR/view?usp=sharing

父树:

https://drive.google.com/file/d/109xhUpqsQSFLPJB2nhXoU9ssMKnyht3G/view?usp=sharing https://drive.google.com/file/d/109xhUpqsQSFLPJB2nhXoU9ssMKnyht3G/view?usp=sharing

带有标记和父树的额外文档:https://drive.google.com/file/d/1yzZSsjkb5_dGfq1Wu3VxsH73vr3alRmC/view?usp=sharing https://drive.google.com/file/d/1yzZSsjkb5_dGfq1Wu3VxsH73vr3alRmC/view?usp=sharing

请帮我解决这个问题。

新问题:我观察到

当 Jaws 读取我的标记文档时,我在 Windows 机器中按下 ctl+shift+5 等控件。它将显示类似的选项 下拉菜单>“根据标记结构读取”或>“从左上到右下” 和下面两个单选按钮

阅读当前页面 阅读您可以看到的所有页面图像。在 adobe dc 中按 Shift+CTRL+5你可以在这里看到图片 https://i.stack.imgur.com/ALiAx.png

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

链接到文档:

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

有什么帮助吗?


嵌套问题

我是如何被标记的:我不是提取文本和标记,而是将 mcid 添加到现有内容流(打开和关闭 ex:/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, and EMC与文本对象运算符组合BT and ET(参见9.4,“文本对象”),每对匹配运算符(BMCEMC, BDCEMC, or BTET)应正确(单独)嵌套。因此,序列

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 对象的内容项(例如 XObject)也应使用父树来引用其父结构元素。

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

你的PDF没有这个父树根本没有,并且您的页面不包含结构父级在父树中查找的条目。因此,规定的方式从标记内容 to the 结构树是不可能去的。

A 父树在第三个共享PDF中添加了,new.pdf.

父树条目不正确

而在new.pdf你有一个父树,其内容明显不正确:

The 父树 is a 数树,即整数是mapped到这里的某个东西,所以显然同一个整数键不能有多个条目。

此外,查看这些值之一:

人们看到您声称以下内容结构元素是所有标记的内容 ID 的值:

检查这个结构元素此外,人们会看到它代表最后一页的最后一段。

因此,你的观察

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

标记。无论我们选择什么。

这是人们可以期待的。如果人们期望任何合理的行为,也就是说,父树结构破坏得如此严重。

其实不止这个new.pdf但是也res.pdf and tagged without altext.pdf with 父树s,但是所有这些父树s像树一样折断了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 来制作工件。

但作为上述的推论:不要将 MCID 赋予您没有结构元素的标记内容序列!MCID 用于在结构层次结构和内容流之间来回切换。如果您标记一段内容而没有其结构元素,则不要为其指定 MCID。

父树条目的另一个问题

您再次报告最新文件的问题数学pdf.pdf https://drive.google.com/file/d/1aD1HGQsEXOovpfWdf7JRNwJhP7tX6pmy/view?usp=sharing。事实上,确实存在一些问题; Adobe Acrobat Preflight 报告不一致父树映射的 5 页列表,如下所示:

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

不过,这样做会立即引起人们的注意:在父树中,您没有引用 MCID 的实际父结构元素,而是引用了一个新的结构树节点,该节点声称将结构层次结构中的实际父节点作为其自己的父母(实际上并不是其孩子之一),并且还声称自己小时候就有相关的 MCID。

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

在父树中你有:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“从选择中查找标签”在带标签的 pdf 中不起作用? 的相关文章

随机推荐

  • 如何更改大屏幕的背景颜色?

    我想知道如何更改 jumbotron 类的背景颜色 它有一个默认值background color eee在 bootstrap css 中 我试图通过删除它并给出属性来覆盖none none important transparent进入
  • 使用 typescript 和 angular2 将图像上传到存储 blob

    我正在使用打字稿开发 Angular 2 应用程序 在我当前的项目中 我实现了将图像上传到天蓝色存储 blob 的功能 为此我点击了以下链接 http www ojdevelops com 2016 05 end to end image
  • 如何在 Pillow-Python 中使用流打开简单图像

    from PIL import Image image Image open image jpg file path io BytesIO image save file path JPEG image2 Image open file p
  • WCF 证书身份验证不起作用

    我已经构建了 WCF helloworld 客户端和服务器 我想在它们之间使用证书身份验证 我收到的错误是 调用者未经服务验证 我使用 makecert exe 创建了两个证书 客户端上的证书安装在 个人 受信任的人 和 第三方根证书颁发机
  • 如何使用 Azure Function 中的 Azure 托管身份通过触发器访问服务总线?

    我在 Azure 中创建了一个 ServiceBus 命名空间 以及一个主题和订阅 我还有一个简单的 Azure 版本 1 函数 可以触发 ServiceBus 中收到的主题 如下所示 FunctionName MyServiceBusTr
  • Django自定义注解功能

    我想使用 Django 构建一个简单的热门问题列表 我有一个function https web archive org web 20150526231733 http amix dk blog post 19588评估 hotness 每
  • 简单的C程序

    该程序基于K R中输入 输出部分的程序 include
  • 输入字符时无限循环[重复]

    这个问题在这里已经有答案了 我试图限制用户仅输入 1 或 2 int ch do cout lt lt Enter n cin gt gt ch switch ch case 1 cout lt lt 1 break case 2 cout
  • 在后台加载 MKMapView 并从中创建 UIImage (iPhone 和 iPad)

    我遇到一种情况 我需要一种加载具有多个覆盖层的 MKMapView 的方法 此地图视图不应显示在屏幕上 我需要加载它的唯一原因是为了从地图创建图像以供在其他地方使用 我在网上查了一下 但没有找到解决问题的方法 请问有人可以帮我吗 这是我到目
  • 如何确保队友不会通过重写历史来搞砸 git 存储库?

    常见的建议似乎是不要在提交提交后重新设置基准 重置或执行其他 历史重写 操作 建议在您自己的机器上执行所有这些类型的切片和切块 但一旦您推送了它 就顺其自然 这是有道理的 但如何执行这项政策呢 对于多个开发人员 我们如何确保没有人这样做 似
  • 仅在调试构建变体中包含 Stetho

    我知道我可以使用debugCompile只拉入一个dependency为了debug build 有没有一种好的 简化的方法来做到这一点code initialization这也是必需的吗 如果没有依赖项 其他变体将无法编译 检查 Tani
  • 如何使用 PHP 混淆 JavaScript? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 例如 我如何混淆以下示例代码 The code below will write to a heading and to a paragr
  • TIdCmdTCPServer 和 TIdCmdTCPClient 应该一起使用吗?

    我正在尝试编写一个服务器和一组与服务器通信的客户端 服务器将维护不同客户端的状态 并允许它们在状态发生变化时向中央服务器发出警报 专业客户端将允许控制其他连接的客户端 我将服务器作为 TIdCmdTCPServer 客户端 目前 使用 TI
  • Kronecker 产品 pandas 数据框

    我有两个数据框 A B 0 1 2 1 1 2 2 1 2 and C D 0 1 4 1 2 5 2 3 6 我需要叉积 AC AD BC BD 的平均值 因此我希望能够计算 AC AD BC BD 0 1 4 2 8 1 2 5 4 1
  • Sinon.js-试图监视 console.log 但它已经被包装了

    我是编写节点测试的新手 这是我尝试编写的 gulp 插件的第一个单元测试 var chai require chai var spy require chai spies var es require event stream var Fi
  • 对推力从当前速度矢量到目标矢量的平滑变化进行编程

    TL dr 我不确定如何计算一个矢量与另一个矢量之间的推力的平滑过渡 我正在编写一个简单的游戏 敌人在开放空间 没有墙壁 中追赶玩家 我独立计算敌人的 x 和 y 速度 如果敌人朝着玩家的方向前进 则加速它们 如果敌人走错路 则快速减慢它们
  • MomentJS - 将日期时间从 UTC 转换为不同的时区

    我正在尝试将 utc 时间转换为本地时区 但没有成功 这是我的代码 var utc moment tz 2017 03 28 15 00 00 UTC var s utc format var pl moment tz utc format
  • GAE/J:开发和生产环境

    GAE J 开发环境和生产环境之间的主要区别是什么 生产时应复检哪些内容 我应该期待什么样的数据存储差异 开发环境是单线程的 无请求超时 No 爆炸指数 http code google com appengine docs python
  • 根据网络变化更新 iPhone 的可达性

    编辑 23 5 11 我现在想知道我是否过度设计了这个 当我使用在线连接时 我会正确处理它 要么 在后台显示进度或活动指示器 如果失败 我会显示一条合适的消息或 我调用另一个应用程序 Safari 或 Maps 然后它会进行自己的检查 如果
  • “从选择中查找标签”在带标签的 pdf 中不起作用?

    我已经使用 pdfbox 标记了 pdf 我是如何被标记的 我不是提取文本和标记 而是将 mcid 添加到现有内容流 打开和关闭 ex p gt BDC EMC 然后添加标记内容为文件根目录结构 工作原理 几乎一切都工作正常 就像完全标记的