在掃描的 pdf 檔案中取得可列印的白底黑色文字(刪除灰階或彩色背景)

在掃描的 pdf 檔案中取得可列印的白底黑色文字(刪除灰階或彩色背景)

如何將紙本文件的照片轉換為掃描文件?相關,但不一樣,因為我正在談論 pdf 文件。在連結問題的答案中,圖像處理似乎很複雜,特別是因為它涉及分別處理每個影像: 給定我的 pdf 有數百頁,我期望的解決方案不是處理/編輯圖像,而只是像真實照片和文件一樣掃描數位照片和文檔。我的意思是類似“虛擬掃描器”的東西,其輸入是基於照片的 pdf 或照片集,輸出是“正常”掃描文件。 (還有掃描裁縫工具推薦 - 也這裡- 現在似乎缺少 Linux 版本。


這是不是關於 OCR 和不是關於將圖像轉換為文字。

為了澄清我的意思,我將發布幾個例子。

基於文字的pdf文件,而不是圖像,它們是導出為 pdf 的文字檔案(比如說 docx 或 odt)。它們看起來已經準備好要列印了:

在此輸入影像描述

以上是不是我在這裡討論的內容。

我感興趣的是下面圖像中的pdf,即看起來太像圖像的掃描文字頁面和看起來像數位化文字的掃描文字頁面之間的區別。

第一個由看起來像的圖像組成拍攝的照片書頁數:

在此輸入影像描述

或者

在此輸入影像描述

這樣的副本很難在紙上重新印刷,因為背景也會被印製。

第二個是人們所期望的掃描的文本,並且可以列印:

在此輸入影像描述

或者

在此輸入影像描述

像圖片一樣的 pdf 可能已經經過 OCR 處理並且其文字可搜索,但看起來仍然像(頁面)照片的集合:OCR 不是這裡的問題。

我想要的是“掃描”pdf 的清晰黑白外觀,並刪除照片中正常但列印頁面中不應存在的所有“真實”細節(尤其是陰影)。


正如@vanadium 在評論中註意到的那樣,我是尋找一種可以自動清理文件圖片的軟體解決方案,類似於智慧型手機上的 Google Scan

正如@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 中的「新專案」>「輸入目錄」下。 (我已經安裝了該程式來自購電協議,正如 @N0rbert 在主要答案下的評論中所說。對於他們每個人選擇“灰階和顏色”而不是預設的“黑白”(此處指的是文字)。一一運行列出的過程。在運行最後一頁(“輸出”)之前檢查頁面。

在此輸入影像描述

  1. 從生成的圖像中建立一個新的 pdf。 (首先檢查生成的tif文件是否符合您的要求。)創建新 pdf 的方法有很多。我很快就嘗試過的 GUI 工具再次崩潰或給出奇怪的結果,所以我更喜歡將結果tif文件放在一個單獨的文件夾中,然後運行命令img2pdf *.tif -o out.pdf- 正如所說這裡。 (這可能需要對文件進行正確的命名/編號。更多資訊這裡.)

產生的「自訂」pdf 將小於最初的 pdf,但尺寸減小的百分比會根據我忽略的因素而變化(但我認為應該在步驟 1 中提取初始 pdf 中包含的頁面)他們已經擁有的格式;我認為應該使用jpeg和代替;在終端中使用以在使用上面和下面的命令進行處理之前查看有關格式、dpi 和其他詳細信息的詳細信息)。tifpngpdfimages -list your.pdf

最終的 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>對於特定語言,在命令末尾添加;更多的這裡;還可以看到他們的名字這裡

這是羅馬尼亞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。希望這會有所幫助。

相關內容