【问题标题】:tesseract v3.03 render PDF with searchable text exampletesseract v3.03 使用可搜索文本示例呈现 PDF
【发布时间】:2014-03-10 07:01:59
【问题描述】:

tesseract v3.03 's release notetesseract 现在支持使用可搜索文本呈现 PDF 输出,但我不知道如何在我的代码中使用此功能。
目前我在我的 android 应用程序中使用tess-two,那么我只是想知道这个功能是否适用于 android?

如果您能给我一个使用tesseract api 渲染pdf 的示例,那就太好了,然后我将尝试为tess-two 库移植缺少的函数。
提前致谢。

P/s:我可以看到pdfrenderer 文件,它可以处理渲染 pdf 输出,但我不知道如何将它与基本 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 BeginDocumentbaseapi.cppTessBaseAPI::ProcessPages方法中总是返回false:

if (renderer && !renderer->BeginDocument(kUnknownTitle)) {
    success = false;
 }

我错过了什么吗?

P/s:我用tess-two,它更喜欢baseapi而不是capi

【问题讨论】:

  • 嗨@R4j,你设法让它工作了吗?
  • 其实我没时间做完,之前退出了这个项目
  • 我想继续这个,但我似乎找不到在Eclipse中调试本机cpp代码的方法,你用什么程序调试?
  • 我只是写信给 logcat。如果你愿意,我可以分享给你我的尝试
  • 那太好了!我怎么联系你? (找不到您的电子邮件)

标签: android ocr tesseract


【解决方案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 中的渲染器示例。

【讨论】:

  • 我用 android 的实现代码更新了我的问题,但仍然无法正常工作。你能看看这个吗?
  • 看起来正确。它可能是新的Renderer api 的tess-two 实现。
  • 其实tess-two使用原始tesseract源代码,无需修改。他们只是添加了一些类来调用tesseract api。我想知道渲染pdf有什么条件吗?。看完pdfrenderer.cpp后发现pdf.ttfpdf.ttx这两个文件是必须的。我将这些文件添加到 tessdata 文件夹中,BeginDocument 方法现在可以工作了。但是在读取文件时存在一些问题。例如,pix = pixRead(pagename); 总是返回 NULL
  • 您好,我也在使用 tess-two,您成功了吗?
  • @Bruce,我使用 Tesseract 代码存储库中的最新版本 r1111 成功处理了 PNG 和 TIFF 图像,该版本修复了图像文件加载问题并删除了上面列出的一些 API 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2019-01-21
  • 1970-01-01
  • 2015-12-31
相关资源
最近更新 更多