【问题标题】:Extracting text from PDF with Poppler (C++)使用 Poppler (C++) 从 PDF 中提取文本
【发布时间】:2011-02-13 12:01:56
【问题描述】:

我正在尝试了解 Poppler 及其(缺乏)文档。

我想做的是一件非常简单的事情:打开一个 PDF 文件并阅读其中的文本。然后我将处理文本,但这并不重要。

所以...我看到了poppler_page_get_text 函数,它有点工作,但我必须指定一个选择矩形,这不是很方便。不是有一个非常简单的函数可以按顺序输出 PDF 文本(可能是逐行?)。

【问题讨论】:

  • poppler 源代码在./cpp/tests 中包含两个简单的示例程序,说明了所有功能。

标签: c++ pdf text-extraction poppler


【解决方案1】:

您应该可以将选择矩形设置为页面的pageSize/MediaBox并获取所有文本。

我说应该是因为在您开始想知道为什么您会对 poppler_page_get_text 的输出感到惊讶之前,您应该了解文本在页面上的布局方式。所有图形都使用以后缀表示法表示的程序布置在页面上。为了呈现页面,这个程序在一个空白页面上执行。

程序中的操作可以包括,改变颜色,位置,当前变换矩阵,画线,贝塞尔曲线等等。文本由一系列文本运算符布局,这些运算符始终由 BT(开始文本)和 ET(结束文本)括起来。文本在页面上的放置方式或位置由生成 PDF 的软件自行决定。例如,对于打印驱动程序,代码响应 GDI 调用 DrawString 并将其转换为文本绘制操作。

如果你幸运的话,页面上的文本布局合理,字体使用合理,但许多生成 PDF 的程序并不那么好。 Psroff,例如喜欢先放置所有纯文本,然后是斜体文本,然后是粗体文本。单词可能会或可能不会按阅读顺序排列。字体可以重新编码,以便'a' 映射到'{' 或其他。然后,您可能会有多个字符被单个字形替换的连字 - 最常见的是 aeoefiflffl

有了所有这些,提取文本的过程绝对不是微不足道的,所以如果您发现文本提取的质量很差,请不要感到惊讶。

我曾经在 Acrobat 1.0 和 2.0 中使用文本提取工具 - 正确处理是一个真正的挑战。

【讨论】:

  • 非常感谢您的解释。我想我将开始更广泛地阅读有关如何对 PDF 进行编码的内容。或者试着重新考虑一下我的策略...... :) 干杯尼科
【解决方案2】:

为了记录,我现在正在使用 poppler 这个小程序

#include <iostream>

#include "poppler-document.h"
#include "poppler-page.h"
using namespace std;

int main()
{
    poppler::document *doc = poppler::document::load_from_file("./CMI2APIDocV1.4.pdf");
    const int pagesNbr = doc->pages();
    cout << "page count: " << pagesNbr << endl;

    for (int i = 0; i < pagesNbr; ++i)
        cout << doc->create_page(i)->text().to_latin1().c_str() << endl;
}

// g++ -I/usr/include/poppler/cpp/ -c poppler.cpp
// g++ -I/usr/include/poppler/cpp poppler.o  /usr/lib/x86_64-linux-gnu/libpoppler-cpp.a /usr/lib/x86_64-linux-gnu/libpoppler.a /usr/lib/x86_64-linux-gnu/liblcms2.so     /usr/lib/x86_64-linux-gnu/libfontconfig.a /usr/lib/x86_64-linux-gnu/libjpeg.a /usr/lib/x86_64-linux-gnu/libfreetype.a     /usr/lib/x86_64-linux-gnu/libexpat.a /usr/lib/x86_64-linux-gnu/libz.a

到目前为止,我对结果非常满意,除了纯文本中的数组和“电子表格”恢复,有时单个单元格可能跨越多行。 (如果有人知道如何避免这种情况?)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 2011-01-18
相关资源
最近更新 更多