介紹 早在2009年,我就寫過一篇關於如何索引只支持圖像的PDF文件的文章。當時的任務只是從iFilter中僅包含圖像的PDF文件中提取文本,以便在WIndows環境中對這些文件進行索引。此次任務有些不一樣——向PDF文件中添加文本信息。這種方法的好處是,文件能夠經過標準的Adobe/Microsoft iFilters進行索引,但文本也能夠經過可視化工具(Adobe Reader、Chome、Edge等)進行選擇。 背景 我須要添加OCR信息到數千個PDF文件(存儲在SQL服務器中)。我想建立一個腳本/實用程序,能夠執行天天索引任何新的PDF文件,不包含可搜索文本。搜索了一段時間後,我找到了一個食譜: 使用ghostscript提取個別頁面從PDF到圖像(JPG)文件使用Tesseract提取OCR從圖像存儲提取的文本回PDF 用1 顯然,自從我在2009年最後一次使用Tesseract以來,他們增長了一個新功能:圖像和OCR文本將被導出爲PDF文件。我認爲你須要Tesseract版本4+。因此解決方案看起來很簡單,接下來的批處理文件出如今20分鐘內(見附件項目中的ocrate .bat): 隱藏,收縮,複製Codehtml
set gs="C:\Program Files\gs\gs9.52\bin\gswin64c.exe" set tesseract="\Program Files\Tesseract-OCR\tesseract.exe" if '%1'=='' goto :badParams if '%2'=='' goto :badParams mkdir %temp%\ocr\ set nm=%~n1 SETLOCAL ENABLEDELAYEDEXPANSION rem split pdf into multiple jpeg %gs% -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r300 -dTextAlphaBits=4 -o "%temp%\ocr\ocr_%nm%_%%04d.jpg" -f "%1" rem ocr each jpeg for %%i in (%temp%\ocr\ocr_%nm%_*.jpg) do %tesseract% -l eng "%%i" %%~pni pdf del %temp%\ocr\ocr_%nm%_*.jpg rem combine pdfs set ff=# for %%i in (%temp%\ocr\ocr_%nm%_*.pdf) do set ff=!ff! %%i set ff=%ff:#=% %gs% -dNOPAUSE -dQUIET -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -o "%2" %ff% del %temp%\ocr\ocr_%nm%_*.pdf goto :eof :badParams echo usage %0 pdf-In pdf-Out
如您所見,該腳本執行以下操做 使用GhostScript將單個頁面提取到%temp%\ocr\####. JPG文件中,爲每一個JPG文件運行Tesseract建立一個%temp%\ocr\####. PDF文件使用ghost script將全部PDF文件合併到輸出文件中。 1的問題 很快,解決方案1的問題出如今大型PDF文件(10+頁)上。 很是慢。但我想,既然它是做爲後臺進程運行,只對新文件,也許我能夠接受這個。輸出文件要比源文件大不少不少不少倍。成千上萬的文件-成爲了節目的終結者。 採起2 - HOCR2PDF 其餘人也有一樣的問題。進入HOCR2PDF (https://archive.codeplex.com/?p=hocrtopdf)。顯然,Tesseract除了輸出文本或PDF格式的OCR外,還能夠輸出HOCR文件——有效編碼的HTML文件。因此任務稍微改變了一下 使用GhostScript將PDF文件拆分爲多個JPGs使用tesseract將JPGs轉換爲HOCR文件解析HOCR文件使用PDF庫(iTextShart)添加文本信息到輸出的PDF Take 2 -問題 嗯,HOCR2PDF和我原來的腳本有相似的問題。它仍然很慢,文件仍然很大,儘管只有解決方案1的一半大小。 選3 -期末考試 因此我繼續建立了我本身的項目。 在進行了一些故障排除和性能改進(好比啓用壓縮、爲整個頁面使用單一字體)以後,我發現大小膨脹歸結爲一次iTextShart函數調用 隱藏,複製Codegit
stamp.GetImportedPage(stamp.Reader, pg)
單是這通電話,每頁就增長了3萬美圓。惟一須要它的緣由是爲了得到頁面高度。將此調用替換爲 隱藏,複製Codegithub
stamp.Reader.GetPageSizeWithRotation(pg).Height
尺寸膨脹消失了,令我驚訝的是,輸出文件實際上比源文件更小(多是因爲啓用了壓縮和刪除未使用的對象)。 爲了解決性能問題,我決定使用ThreadPool對每一個頁面併發運行Tesseract。對於較大(10+頁)的文件,性能的提高是很是顯著的。 , 使用的代碼 該項目包含一個帶有公共方法OcrFile的PdfOcr類。用法以下: 隱藏,複製Codeweb
string txt = new PdfOcr().OcrFile(fileIn, fileOut);
這段代碼將對fileIn pdf文件進行OCR,建立fileOut並返回OCR文本。該類可能須要經過改變/分配如下靜態變量來定製: ,,,,GhostScript - GhostScript可執行文件的位置,,,Tesseract可執行文件的位置。,,,,將生成臨時文件的文件夾。,,,tmpPrfx -全部臨時文件的前綴 類和主程序一塊兒存儲在program .cs文件中,主程序有兩個參數——源文件名和目標文件名。,,,,,,,,,,, ,,,,,,,,, 的興趣點 https://github.com/UB-Mannheim/tesseract/wiki https://www.ghostscript.com/download/gsdnld.html - GhostScript二進制文件下載。https://archive.codeplex.com/?p=hocrtopdf - HOCR2PDF .NET實用程序 歷史 最第一版本 本文轉載於:http://www.diyabc.com/frontweb/news1636.html服務器