Linux實用教程:自動批量掃描文件

pythontab發表於2014-05-08

本文將為讀者介紹如何構建一套文件批量掃描系統。為了實現這個目標,我們將使用眾多Linux工具。這種方法具有的優點是,這個過程可以定製,以符合你特定的需求。這為你提供了一套可處理重大任務,又能靈活定製的系統。

我們將著眼於兩種可能的最終產品:每一頁都是原始頁掃描件的PDF檔案,以及含有原始頁文字內容的文字檔案。文字檔案的內容可以搜尋,我們探討了將文字檔案轉換成PDF檔案的若干方法。

本教程具有模組化特點。比如說,如果你在處理一組預先掃描的影像,那麼就可以略過頭幾個步驟,直接進入到使用光學字元識別(OCR)軟體處理影像,或者將它們轉換成PDF檔案。同樣,如果你偏愛使用圖形使用者介面(GUI)工具來處理這個過程的某些環節,也沒有什麼可以阻止你。話雖如此,我們還是儘量讓這個過程的每個環節都可以編寫指令碼,以便實現全面自動化。

我們通過充分使用基於命令列的工具,確保這個專案的每個階段都是可以定製、可以編寫指令碼。

相關資源

Linux機器

掃描器

具體步驟

第1步:安裝SANE

你可以使用程式包管理器,安裝主要的掃描器程式包SANE(Scanner Access Now Easy)。要是你已安裝了SANE,但是掃描器訪問起來還是有困難,網上可能有面向該掃描器的針對特定廠商的SANE後端工具。如果是這種情況,不妨用谷歌搜尋一下。

第2步:找到掃描器

在命令列鍵入scanimage -L命令,檢查一下SANE能否與你的掃描器相容。要是你的掃描器得到支援,文字輸出就會含有裝置名稱。你需要的那部分就是冒號前面的第一個元素。

第3步:掃描影像

鍵入scanimage -d [裝置名稱] > test.pnm,快速測試掃描某個物件。這會使用預設設定來掃描一頁內容。在圖形檢視器中開啟掃描後的檔案,檢查一下。要是遇到了問題,可以新增-v選項,以便排查故障。

第4步:完善scanimage選項

如果你打算使用OCR處理文字,或者不需要顏色,那麼300 DPI解析度和黑白是兩個典型的選項。首先,這縮小了檔案尺寸。scanimage -d [裝置名稱] -format=tiff -mode Lineart -resolution和300 > [檔名稱]是兩個典型的選項。

第5步:建立掃描指令碼

我們將使用進行掃描的命令列字串建立第一個指令碼。使用一個文字編輯器,建立一個名為scan.sh的檔案。新增#!/bin/bash作為頭一行。新增你所用的掃描器系列作為第二行。儲存該檔案。在命令列鍵入chmod +x scan.sh,讓這個指令碼成為可執行指令碼。將./scan.sh鍵入到終端,以便執行它。接下來,我們在必要的階段可以建立諸如此類的額外指令碼。你可以把這些指令碼合併成一個長指令碼,也可以單獨呼叫不同的階段。

第6步:計算裁剪尺寸

用不著為這個階段的旋轉文件而操心。你可以使用程式包管理器,安裝GIMP。在GIMP中開啟掃描後文件,從工具皮膚中選擇裁剪工具。讓裁剪區覆蓋文件的有效部分,然後在裁剪對話方塊中記下裁剪尺寸。如果你打算把迎面頁分割成不同頁面,就要記下適當的頁面尺寸。別在GIMP中進行裁剪,因為我們稍後會從命令列來進行裁剪。

第7步:安裝ImageMagick

使用程式包管理器,將ImageMagick安裝到你的系統上。我們使用convert命令,與這個影像處理器工具進行互動。我們可以用它來旋轉和裁剪影像,還可以用它來分割頁面。要注意:convert在選項前面使用了單破折號。

第8步:裁剪頁面

利用通過使用GIMP獲得的相關引數,執行裁剪任務。鍵入convert [影像名稱] +repage -crop [x width]x[y width]+[x offset]+y[offset] [輸出名稱]。比如說,convert page1.png +repage -crop 2244×3113+1+1 page1_crop.png就會裁剪從上邊和左邊1個畫素開始、尺寸為2244 x 3113的矩形頁面。

