在扫描的 PDF 文件中获取可打印的白色背景黑色文本(删除灰度或彩色背景)

在扫描的 PDF 文件中获取可打印的白色背景黑色文本(删除灰度或彩色背景)

如何将纸质文件的照片转换为扫描文件?是相关的,但并不相同,因为我说的是 pdf 文件。在链接问题的答案中,图像的处理看起来很复杂,特别是因为它涉及到分别处理每个图像:给定我的 pdf 有几百页,我期望的解决方案不是处理/编辑图像,而是像扫描真实照片和文档一样扫描数码照片和文档。我指的是类似“虚拟扫描仪”的东西,它的输入是基于照片的 PDF 或照片集,输出是“普通”扫描文档。(还有扫描裁缝推荐的工具 - 也这里- 现在似乎缺少 Linux 版本。)


这是不是关于OCR和不是关于将图像转换为文本。

为了阐明我的意思,我将发布几个例子。

基于文本的 pdf 文件,不是图像,它们是导出为 pdf 的文本文件(比如 docx 或 odt)。它们看起来可以打印了:

在此处输入图片描述

以上是不是我在此讨论的内容。

我感兴趣的是下面图片中的 pdf,即看起来太像图像的扫描文本页面与看起来像数字化文本的扫描文本页面之间的差异。

第一个是由看起来像拍摄的照片书页数:

在此处输入图片描述

或者

在此处输入图片描述

此类副本几乎无法在纸上重印,因为背景也会被打印。

第二个是人们所期望的扫描文字,并可打印:

在此处输入图片描述

或者

在此处输入图片描述

图片形式的 PDF 可能已经过 OCR 处理,并且其文本可搜索,但仍然看起来像一组(页面)照片:OCR 不是这里的问题。

我想要的是“扫描” PDF 的清晰黑白外观,并删除照片中正常但在打印页面上应该不存在的所有“真实”细节(尤其是阴影)。


正如 @vanadium 在评论中注意到的那样,我寻找一种可以自动清理文档图片的软件解决方案,类似于智能手机上的 Google 扫描

正如@user535733在评论中所说,这里的问题似乎至少在某种程度上是将灰度(扫描/图片)文本变成黑白

答案1

scantailor不再维护,但您仍然可以从源代码构建它并使用它。

但是,那原始存储库需要qt4,在最近的 Ubuntu 版本中不容易安装。您可以使用例如这叉已经适应了qt5

先决条件:

sudo apt install libjpeg-dev zlib1g-dev libpng-dev libtiff-dev libboost-dev libxrender-dev libboost-all-dev

安装:

git clone https://github.com/victl/scantailor
cd scantailor
cmake .
make
sudo make install

免责声明:我不认识这个分支的维护者,也无法评价他的版本的安全性。


另外一个选择将会使用Scantailor 高级版snap。您可以通过...安装它

sudo snap install scantailor-advanced

... 或者扁平包装

...或者通过苯甲酸

sudo add-apt-repository ppa:alex-p/scantailor
sudo apt update
sudo apt install scantailor # or scantailor-advanced

快速测试:

在此处输入图片描述

答案2

作为 PDF 上的直接解决方案(无需手动提取图像):

使用ocrmypdf恢复 OCR(如文章末尾所述)补充这个答案的一部分)我注意到ocrmypdf -h显示的选项听起来就像所问的一样:

--remove-background Attempt to remove background from gray or color pages, setting it to white

初始 pdf 已经有 OCR,除非使用以下选项之一,否则会出现错误:

-f, --force-ocr Rasterize any text or vector objects on each page, apply OCR, and save the rastered output (this rewrites the PDF)

或者

-s, --skip-text Skip OCR on any pages that already contain text, but include the page in final output; useful for PDFs that contain a mix of images, text pages, and/or previously OCRed pages

如果将上述每个步骤分别应用到我的一个包含数百页且已经有 OCR 功能的大文件上,会导致进程崩溃。

最佳解决方案我觉得首先打印为 pdf初始文件(删除 OCR),然后执行

ocrmypdf input.pdf output.pdf -l <LANG> --remove-background -v

