【问题标题】:Extract Reading Order Sequence in a Tagged PDF在标记的 PDF 中提取阅读顺序序列
【发布时间】:2026-02-14 23:45:01
【问题描述】:

我目前正在验证标记的 PDF 文件中内容的正确顺序。

有没有什么方法可以通过编程方式提取Tagged PDF Files的阅读序号?

我尝试将标记的 PDF 转换为 XML,但我无法确定哪些标记属于某个文本。

我尝试了以下库:

  • 同步融合
  • IText7

但我找不到任何获取其阅读顺序号的方法。

真的有可能吗?提前致谢!

【问题讨论】:

  • 阅读顺序不是结构树给的吗?然后你所要做的就是沿着结构树提取文本。

标签: java c# pdf accessibility acrobat


【解决方案1】:

您可以使用PdfPig (.Net) 库提取标记的 pdf 的标记内容树。我的理解是阅读顺序是由 Marked-content identifier (MCID) 来表示的。

如果标记的内容元素不包含 MCID(如分页元素),则 MCID 设置为 -1。

每个MarkedContentElement 都将包含属于它的字母、图像和路径:

        using UglyToad.PdfPig;
        [...]

        using (PdfDocument document = PdfDocument.Open(pathToFile))
        {
            for (int p = 0; p < document.NumberOfPages; p++)
            {
                var page = document.GetPage(p + 1);

                // extract the page's marked content
                var markedContents = page.GetMarkedContents(); 

                var orderedMarkedContents = markedContents
                       .OrderBy(mc => mc.MarkedContentIdentifier);

                foreach (var mc in orderedMarkedContents)
                {
                    // do something
                }
            }
        }

如果您想将结果提取到 XML,您可以查看 PageXmlTextExporter 类。查看wiki 以获取有关ITextExporterIReadingOrderDetector 的更多信息。

注意:我是这个库的积极贡献者。

【讨论】:

  • MCID 只是一个 ID。它通常与阅读顺序平行,因为通常页面上的 MCID 是针对按阅读顺序处理的文本元素增量生成的。但是没有什么是需要的。可以轻松地创建一个 PDF,其中 MCID 意味着完全错误的顺序。
  • 感谢@mkl 的澄清。所以你会只依靠树结构来确定阅读顺序吗?
  • 是的,逻辑结构顺序是通过深度优先遍历页面的逻辑结构层次结构来定义的。