我有扫描的 PDF 文件,带有低质量的 ORed 文本。
我想要一个没有 OCRed 文本的 PDF 文件。
如何将包含 OCRed 文本的扫描 PDF 转换为不包含 OCRed 文本的扫描 PDF?
我在想有什么方法可以尽可能地恢复OCR之前的原始扫描PDF文件,而不改变每页的宽度和高度以像素为单位,并且不改变每页的每英寸像素数?
某种光栅化再次有帮助吗?光栅化会再次降低图像质量吗?
多次尝试:
- 我使用 Evince 中的打印文件,我认为它使用了
cups-pdf
,它不会删除 OCRed 文本。 使用以下命令
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
每当准备渲染文本字符串时,负责执行此操作的实际运算符就被命名为Tj
or TJ
。
留意所有这些。将它们替换为tJ
和tj
。这会将它们更改为“无操作”:它们在 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 文本。
从 PDF 导出扫描图像并重新组合它们。您可以使用
pdfimages
(从包中)提取poppler-utils
和convert
(从imagemagick
)将它们转换回来:pdfimages toc.pdf toctmp convert toctmp*.pbm newtoc.pdf
打印为 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 文本:
- 提取所有图像。
- 从这些图像创建一个新的 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 的最佳方法是使用inkscape
和img2pdf
。我制作了这个快速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