Tim*_*Tim 10 pdf ghostscript evince
我有一个扫描的 PDF 文件,带有低质量的 OCR 文本。
我想要一个没有 OCR 文本的 PDF 文件。
如何将带有 OCR 文本的扫描 PDF 转换为无 OCR 文本的 PDF?
我在想有什么办法可以在不改变每页的宽度和高度以像素为单位,不改变每页每英寸的像素的情况下,尽可能地恢复OCR之前的原始扫描PDF文件?
某种光栅化再次有帮助吗?光栅化会再次降低图像质量吗?
几种尝试:
cups-pdf
它使用了,它不会删除 OCRed 文本。以下命令 usinggs
也不会删除 OCRed 文本(我想我还没有找到如何gs
正确使用):
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf toc.pdf
Run Code Online (Sandbox Code Playgroud)有多种方法可以去除文件中的 OCR 文本。
从 PDF 导出扫描的图像并重新组合它们。您可以pdfimages
用于提取(从poppler-utils
包中)和convert
(从imagemagick
)将它们转换回:
pdfimages toc.pdf toctmp
convert toctmp*.pbm newtoc.pdf
Run Code Online (Sandbox Code Playgroud)打印为 PDF(支持来自 的 PDF cups-pdf
)
PDF 对于扫描图像来说是一种可怕的格式,但经常使用,因为它可以在一个文件中包含多个页面。然而,存储格式通常是不合适的(对于扫描)JPEG 格式。从 PDF 恢复原始图像(没有原始扫描的 PDF 文件这样的东西)可能无法完成,因为从扫描图像制作 PDF 是最常见的扫描后质量降低步骤。您可以尝试使用pdfimage
(或pdftoppm
)从 PDF 中获取图像,但处理 PDF 图像的OCR 软件已经知道如何从这些 PDF 中获取最佳(唯一)质量的图像,您不太可能采取一些措施来改进那。
问题可能在于您的扫描软件,而不是 OCR 软件。如果您仍然拥有原始材料,请将其再扫描到多页 TIFF(lzw 压缩),这比包含 JPEG 时转换为 PDF 的任何内容都提供更好的 OCR。
如果我必须这样做,我将如何删除 OCR 编辑的文本...
首先,您需要知道,PDF 中经过 OCR 处理的文本不是图层,而是一种特殊的文本渲染模式。以下来自官方 PDF 规范的屏幕截图列出了所有可用的文本渲染模式:
有关更多背景信息,请参阅我在 StackOverflow 上的这些答案:
现在对于我设想的程序:
'nuff 说...
qpdf
解压大部分 PDF 对象qpdf
是一个漂亮的命令行工具,可以将大多数 PDF 转换为更容易通过文本编辑器(或通过sed
)进行操作的形式:
qpdf \
--qdf \
--object-streams=disable \
input.pdf \
editable.pdf
Run Code Online (Sandbox Code Playgroud)
3 Tr
editable.pdf
存在“不可见”(即既未填充也未描边)文本中的所有点都由初始定义标记
3 Tr
Run Code Online (Sandbox Code Playgroud)
将这些更改为现在阅读
1 Tr
Run Code Online (Sandbox Code Playgroud)
这应该使以前隐藏的文本可见。字形将以粗轮廓显示,覆盖原始扫描页面图像。
它看起来会非常难看。
保存编辑后的 PDF。
Tj
和TJ
文本抚摸运营商“无操作”每当准备呈现文本字符串时,负责执行此操作的实际操作符名为Tj
or TJ
。
注意所有这些。用tJ
和替换它们tj
。这会将它们变成“无操作”:它们在 PDF 源代码中根本没有意义;没有 PDF 查看器或处理器会“理解”它们。(在替换 PDF 源代码中的内容时注意不要更改字节数,否则可能会导致它“损坏”。)
保存 PDF 文件。
PDF 现在应该看起来又“干净”了。重命名的文本运算符对于 PDF 查看器和任何 PDF 解释器都没有任何意义。
此命令应该可以实现您想要的:
gs \
-o final.pdf \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
editable.pdf
Run Code Online (Sandbox Code Playgroud)
最后一步editable.pdf
用作输入。它输出final.pdf
. 输出将删除所有文本痕迹。输入仍然有文本,尽管是“无法使用”的形式,因为操作员重命名。由于 Ghostscript 不“理解”重命名的运算符,因此默认情况下它会简单地跳过它们。