【问题标题】:How Adobe Acrobat does break words in PDF documents when copying text?Adobe Acrobat 在复制文本时如何在 PDF 文档中分词?
【发布时间】:2022-08-20 01:32:43
【问题描述】:

PDF 文档不需要在页面内容流中出现空格字符来直观地断词。因此,在字体程序中也可能缺少空格字符的字形。 PDF 兼容的查看器似乎使用字体度量和文本状态来推断适当的字间距宽度,并根据字符定位检查它以在选择/复制文本时添加缺失的空格。不幸的是,PDF specification 似乎没有足够强调在这种情况下如何计算字间距宽度。虽然pdf.js 似乎是hard codesize 用于跟踪断字,但从我的经验测试来看,Acrobat Reader/Pro 似乎使用了不同的方法。什么是这样的启发式?

  • 你想知道Acrobat的内部逻辑是什么?为什么了解 Acrobat 如何对您很重要?如果你得到这些信息,你会用它做什么?
  • 是的,或者比在 pdf.js 中为所有字体硬编码固定值更好的替代逻辑。我会用它在 PDF 操作库中实现它。 Acrobat 是 PDF 参考实现,所以我假设它们的启发式方法往往是规范的。
  • 肯定不规范。但实际上相当不错。但是这些启发式是在他们的专有代码中实现的......
  • 如果不是“规范的”,至少是“可信的”,从某种意义上说,其他实现将倾向于遵循 Acrobat。当然,Acrobat 中使用的确切启发式方法并未公开,但可以发现,或者我们可以找到类似的东西。我尝试了一些方法,比如在字体程序(或 /W 数组)中取一半较小的指标,或者考虑侧向,但它们不适用于某些测试用例。也许间距是平均字形宽度的一小部分:这是一种简单的方法,但到目前为止我还没有尝试过,而是先询问了专家:)
  • 思考(我绝对不会知道) 这不是那么简单。我认为很可能有一些混合策略会考虑多个方面,并且在不同的文档中会有所不同,具体取决于流中公认的排版策略类型。多年来,他们肯定收集了大量文件来改进这种多样化的策略。

标签: pdf text whitespace pdf-viewer pdf-specification


【解决方案1】:

这个问题非常技术性,回答它需要对 Adob​​e Acrobat 内部有一些内部知识,或者在 PDF 文档中实施文本提取,并使用一组与 Adob​​e 结果进行比较的强大测试用例。对于它可能关心的人,假设可以通过推断任意间距宽度并与字形位置进行比较来实现用于文本提取的稳健断词算法,我目前正在测试的启发式如下:

unscaledSpacingWidth=(从/W/Widths 数组获得的非零字形宽度的平均值)/7

其中7 是一个任意常数,它似乎运行良好,并且在我测试的一组有限样本中与 Adob​​e Acrobat 结果匹配得足够接近。这与pdf.js 中的解决方案相比,后者只是选择了0.1 PDF 点的硬编码值。

找到的间距宽度会根据字体大小和其他文本状态上下文进行缩放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多