通过 Ghostscript 运行后,PDF 在所有单词中都有一个额外的空白

10 pdf ocr ghostscript

此 PDF 由 Abbyy Finereader 10 制作:

http://ebooks.zeitr.org/from_abbyy.pdf

您可以复制并粘贴第一句话并获得此(非常好的)文本结果:

Der »Bund Deutscher Gymnastik-Schulleiter« wurde am 20. November 1955 anläßlich einer Zusammenkunft der Leiterinnen und Leiter der privaten deutschen Gymnastik-Ausbildungsstätten gegründet。

在使用 Ghostscript 9.02(64 位 Windows)进行一些处理后,我得到了这个文件:

http://ebooks.zeitr.org/after_ghostscript.pdf

现在第一句话看起来很奇怪 - 每个单词的最后一个字符之前都有一个额外的空格。

Der »Bun d Deutscher r GymnastikSchulleiter « wurd eam 20 . 195 年 11 月 5 月

这有一个主要的负面影响,即您无法在 Acrobat Reader 中搜索整个单词。我可以使用以下为 Ghostscript 设置的最小参数来重现效果:

-sDEVICE=pdfwrite ^
-dBATCH ^
-dNOPAUSE ^
-sstdout="myStdOut" ^
-sOutputFile="myDestFile.pdf" ^
 mySourceFile.pdf
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Kur*_*fle 8

我发现这是一个有趣的问题,并仔细研究了一下......

首先,我使用qpdf命令行工具解压缩 PDF 数据流,以便更好地查看两个文件的源代码:

qpdf.exe ^
   --qdf ^
     from_abbyy.pdf ^
     qdf--from_abbyy.pdf

qpdf.exe ^
   --qdf ^
     after_ghostscript.pdf ^
     qdf--after_ghostscript.pdf
Run Code Online (Sandbox Code Playgroud)

查看插入额外空格的第一次出现之一(原始字符串"Bund Deutscher Gymnastik-Schulleiter"变成了"Bun d Deutscher r GymnastikSchulleiter"),我发现以下 PDF 片段:

在 qdf--from_abbyy.pdf 中:

( Deutsche) Tj
0 Tc
(r) Tj
1 0 0 1 143.236 265.140 Tm     %% Tm = 'text matrix' operator
3.569 Tw
0.706 Tc
( Gymnastik-Schulleite) Tj
Run Code Online (Sandbox Code Playgroud)

在 qdf--after_ghostscript.pdf 中:

( Deutsche)Tj
0 Tc
36.235 0 Td                    %% extra Td = 'move text current point' operator
(r)Tj
2.16501 0 Td                   %% Td = 'move text current point' instead of Tm
3.569 Tw
0.706 Tc
( Gymnastik-Schulleite)Tj
Run Code Online (Sandbox Code Playgroud)

为了让您了解此处使用的 PDF 图形运算符的含义,以下是一个简短列表:

Tj - show text
Tc - set character spacing
Tm - set text matrix
Tw - set word spacing
Td - move text current point
Run Code Online (Sandbox Code Playgroud)

如您所见,Ghostscript 将原始Tm文本矩阵)运算符替换为Td移动文本当前点)运算符,并且还添加了一个额外的2.16501 0 Td......我不知道为什么会这样。我将向 Ghostscript 的 bugzilla [*]提交错误报告,看看他们是否有兴趣解决它。

但是请注意,如果我使用 Linux Acrobat Reader 9.4.2 并使用菜单操作"File -> Save as Text...",则不会发生此问题。在这种情况下,没有额外的空格(但有一些额外的换行符)。在 Linux 上也是如此,文本无法正确搜索,并且在执行copy'n'paste时还会显示额外的空格....


[*] 完成后我会在这里更新错误号。


更新:

在对被替换的Tm运算符进行了更多思考之后,我现在认为这不应该是问题的根源。

意识到这一点后,我确实尝试使用 Ghostscript v8.71 而不是 v9.02 进行转换。我该怎么说?v8.71 输出不会出现复制'n'粘贴问题!

