如何将带有 OCRed 文本的扫描 PDF 转换为不带 OCRed 文本的扫描 PDF?

如何将带有 OCRed 文本的扫描 PDF 转换为不带 OCRed 文本的扫描 PDF?

我有扫描的 PDF 文件,带有低质量的 ORed 文本。

我想要一个没有 OCRed 文本的 PDF 文件。

如何将包含 OCRed 文本的扫描 PDF 转换为不包含 OCRed 文本的扫描 PDF?

我在想有什么方法可以尽可能地恢复OCR之前的原始扫描PDF文件,而不改变每页的宽度和高度以像素为单位,并且不改变每页的每英寸像素数?

某种光栅化再次有帮助吗?光栅化会再次降低图像质量吗?

多次尝试:

  1. 我使用 Evince 中的打印文件,我认为它使用了cups-pdf,它不会删除 OCRed 文本。
  2. 使用以下命令gs也不会删除 OCRed 文本(我想我还没有找到如何gs正确使用):

    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
       -dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf toc.pdf
    

答案1

如果我必须这样做,我将按照以下方式删除 OCR 文本:

首先,您需要知道,PDF 中的 OCR 文本不是,但是一个特殊的文本渲染模式。以下截图来自官方PDF规范列出所有可用的文本渲染模式:

有关更多背景信息,请参阅我在 StackOverflow 上的这些答案:


现在我设想的程序:

0. 备份原始 PDF 文件

’努夫说……

1. 用于qpdf解压缩大部分PDF对象

qpdf是一个漂亮的命令行工具,可将大多数 PDF 转换为更易于通过文本编辑器(或通过 )进行操作的表单sed

qpdf                       \
  --qdf                    \
  --object-streams=disable \
    input.pdf              \
    editable.pdf

2. 搜索PDF代码包含的位置3 Tr

中的所有景点editable.pdf“隐形”的地方(又名既没有填充也没有抚摸) 文本由初始定义标记

3 Tr

将这些更改为现在阅读

1 Tr

这应该会使之前隐藏的文本可见。字形将以粗轮廓显示,覆盖原始扫描页面图像。

它会看起来非常难看。

保存编辑后的 ​​PDF。

3. 将描边操作符Tj和文本更改为“no-ops”TJ

每当准备渲染文本字符串时,负责执行此操作的实际运算符就被命名为Tjor TJ

留意所有这些。将它们替换为tJtj。这会将它们更改为“无操作”:它们在 PDF 源代码中根本没有任何意义; PDF 查看器或处理器都无法“理解”它们。 (替换 PDF 源代码中的内容时请小心不要更改字节数,否则可能会导致它“损坏”。)

保存 PDF 文件。

4.检查PDF文件现在的样子

现在 PDF 看起来应该又“干净”了。重命名的文本运算符对于 PDF 查看器或任何 PDF 解释器都不再具有任何意义。

5. 使用 Ghostscript 创建最终的 PDF

这个命令应该可以达到你想要的效果:

gs                        \
  -o final.pdf            \
  -sDEVICE=pdfwrite       \
  -dPDFSETTINGS=/prepress \
   editable.pdf

最后一步用作editable.pdf输入。它输出final.pdf.输出将删除所有文本痕迹。输入仍然文本,尽管是“不可用”的形式,因为操作符重命名。由于 Ghostscript 无法“理解”重命名的运算符,因此默认情况下它会简单地跳过它们。

答案2

