从tesseract v3.03 's release note,tesseract
现在支持使用可搜索文本呈现PDF输出,但我不知道如何在我的代码中使用此功能。
目前我使用tess-two为我的Android应用程序,然后我只是想知道这个功能可以用于Android吗?
如果你能给我一个使用tesseract
api来渲染pdf的例子,那将会很棒,然后我会尝试为tess-two
库移植缺少的函数。
在此先感谢。
P / s:我可以看到可以处理渲染pdf输出的pdfrenderer文件,但我不知道如何将它应用于基本api。
更新:这是我的尝试:
tesseract::TessResultRenderer* renderer = new tesseract::TessPDFRenderer(nat->api.GetDatapath());
__android_log_print(ANDROID_LOG_ERROR, "Test_tesseract", "data path = %s", nat->api.GetDatapath());
if (!nat->api.ProcessPages(c_file_name, NULL, 0, renderer)) {
__android_log_print(ANDROID_LOG_ERROR, "Test_tesseract", "process page failed");
delete renderer;
return;
}
FILE* fout = fopen(c_pdf_file_name, "wb");
if (fout == NULL) {
__android_log_print(ANDROID_LOG_ERROR, "Test_tesseract", "Cannot create output file %s\n", c_pdf_file_name);
delete renderer;
return;
}
const char* data;
int dataLength;
bool boolValue = renderer->GetOutput(&data, &dataLength);
if (boolValue) {
fwrite(data, 1, dataLength, fout);
if (fout != stdout)
fclose(fout);
else
clearerr(fout);
}else{
__android_log_print(ANDROID_LOG_ERROR, "Test_tesseract", "Cannot get output file");
}
delete renderer;
我的代码在ProcessPages
方法失败了。写入日志后(我在ndk中调试有问题),我发现pdfrender BeginDocument
总是在TessBaseAPI::ProcessPages
的{{1}}方法中返回false:
baseapi.cpp
我想念一些事吗?
P / s:我使用if (renderer && !renderer->BeginDocument(kUnknownTitle)) {
success = false;
}
,而tess-two
更喜欢baseapi
答案 0 :(得分:1)
如下:
TessResultRenderer renderer = api.TessPDFRendererCreate(dataPath);
api.TessBaseAPIProcessPages1(handle, image, null, 0, renderer);
PointerByReference data = new PointerByReference();
IntByReference dataLength = new IntByReference();
api.TessResultRendererGetOutput(renderer, data, dataLength);
byte[] bytes = data.getValue().getByteArray(0, dataLength);
// then write bytes array to a file with PDF extension.
如果您在遵循代码时遇到问题,请查看this post中的渲染器示例。