tesseract v3.03 使用可搜索文本示例呈现 PDF

Posted

技术标签:

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

从tesseract v3.03 's release note,tesseract 现在支持使用可搜索文本呈现 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。如果你愿意,我可以分享给你我的尝试 那太好了!我怎么联系你? (找不到您的电子邮件) 【参考方案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 方法。

以上是关于tesseract v3.03 使用可搜索文本示例呈现 PDF的主要内容,如果未能解决你的问题,请参考以下文章

Android 中的 Tesseract 字符识别问题(但 iOS 上没有?)

如何使用图像的 tesseract 输出从另一个图像创建可搜索的 pdf

基于Tesseract模块Python实现提取图片中的文字信息(安装+使用教程)

如何 Tesseract 多个 .tif 文件?

如何从python中的图像中删除某些文本?

如何从扫描页面的 PDF 中制作可搜索的 PDF? [关闭]