有多种方法可以删除文件中的 ORed 文本。

  1. 从 PDF 导出扫描图像并重新组合它们。您可以使用pdfimages(从包中)提取poppler-utilsconvert(从imagemagick)将它们转换回来:

    pdfimages toc.pdf toctmp
    convert toctmp*.pbm newtoc.pdf
    
  2. 打印为 PDF(支持 PDF cups-pdf

PDF 是一种糟糕的扫描图像格式,但经常使用,因为它可以在一个文件中包含多个页面。然而,存储格式通常是不合适的(对于扫描)JPEG 格式。从 PDF 中恢复原始图像(不存在原始扫描的 PDF 文件)可能无法完成,因为从扫描图像制作 PDF 通常是扫描后质量降低的步骤。您可以尝试使用pdfimage(或)从 PDF 中获取图像,pdftoppm但处理 PDF 中图像的 OCR 软件已经知道如何从这些 PDF 中获取最佳(唯一)质量的图像,您不太可能采取任何措施来改进那。

问题可能出在您的扫描软件上,而不是 OCR 软件上。如果您还有原始材料,请再扫描一份到多页 TIFF(lzw 压缩),这样可以提供比任何包含 JPEG 在内的转换为 PDF 的内容更好的 OCR。

答案3

当我尝试访问链接到您的样本扫描文件早些时候,它对我不起作用。不过,与此同时我下载了它,并仔细查看了它。

1. 用于pdfimages -list研究嵌入图像

如果您运行最新(!)版本的 Poppler 变体pdfimages,您将拥有-list可用的参数。此参数打印 PDF 文件中包含的有用图像列表。这最多最近的版本还会告诉您一些附加信息(例如图像分辨率和压缩比),这些信息以前并不容易获得。

不幸的是,您的 PDF 文件包含一些语法错误,导致输出出现乱码:

kp@mbp:#175536> pdfimages -l 1 -list toc.pdf
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image  2000  2650  icc     1   1  jbig2  no       51 0   300   300 12.4K 1.9%

因此,让我们将<stderr>输出重定向到/dev/null并重试:

kp@mbp:#175536> pdfimages -list toc.pdf 2>/dev/null
page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
   1   0 image  2000  2650  icc     1   1  jbig2  no       51 0   300   300 12.4K 1.9%
   2   1 image  2012  2659  icc     1   1  jbig2  no      616 0   300   301 16.1K 2.5%
   3   2 image  2014  2661  icc     1   1  jbig2  no      696 0   301   300 16.0K 2.4%
   4   3 image  2000  2650  icc     1   1  jbig2  no      778 0   300   300 16.2K 2.5%
   5   4 image  2000  2650  icc     1   1  jbig2  no      855 0   300   300 16.2K 2.5%
   6   5 image  2000  2650  icc     1   1  jbig2  no      938 0   300   300 15.7K 2.4%
   7   6 image  2000  2650  icc     1   1  jbig2  no     1026 0   300   300 15.5K 2.4%
   8   7 image  2022  2667  icc     1   1  jbig2  no     1103 0   300   300 15.7K 2.4%
   9   8 image  2000  2650  icc     1   1  jbig2  no     1190 0   300   300 15.5K 2.4%
  10   9 image  2011  2658  icc     1   1  jbig2  no     1271 0   300   301 15.7K 2.4%
  11  10 image  2000  2650  icc     1   1  jbig2  no     1347 0   300   300 15.7K 2.4%
  12  11 image  2010  2657  icc     1   1  jbig2  no     1429 0   300   300 15.5K 2.4%
  13  12 image  2000  2650  icc     1   1  jbig2  no     1504 0   300   300 16.8K 2.6%
  14  13 image  2000  2650  icc     1   1  jbig2  no     1589 0   300   300 15.4K 2.4%
  15  14 image  2000  2650  icc     1   1  jbig2  no     1666 0   300   300 17.6K 2.7%
  16  15 image  2010  2657  icc     1   1  jbig2  no     1740 0   300   300 18.7K 2.9%
  17  16 image  2006  2654  icc     1   1  jbig2  no     1823 0   300   301 17.7K 2.7%
  18  17 image  2007  2656  icc     1   1  jbig2  no     1905 0   300   300 16.9K 2.6%
  19  18 image  2000  2650  icc     1   1  jbig2  no     1983 0   300   300 16.7K 2.6%
  20  19 image  2000  2650  icc     1   1  jbig2  no     2065 0   300   300 17.4K 2.7%
  21  20 image  2000  2650  icc     1   1  jbig2  no     2148 0   300   300 17.4K 2.7%
  22  21 image  2011  2658  icc     1   1  jbig2  no     2229 0   300   301 17.2K 2.6%
  23  22 image  2006  2654  icc     1   1  jbig2  no     2305 0   300   301 17.5K 2.7%
  24  23 image  2000  2650  icc     1   1  jbig2  no     2377 0   300   300 14.5K 2.2%

该输出意味着:

  • 24页24张图片(编号0--23)(每页1张图片)。
  • 所有图像都具有非常相似的尺寸(宽度/高度)和 300 PPI 的分辨率。
  • 所有图像都使用相同的压缩方法,JBIG2

这些结果让我有信心提出一种不同的方法来从 PDF 中删除 OCR 文本:

  1. 提取所有图像。
  2. 从这些图像创建一个新的 PDF。

2.从PDF中提取所有图像

如果您有最新的 Poppler 版本之一pdfimages,您可以提取 JBIG2 压缩中的图像:

pdfimages -jbig2 toc.pdf toc--

生成的图像文件将带有文件名toc---000.jb2e, toc---000.jb2e, ... (后缀.jb2e)。这些文件中的每一个都应该有另一个文件,名为 toc---000.jb2g, toc---000.jb2g, ... (后缀.jb2g)。

如果您没有得到.jb2e图像,而是.pbm必须使用 ImageMagick 的转换来创建 JPEG:

for i in toc--*.pbm; do
  convert $i ${i/.pbm/.jpg}
done

然而,JPEG 图像将比 JBIG2 图像大得多。 (我试过了:24张图像的JPEG总共15MB,PBM总共15MB,JBIG2总共436KB!)

3. 从提取的图像创建一个新的 PDF

如果您不幸必须转换为 JPEG,现在可以将它们转换为 PDF:

convert toc--*.jpg -density out.pdf

瞧!,您现在有了一个 15 MB 的 PDF 文件没有经过 OCR 处理的文本,您之前有一个 1.6 MB 的 PDF 文件OCR 文本! (但你不会失去太多以前的品质......)


由于我自己的代码pdfimages是从源代码编译的,因此我时不时会遇到错误。目前,它无法正确地将图像提取为 JBIG2 文件。这就是为什么我也无法从它们创建 PDF。但这个 PDF 的大小将与原始toc.pdf大小相似......

答案4

我发现高质量和多层 pdf 的最佳方法是使用inkscapeimg2pdf。我制作了这个快速bash脚本:

#!/bin/bash
mkdir "$1_temp"
cp "$1" "$1_temp"/to_do.pdf
cd "$1_temp"
pdftk to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png
rm *.pdf
ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 - {}.jpg
rm *.pdf
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
rm *.jpg
pdftk *.pdf cat output combined.pdf

相关内容