2010-04-28 10 views
3

Я пытаюсь пройти через Poppler и его (недостаток) документации.Извлечение текста из PDF с помощью Poppler (C++)

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

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

+0

Исходный код poppler включает в себя две простые примеры программ в './cpp/tests', которые иллюстрируют всю функциональность. – Jeroen

ответ

8

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

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

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

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

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

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

+1

Большое спасибо за объяснение. Я думаю, что я начну читать немного более подробно о том, как тогда кодируется PDF. Или попробуйте немного переосмыслить мою стратегию ... :) Приветствия nico – nico

3

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

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

+0

Существует связанный с этим вопрос, касающийся типа таблицы: [программно?] (Http://tackoverflow.com)./вопросы/488089/извлекая столы-из-PDF-файлы, программно). –

 Смежные вопросы

  • Нет связанных вопросов^_^