第9步:旋轉頁面

如果你不得不雙面掃描頁面,不妨使用ImageMagick來旋轉頁面。convert [輸入名稱] -rotate 90 [輸出名稱]可以完成這項任務。

第10步:分割迎面頁

與之前一樣,使用GIMP的裁剪功能,算出裁剪頁面的確切尺寸。convert page1.tiff +repage -crop 2233×1579+0+1529 page1_a.tiff以及隨後的convert page1.tiff +repage -crop 2233×1546+0+0 page1_b.tiff,可以從兩個迎面頁建立兩個不同的檔案。

第11步:建立預先處理的指令碼

上面是一個示例的預先處理指令碼。它建立了一個名為splits的目錄,然後旋轉每個掃描件,之後將其分割成按順序編號的兩個頁面。最後,它刪除經過旋轉的檔案。儲存它,然後鍵入chmod +x命令,讓它成為可執行指令碼。

第12步:掃描器批處理模式

使用針對多個頁面的-batch系列選項。要是你沒有送紙器,那就新增-batch-prompt選項,以便每次掃描之間加以提示。此外,可以新增-batch=./$page_%03d.tiff,提供以"page"開頭、以帶三個0的數字結尾的檔名稱。

第13步:在掃描器中預先裁剪

你也許能夠在掃描器中裁剪頁面,這可以帶來更小的檔案和更快的操作,因為掃描頭沒必要掃過很遠的距離。使用GIMP中的裁剪工具,在對話方塊中將單位由px(畫素)改成mm(毫米),算出你所需要的尺寸和偏移量。要是結果證明以這種方式獲得的資訊不準確,不妨考慮改用原始的辦法,使用直尺。在scanimage命令列上,額外標誌的格式是-l [左邊] -x [寬度] -t [上邊] -y [高度].

第14步:雙面文件

如果你要掃描雙面文件,使用之前所說的batch選項,但要新增-batch-double選項,以便將頁面數遞增2個。在第二次掃描時,針對另一面,再次進行同一番操作,不過新增-batch-start=2,讓編號遞增。

第15步:將掃描件轉換成PDF

你可以使用ImageMagick,將裝滿掃描後影像的目錄轉換成PDF"書冊"。convert *.tiff output.pdf這個命令會建立一個多頁文件。如果你需要插入標題頁,將其命名為page000.tiff,然後放到該目錄中。

第16步:藉助Tesseract,使用OCR處理文字

不妨在測試頁上試一下OCR引擎。為此,鍵入tesseract [輸入檔名稱] [輸出檔案]。別給輸出檔名稱新增副檔名,因為副檔名會由Tesseract來新增。請注意:Tesseract可以檢測出多列文字和迎面頁。

第17步:OCR批處理

使用下列Bash程式碼,使用OCR處理裝滿掃描後頁面的目錄:for i in *.tiff ; do tesseract $i outtext$i; done;最終結果是一組文字檔案。使用cat *.txt >[輸出文字檔案],將這些檔案結合起來。

第18步:文字格式化

預設情況下,Tesseract會將回車符插入到之前源文字中出現的同一個位置。你可以使用下面這個命令:fmt -u [輸入檔案] > [輸出檔案],重新為文字檔案製作格式。

第19步:在LibreOffice中編輯文字

只要將從前幾個步驟所得的輸出結果剪貼到LibreOffice Writer中。在這個階段,你可以控制編輯,並手動編輯節頭等引數。你甚至可以插入來自原文件的影像。

第20步:從LibreOffice匯出PDF檔案

LibreOffice有一些內建工具,可用於建立PDF檔案。如果你最終敲定了佈局和格式,就進入到File(檔案)>Export as PDF(匯出為PDF檔案)。由此處,點選Export(匯出),為文件取個名稱。

第21步:可以編寫指令碼的PDF建立

使用程式包管理器,安裝iconv、ps2pdf和enscript這幾個程式包。鍵入iconv -f UTF-8 -t ISO-8859-1 -c [輸入文字檔案][輸出文字檔案],準備好文字檔案。鍵入enscript [文字檔案] -p [輸出postscript檔案.ps]。鍵入ps2pdf [.ps檔案],將PostScript轉換成PDF。


相關文章