最近有個專案想抓取PDF的檔案內容,進行檔案rename的動作,因此才開始瞭解Tesseract相關的用法,以下是使用的一些心得。
1. Windows上安裝Tesseract 5.0後,如果想轉移到其他台Windows PC,該PC要先安裝 Visual Studio 2015 的 Visual C++ 可轉散發套件,再將Tesseract安裝的目錄整個zip起來後,在其他台Windows PC上解壓縮後,設定Tesseract相關windows環境變數路徑後,Java程式就可以直接使用。
2. Tesseract程式中辨識資料的路徑與繁體中文語言設定如下:
tesseract.setDatapath("D:\\Tesseract-OCR\\tessdata\\"); tesseract.setLanguage("chi_tra");
3. 不要透過抓取PDF文字後再辨識,因為會抓不到PDF內容文字,要先轉成圖檔(TIFF)後,在進行圖片辨識文字,會比較不會出錯,下面是範例的Code。
private boolean pdfToTiffConverter(String inputPdf, String outputTiff) { int dpi = 300; // the resolution of the output image in DPI boolean result = false; PDDocument document = null; PDFRenderer pdfRenderer = null; BufferedImage image = null; try { File pdfFile = new File(inputPdf); Thread.sleep(100); // wait 100ms for loading pdf to memory to avoid NullPointException document = PDDocument.load(pdfFile); pdfRenderer = new PDFRenderer(document); image = pdfRenderer.renderImageWithDPI(0, dpi); // render the first page of the PDF document ImageIO.write(image, "TIFF", new File(outputTiff)); // write the image to a TIFF file result = true; document.close(); } catch (IOException e) { logger.error(e.getStackTrace()); result = false; } catch (InterruptedException e) { logger.error(e.getStackTrace()); } finally { } return result; } private String tiffOcr(String outputTiff) { String tiffPath = outputTiff; Tesseract tesseract = new Tesseract(); String result = ""; try { tesseract.setDatapath("D:\\Tesseract-OCR\\tessdata\\"); // set the path to the Tesseract data directory tesseract.setLanguage("chi_tra"); result = tesseract.doOCR(new File(tiffPath)); } catch (TesseractException e) { logger.error(e.getStackTrace()); } finally { File imageFile = new File(outputTiff); if(imageFile.exists()) imageFile.delete(); } return result; }
4. import的套件很多,可以參考下面圖片的套件版本。
5. 在Eclipse上運行正常,但匯出成可運行的JAR後,辨識時會出現以下錯誤。javax.imageio.spi.ImageOutputStreamSpi: Provider com.sun.media.imageioimpl.stream.ChannelImageOutputStreamSpi could not be instantiated
解決方式:Eclipse匯出方式需要變更為【copy required libraries into sub-folder....】。
可運行的JAR在執行前,要先把sub-folder的目錄跟可運行的JAR放在同一層執行,這樣才能順利運行。
這個問題花了我5個小時才解決掉,希望對大家有助。
0 意見:
張貼留言