使用 Ghostscript 处理后避免从 PDF 中提取的文本碎片化

Avoiding fragmenting of text extracted from PDF after processing with Ghostscript

在使用 Ghostscript 处理后,我有时会看到空格将单词分开,就像在 pdftotext 或 PDF 查看器中搜索或选择时看到的那样。可能无关,但异常似乎与渲染字体中的字距调整变化相对应。

有没有办法避免这种情况?

例如,从 GS 9.23(也出现在早期版本中):

gs -sDEVICE=pdfwrite \
   -dNOPAUSE -dQUIET -dPARANOIDSAFER -dBATCH \
   -sOutputFile=./output.pdf input.pdf

摘自pdftotext input.pdf

Review this manual before
operating deep cleaner

同时 pdftotext output.pdf

Re vie w t his m a nua l be fore
ope ra t ing de e p c le a ne r

Ghostscript 和 pdfwrite 设备(如 VectorDevices.htm 中所述)在生成 PDF 文件时不只是 'fiddle' 输入。输入(来自任何来源;PDF、PostScript、XPS、PCL、PCL-XL)被完全解释为标记操作,这些标记操作被发送到设备,设备将它们转回 PDF 结构。

因此描述页面的低级 (PDF) 格式不需要与输入的低级格式有任何关系。特别是您不能期望输入中的 PDF 操作会反映在输出中。

视觉外观将相同(或者应该是,因为这是主要目标),但实际操作将不同。

文本输出不同的原因是,基本上,PDF 文件中没有 'metadata' 描述单词、段落、列等。当您从 PDF 文件中提取文本时,您其实得到的是一系列的字符编码和位置

由文本提取代码来尝试理解这一点。我猜想 pdftotext 使用的是假设文本字符串是单词的相当天真的方法。

这是有问题的,因为有许多不同的方法可以处理 PDF 中的字距调整、对齐和其他间距。你可以这样做:

(Te) Tj
10 0 Td
(st) Tj

或:

[(Te) 2 (st)] TJ

pdfwrite 设备不知道原件是什么,所以它发出的可能是其中之一,这取决于一些试探法。与原版匹配的可能性很小。

我怀疑 pdftotext 会将第一个操作视为 "Te st",将第二个操作视为 "Test"

一个可能的解决方案是使用 Ghostscript 的 txtwrite 设备来提取文本,它可能做得更好。

与您的其他问题一样,在提出此类问题时最好提供示例,因为如果不这样做,就只能靠猜测了。

TL;DR

Is there a way to avoid this?

没有