PDFからテキストを認識するためにtesseractを使用していますが、奇妙なエラーに直面しています。エラーは、データ ファイル data/tessdata/eng.traineddata を開く際のエラーです。 TESSDATA_PREFIX 環境変数が "tessdata" ディレクトリの親ディレクトリに設定されていることを確認してください。
これで、このエラーの意味がわかり、パスがデータ フォルダーの親ディレクトリに更新されました。しかし、奇妙なことに、コードを実行したときにこのエラーがすぐに発生するわけではありませんが、10〜15個のpdf(それぞれ約40ページで構成されています)を認識した後にエラーが発生します。このエラーが発生し、プログラムが以前に停止した pdf からプログラムを再度実行すると、別の 10 ~ 15 個の pdf の読み取りでエラーは発生しません。
これは奇妙で、この背後にある理由がわかりません。誰かがこれに直面した場合、またはこの背後にある理由を知っている場合は、コメントしてください.
これは、pdf の特定のページからテキストを認識するために使用する関数です。すべてのpdfの各ページに対してこの関数を呼び出します。
public static void getOCRDataFromPage(PDDocument pdDoc, int page, ArrayList<Characters> ch)
{
TessBaseAPI handle=TessAPI1.TessBaseAPICreate();
TessAPI1.TessBaseAPIInit3(handle, "data", "eng");
try
{
double w=pdDoc.getPage(page-1).getCropBox().getWidth();
double h=pdDoc.getPage(page-1).getCropBox().getHeight();
PDFRenderer pdfRenderer = new PDFRenderer(pdDoc);
BufferedImage image = pdfRenderer.renderImageWithDPI(page-1, 300,ImageType.GRAY);
//image=ImageHelper.convertImageToGrayscale(image);
ImageIOUtil.writeImage(image,"G:/Trial/tempImg.png", 300);
int bpp = image.getColorModel().getPixelSize();
int bytespp = bpp / 8;
int bytespl = (int) Math.ceil(image.getWidth() * bpp / 8.0);
int height = image.getHeight();
int width = image.getWidth();
TessAPI1.TessBaseAPISetImage(handle, ImageIOHelper.convertImageData(image), width, height, bytespp, bytespl);
TessAPI1.TessBaseAPISetPageSegMode(handle, TessPageSegMode.PSM_AUTO);
image.flush();
image=null;
ETEXT_DESC monitor = new ETEXT_DESC();
TessAPI1.TessBaseAPIRecognize(handle, monitor);
TessResultIterator ri = TessAPI1.TessBaseAPIGetIterator(handle);
TessPageIterator pi = TessAPI1.TessResultIteratorGetPageIterator(ri);
TessAPI1.TessPageIteratorBegin(pi);
int level = TessAPI1.TessPageIteratorLevel.RIL_WORD;
ArrayList<Words> wd=new ArrayList<Words>();
do {
Pointer ptr = TessAPI1.TessResultIteratorGetUTF8Text(ri, level);
if(ptr == null || ptr.toString().length()==0)
break;
String word = ptr.getString(0);
TessAPI1.TessDeleteText(ptr);
float confidence = TessAPI1.TessResultIteratorConfidence(ri, level);
IntBuffer leftB = IntBuffer.allocate(1);
IntBuffer topB = IntBuffer.allocate(1);
IntBuffer rightB = IntBuffer.allocate(1);
IntBuffer bottomB = IntBuffer.allocate(1);
TessAPI1.TessPageIteratorBoundingBox(pi, level, leftB, topB, rightB, bottomB);
int left = leftB.get();
int top = topB.get();
int right = rightB.get();
int bottom = bottomB.get();
IntBuffer boldB = IntBuffer.allocate(1);
IntBuffer italicB = IntBuffer.allocate(1);
IntBuffer underlinedB = IntBuffer.allocate(1);
IntBuffer monospaceB = IntBuffer.allocate(1);
IntBuffer serifB = IntBuffer.allocate(1);
IntBuffer smallcapsB = IntBuffer.allocate(1);
IntBuffer pointSizeB = IntBuffer.allocate(1);
IntBuffer fontIdB = IntBuffer.allocate(1);
String fontName = TessAPI1.TessResultIteratorWordFontAttributes(ri, boldB, italicB, underlinedB,
monospaceB, serifB, smallcapsB, pointSizeB, fontIdB);
boolean bold = boldB.get() == TRUE;
boolean italic = italicB.get() == TRUE;
boolean underlined = underlinedB.get() == TRUE;
boolean monospace = monospaceB.get() == TRUE;
boolean serif = serifB.get() == TRUE;
boolean smallcaps = smallcapsB.get() == TRUE;
int pointSize = pointSizeB.get();
int fontId = fontIdB.get();
Words chr=new Words(); // Words is a user-defined class
chr.c=word.concat(" ");
chr.b=bold==true?1:0;
chr.x=left*w/width;
chr.size=pointSize;
chr.name=fontName;
chr.y=top*h/height;
chr.w=(right-left)*w/width;
chr.h=(bottom-top)*h/height;
if(pointSize>1)
wd.add(chr);
} while (TessAPI1.TessPageIteratorNext(pi, level) == TRUE);
sortWords(wd);
wordsToChar(wd,ch);
wd=null;
}
catch(Exception e)
{
System.out.println(e.toString());
e.printStackTrace();
}
finally
{
//TessAPI1.TessBaseAPIClearAdaptiveClassifier(handle);
TessAPI1.TessBaseAPIClearPersistentCache(handle);
TessAPI1.TessBaseAPIClear(handle);
//TessAPI1.TessBaseAPIDelete(handle);
TessAPI1.TessBaseAPIEnd(handle);
handle=null;
}
}
誰かが異常なことを見つけたら、返信してください。