Извлечение текста из PDF с помощью Poppler (C ++) - PullRequest
3 голосов
/ 28 апреля 2010

Я пытаюсь разобраться с Попплером и его (отсутствием) документации.

То, что я хочу сделать, - это очень простая вещь: откройте файл PDF и прочитайте текст в нем. Затем я собираюсь обработать текст, но здесь это не имеет значения.

Итак ... Я видел функцию poppler_page_get_text, и она вроде работает, но я должен указать прямоугольник выбора, что не очень удобно. Разве не существует очень простой функции, которая выводила бы текст PDF по порядку (может, построчно?).

Ответы [ 2 ]

8 голосов
/ 29 апреля 2010

Вы должны иметь возможность установить прямоугольник выбора на pageSize/MediaBox страницы и получить весь текст.

Я должен сказать, потому что прежде чем вы начнете задаваться вопросом, почему вы удивляетесь выводу poppler_page_get_text, вы должны знать, как текст размещается на странице. Вся графика размещается на странице с помощью программы, выраженной в пост-исправлении. Для рендеринга страницы эта программа выполняется на пустой странице.

Операции в программе могут включать в себя изменение цвета, положения, текущей матрицы преобразования, рисование линий, кривые Безье и так далее. Текст размещается рядом текстовых операторов, которые всегда заключены в квадратные скобки BT (начальный текст) и ET (конечный текст). Как или где текст размещается на странице, остается на усмотрение программного обеспечения, генерирующего PDF. Например, для драйверов печати код отвечает на вызовы GDI для DrawString и преобразует это в операции рисования текста.

Если вам повезет, текст на странице выложен в разумном порядке с использованием вменяемого шрифта, но многие программы, которые генерируют PDF, не так добры. Psroff, например, понравилось размещать сначала весь обычный текст, затем курсив, затем жирный текст. Слова могут или не могут быть размещены в порядке чтения. Шрифты могут быть перекодированы так, что 'a' отображается на '{' или что-то еще. Тогда у вас могут быть лигатуры, в которых несколько символов заменены одиночными глифами - наиболее распространенными являются ae, oe, fi, fl и ffl.

Имея все это в виду, процесс извлечения текста определенно нетривиален, так что не удивляйтесь, если увидите результаты низкого качества при извлечении текста.

Раньше я работал над инструментами извлечения текста в Acrobat 1.0 и 2.0 - это настоящая проблема, чтобы получить право.

4 голосов
/ 04 ноября 2013

Только для записей, я использую 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

Пока что я вполне доволен результатом, за исключением массивов и восстановления в виде "электронных таблиц" в чистом тексте, когда одна ячейка может занимать несколько строк. (если кто-то знает, как этого избежать?)

...