PDFでOCRを実行しようとしています。コードには2つのステップがあります。
- PDFをTIFFファイルに変換
- TIFFをテキストに変換する
最初のステップでghost4jを使用し、次に2番目のステップでtess4jを使用しました。マルチスレッドで実行を開始するまではすべてうまくいき、その後奇妙な例外が発生しました。私はここを読みました:https : //sourceforge.net/p/tess4j/discussion/1202293/thread/44cc65c5/そのghost4jはマルチスレッドに適していないので、PDFBoxで動作するように最初のステップを変更しました。
だから今私のコードは次のようになります:
PDDocument doc = PDDocument.load(this.bytes);
PDFRenderer pdfRenderer = new PDFRenderer(doc);
BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, 300);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "tiff", os);
os.flush();
os.close();
bufferedImage.flush();
800 kbのpdfファイルを使用してこのコードを実行しようとしています。
BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, 300);
500 MBを超えます。このBufferedImageをディスクに保存すると、出力は1 MBのサイズになります...したがって、このコードを8つのスレッドで実行しようとすると、Javaヒープサイズの例外も発生します...
ここで何が欠けていますか?1 MBのファイルが500 MBの画像ファイルになるのはなぜですか?DPIで遊んで品質を下げようとしましたが、ファイルはまだ非常に大きいです... PDFをtiffにレンダリングできる他のライブラリはありますか?メモリの問題なしに10スレッドを実行できますか?
再現する手順:
- Linkedin CEOの履歴書ファイルをこちらからダウンロードしてください-https://gofile.io/?c= TtA7XQ
私はこのコードを使用しました:
private static void test() throws IOException { printUsedMemory("App started..."); File file = new File("linkedinceoresume.pdf"); try (PDDocument doc = PDDocument.load(file)) { PDFRenderer pdfRenderer = new PDFRenderer(doc); printUsedMemory("Before"); for (int page = 0; page < 1; ++page) { BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(page, 76, ImageType.GRAY); ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, "tiff", os); os.flush(); os.close(); bufferedImage.flush(); } } finally { printUsedMemory("BufferedImage"); } } private static void printUsedMemory(String text) { long freeMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); long mb = freeMemory / 1000000; System.out.println(text + "....Used memory: " + mb + " MB"); }
そして出力は:
アプリ起動.......使用メモリ:42MB
以前....使用メモリ:107 MB
BufferedImage ....使用メモリ:171 MB
この例では、500 MBではなく、70 kbのPDFです。1ページだけをレンダリングしようとすると、メモリが約70 MB増加します...比例しません...
BufferedImage
レンダリング後のサイズを確認できますか?