对于英语,-l不需要该选项。-v用于终端中的详细信息。

得到的 pdf 比输入的要大(因为选项--remove-background):按照下面的说法减小尺寸。


关于 Scan Tailor,作为主要答案

甚至它的图标也说明了它的用途正是如此:

![在此处输入图片描述

以下是如何使用 Scan Tailor 处理 PDF:

  1. 将所有 pdf 页面提取为图像文件- 因为这个工具不直接处理 pdf,需要图像。Master PDF Editor 可以做到这一点,但在我的计算机上,它在提取大约 80 张图像后崩溃了。但它仍然可以通过设置要提取的新批次/范围的页面来使用。(PDF Mod 在任何处理之前就崩溃了)。经过几次尝试,我更喜欢 CLI 可靠但速度较慢的方法,使用如下命令:pdftoppm MY_PDF.pdf NAME -tiff- 如前所述这里. — 可以使用其他变量代替tiff(提供tif文件),例如pngjpeg。请参阅此处的一组 Dolphin 服务菜单操作,了解各种提取选项:
[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=pdf;tif;jpeg;
X-KDE-Submenu=PDF action: EXTRACT ALL pages
Icon=application-pdf

[Desktop Action pdf]
Name=Extract pages as pdf
Icon=application-pdf
Exec=bash -c 'pdf=$(pdftk "%u" burst); kdialog --title "Extract pages" --msgbox "Extracted! $pdf";';

[Desktop Action tif]
Name=Extract pages as tif
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(pdftoppm "$f" "${f%%.*}" -tiff); kdialog --title "Extract pages" --msgbox "Extracted! $pdf";';


[Desktop Action jpeg]
Name=Extract pages as jpeg
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(pdftoppm "$f" "${f%%.*}" -jpeg); kdialog --title "Extract pages" --msgbox "Extracted! $pdf";';
  1. 在 Scan Tailor 中加载并处理生成的图像。将生成的图像文件放在单独的文件夹中,然后将该文件夹添加到 Scan Tailor 中的“新建项目”>“输入目录”下。(我已经安装了该程序来自 PPA,正如@N0rbert 在主要答案下的评论中所说。)如果对于他们每个人选择“灰度和彩色”,而不是默认的“黑白”(此处指的是文本)。逐一运行列出的程序。在运行最后一个程序(“输出”)之前,请检查页面。

在此处输入图片描述

  1. 使用生成的图像创建新的 PDF。(首先检查生成的tif文件是否符合您的要求。)有很多方法可以创建新的 pdf。同样,我尝试过的 GUI 工具很快就崩溃了或给出了奇怪的结果,所以我更喜欢将生成的文件放在tif单独的文件夹中,然后在那里运行命令img2pdf *.tif -o out.pdf- 如上所述这里(这可能需要对文件进行适当的命名/编号。更多信息这里

生成的“定制”pdf 将比初始 pdf 小,但尺寸缩小的百分比取决于我忽略的因素(但我认为初始 pdf 中包含的页面应该在步骤 1 中提取 - 以它们已有的格式;我认为应该使用jpegtif而不是pngpdfimages -list your.pdf在使用上面和下面的命令进行处理之前,在终端中使用以查看有关格式、dpi 和其他详细信息的详细信息)。

可以使用以下命令进一步缩小最终的 pdf:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

更多详细信息,这里

以下是基于上述链接的一组 Dolphin 服务菜单操作:

[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=shrink;shrink0;shrink1;shrink2;
X-KDE-Submenu=PDF action: SHRINK
Icon=application-pdf

[Desktop Action shrink]
Name=Shrink pdf to "printer" size, 300dpi
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/printer    -sOutputFile="${f%.pdf}_printer.pdf" "$f"); kdialog --title "Shrink" --msgbox "Done! $pdf";';

[Desktop Action shrink0]
Name=Shrink pdf to "prepress" size, 300dpi
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress    -sOutputFile="${f%.pdf}_prepress.pdf" "$f"); kdialog --title "Shrink" --msgbox "Done! $pdf";';


[Desktop Action shrink1]
Name=Shrink pdf to "ebook size, 150dpi
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook    -sOutputFile="${f%.pdf}_small.pdf" "$f"); kdialog --title "Shrink" --msgbox "Done! $pdf";';

[Desktop Action shrink2]
Name=Shrink pdf to "screen" size, 72dpi
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/screen    -sOutputFile="${f%.pdf}_smaller.pdf" "$f"); kdialog --title "Shrink" --msgbox "Done! $pdf";';

