我正在努力通过流行音乐及其(缺乏)文档。

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

所以...我看到了 poppler_page_get_text 功能和它的作品,但是我必须指定一个选择矩形,这不是很方便。难道不是只有一个非常简单的函数,它会按顺序输出PDF文本(也许是行?)。

有帮助吗?

解决方案

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

我说应该是因为在您开始想知道为什么您会对输出感到惊讶 poppler_page_get_text, ,您应该知道如何在页面上布置文本。所有图形均在页面上使用以固定后表示法表示。要渲染页面,该程序在空白页面上执行。

该程序中的操作可以包括,更改颜色,位置,当前转换矩阵,图形线,Bezier曲线等。文本由一系列文本运算符编写,这些文本运算符始终由BT(开始文本)和ET(END TEXT)包围。将文本放在页面上的方式或位置是由生成PDF的软件自行决定的。例如,对于打印驱动程序,代码响应GDI的电话 DrawString 并将其转换为文本绘图操作。

如果幸运的话,页面上的文本以理智的字体使用以理智的顺序布置,但是许多生成PDF的程序并不那么友善。 Psroff, ,例如,喜欢首先放置所有纯文本,然后是斜文本,然后是大胆文本。单词可能会按阅读顺序放置也可能不会。字体可能会重新编码,以便 'a' 地图 '{' 管他呢。然后,您可能会有连接性,其中多个字符被单一字形代替 - 最常见的是 ae, oe, fi, fl, , 和 ffl.

有了所有这些,提取文本的过程绝对是非平凡的,因此,如果您看到文本提取的质量差,请不要感到惊讶。

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

其他提示

只是为了记录,我正在使用 流行音乐 现在有了这个小程序

#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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top