在使用Ghostscript处理后,避免对从PDF中提取的文本进行分段

时间:2018-03-29 21:36:05

标签: pdf 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

while 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

1 个答案:

答案 0 :(得分:0)

Ghostscript和pdfwrite设备(如VectorDevices.htm中所述)在生成PDF文件时不会简单地“弄乱”输入。输入(来自任何来源; PDF,PostScript,XPS,PCL,PCL-XL)完全解释为标记操作,那些标记操作被发送到设备,将它们变回PDF结构。

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

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

文本输出不同的原因是,基本上,PDF文件中没有描述单词,段落,列等的“元数据”。当您从PDF文件中提取文本时,实际得到的是一系列字符代码和位置。

它取决于文本提取代码,试图理解它。我猜这个pdftotext正在使用相当天真的方法来假设文本字符串是单词。

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

(Te) Tj
10 0 Td
(st) Tj

或者:

[(Te) 2 (st)] TJ

pdfwrite设备不知道原始内容是什么,因此它发出的内容可能是其中之一,具体取决于某些启发式方法。它与原版匹配的可能性很低。

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

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

与您的其他问题一样,最好在提出这类问题时提供示例,因为如果没有这些问题,那就太多了。

TL; DR

  

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

没有