我得到了一些帮助也回答。


OCR(文本搜索和复制功能)丢失在上述过程中,如果初始 PDF 中存在。为了获得 OCR,使用 ocrmypdf input.pdf output.pdf 英语,正如所说这里。对于其他语言,请使用 查找apt-cache search tesseract-ocr并安装。-l <LANG>在特定语言的命令末尾添加;more这里;另见其名字这里

这是罗马尼亚语 OCR 的 Dolphin 服务菜单操作,有两个选项(一个在终端中显示进度并固定输出名称,另一个在后台处理但输出名称基于输入;我希望在终端中同时显示进程和基于输入的输出名称,但不知道如何操作;如果有人可以做到,请在此处发帖!)。对于英语,请替换“罗马尼亚语”并删除变量-l ron

[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=ocr1;ocr2;
X-KDE-Submenu=PDF action: apply OCR
Icon=application-pdf

[Desktop Action ocr1]
Name=Apply OCR Romanian (see progress in terminal; output name: ocr_ro.pdf!)
Icon=application-pdf
Exec=konsole --noclose -e ocrmypdf "%u" ocr_ro.pdf -l ron

[Desktop Action ocr2]
Name=Apply OCR Romanian (backgroud process: NO terminal! input>output name)
Icon=application-pdf
Exec=bash -c 'f="%u"; ocrmypdf "$f" "${f%.pdf}_ocr.pdf" -l ron;'

(提取和处理图像以及“打印为 pdf”会删除 OCR,但会使用上述 ghostscript 减小尺寸才不是,因此可以在 OCR 之前或之后应用“收缩”。)

答案3

我使用 imageMagick 和以下脚本得到了很好的结果http://www.fmwconcepts.com/imagemagick/shadowhighlight/index.php

这是使用以下参数的结果:

./shadowhighlight -ma 100 -sa 100 -ha 00 -hw 0 -bc 20 inputFile.png OutputFile.png

在此处输入图片描述

答案4

只需安装 Gimp(最好使用 appimage)。以下是选项:

  1. 选择颜色>阈值,完成后您的图像将变成黑白。为此,您必须对每一页都执行此操作

第二个选项 2)选择图像>模式>索引>使用黑白 1 位调色板

您的 PDF 可能包含任意数量的页面,这将全部转换为 1 位黑白。

2021 年 2 月 11 日编辑:根据西皮里库斯

以下是我遵循的步骤:

  1. 使用“简单扫描”或 Xsane 扫描页面。(我发现简单扫描在彩色方面效果更好)或者使用已经可用的扫描 PDF。
  2. 文件>打开或将 pdf 文件拖放到 GIMP 中。在这里您需要提供所需图像的宽度 X 高度。(检查您需要的 dpi 是 150 dpi 还是 300 dpi,相应地提供宽度值)
  3. 现在,包含 1 多页的 pdf 文件以图层形式打开。
  4. 转到图像>模式>索引>使用黑白 1 位调色板
  5. 现在我使用文件>“导出为”导出 pdf
  6. 检查导出的 pdf 的每一页是否符合要求。如果不符合要求,我会使用以下方法单独处理每个有缺陷的页面:a) 选择图像>模式>灰度 b)(如果页面上的灰色/噪音太多)选择颜色>曝光并根据需要进行调整。c) 选择颜色>阈值,完成后您的图像将变成黑白。为此,您必须对每个有缺陷的页面执行此操作以达到所需的质量。d) 现在我将这个编辑过的页面插入原始 pdf 文件层的这一层并删除有缺陷的页面层。然后再次导出 pdf。希望这会有所帮助。

相关内容