这意味着:Ghostscript 9.02 中存在 8.71 中不存在的问题。它很可能与嵌入在输出 PDF 中的字体度量有关。因为上面引用的 PDF 片段在 v8.71 输出中与在 v9.02 输出中相同......

更新 2:

Ghostscript 的 bugzilla 中错误条目的 URL:

更新 3:

此错误似乎已同时修复。我没有看到它发生在我再次测试过的 Ghostscript 版本中:当前的 Git (v9.10GIT) 或 Ghostscript v9.06。


Kur*_*fle 5

如果您将带有文本的页面扫描成 PDF 并在其上运行 OCR 应用程序,则文本将添加到页面中,但“文本渲染模式”设置为不可见。它在那里,但它没有呈现在屏幕上(或者如果打印在纸上)。您看到或打印的是原始扫描图像。

我们如何使不可见的文本可见?

好了,我们可以编辑PDF了……设置文本渲染不可见的PDF代码是这样的:

3 Tr
Run Code Online (Sandbox Code Playgroud)

您无法在原始from_abbyy.pdffrom_ghostscript.pdf 中找到此字符串(尚未),因为部分 PDF 已被压缩。因此,我们在以下帮助下尽可能解压缩它们qpdf

qpdf \
 --qdf \
   from_abbyy.pdf \
   qdf--from_abbyy.pdf

qpdf \
 --qdf \
   after_ghostscript.pdf \
   qdf--after_ghostscript.pdf
Run Code Online (Sandbox Code Playgroud)

现在我们可以很容易地找到上面的字符串(并且每个文件中只有一个出现)。

让我们将其切换到文本渲染的一种可见模式。总的来说,我们可以在这 8 种文本渲染模式中进行选择:

 0 -  fill glyph shapes
 1 -  stroke glyph shapes
 2 -  fill, then stroke glyph shapes
 3 -  neither fill nor stroke glyph shapes (invisible)
 4 -  fill and add to path for clipping glyph shapes
 5 -  stroke glyph shapes and add to path for clipping
 6 -  fill, then stroke glyph shapes and add path for clipping
 7 -  add glyph shapes to path for clipping
Run Code Online (Sandbox Code Playgroud)

如果我使用“填充”模式,则 OCR 中的文本在底层扫描图像之上可能看起来不太好。因此,我更喜欢“中风”变体。所以我只是改变上面的行来阅读

 1 Tr
Run Code Online (Sandbox Code Playgroud)

看着这个修改后的PDF,我不喜欢它,因为默认的线宽对我的口味来说太粗了。此外,轮廓描边的颜色为黑色(默认);我更喜欢红色,以便与最初扫描的形状形成对比。因此,我在这条线的前面添加了一些代码,将线宽设置为四分之一点:

 .25 w
Run Code Online (Sandbox Code Playgroud)

和其他一些将笔触颜色设置为红色:

 1 0 0 RG
Run Code Online (Sandbox Code Playgroud)

现在完整的一行是:

 .25 w 1 0 0 RG 1 Tr
Run Code Online (Sandbox Code Playgroud)

就这样。

请注意,我们的小操作已经损坏了文件,因为它的“TOC”(技术术语:它的xref表)现在将不再有效。尽管如此,Acrobat Reader 或 Acrobat Professional 仍会打开它(甚至不会抱怨)并默默地“修复”文件的外部参照部分。其他 PDF 查看器可能会拒绝该文件,但现在我们不在乎...

以下是结果截图: 缩放到窗口宽度 (第一个屏幕截图放大到窗口宽度。) 放大到 800% (第二个屏幕截图放大到 800%。)

红色轮廓是现在可见的扫描文本,就像我们想要的那样。

我对来自_abbyy.pdfafter_ghostscript.pdf 的两个文件执行了与上述相同的过程。我在 Acrobat Reader 的 2 个不同实例中打开了这两个结果。如果我们让它们都缩放到相同的值并最大化两个窗口,那么很容易通过[alt]+[tab]. 这是揭示两个 PDF 文件之间最细微的渲染差异的好方法。

我的结果是:Ghostscript (v9.02) 的输入和这个文件的输出之间甚至没有一个像素不同。但是,如果您想复制'n'粘贴文本,则有很大的不同......