Как извлечь текстовый слой и фоновый слой из PDF? - PullRequest
6 голосов
/ 08 сентября 2011

В моем проекте мне нужно сделать PDF Viewer в HTML5 / CSS3, и приложение должно позволять пользователю добавлять комментарии и аннотации.На самом деле, я должен сделать что-то очень похожее на crocodoc.com.

Вначале я думал создать изображения из PDF и позволить пользователю создавать области и оставлять комментарии, связанные с этой областью.К сожалению, клиент хочет также перемещаться по этому PDF и добавлять только комментарии к разрешенным разделам (например, абзацы или выделенный текст).

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

Я пробовал pdftohtml, но вывод не похож на оригинальный документ, который действительно сложен ( пример документа ).Даже этот на самом деле не отражает вывод, но намного лучше, чем pdftohtml.

Я открыт для любых решений, с предпочтением командной строки в Linux.

Ответы [ 5 ]

2 голосов
/ 17 сентября 2011

Я шел по тому же пути, что и вы, с еще более сложными задачами.

После того, как все испробовано, я использовал C # под Mono (так что он работает на Linux) с iTextSharp.

Даже с очень полной библиотекой, такой как iTextSharp, некоторые задачи требовали большого количества проб и ошибок:)

Извлечь текст со страницы очень просто (см. Ниже), однако, если вы намерены сохранить координаты, шрифты и размеры текста, у вас будет больше работы.

int pdf_page = 5;
string page_text = "";

PdfReader reader = new PdfReader("path/to/pdf/file.pdf");
PRTokeniser token = new PRTokeniser(reader.GetPageContent(pdf_page));
while(token.NextToken())
{
    if(token.TokenType == PRTokeniser.TokType.STRING)
    {
        page_text += token.StringValue;
    }
    else if(token.StringValue == "Tj")
    {
        page_text += " ";
    }
}

Выполните Console.WriteLine(token.StringValue) на всех токенах, чтобы увидеть, как абзацы текста структурированы в PDF-файлах. Таким образом, вы можете определить координаты, шрифт, размер шрифта и т. Д.

Дополнительно:

Учитывая задачу, которую вы должны выполнить, у меня есть для вас предложение:

Извлечение текста с координатами, семействами шрифтов и размерами - вся информация о каждом абзаце. Затем к PDF-изображениям и в онлайн-средстве просмотра примените невидимый выбираемый текст поверх абзацев на изображении, где это необходимо.

Таким образом, ваши пользователи могут выбрать часть текста, где это необходимо, без необходимости восстановления всего PDF в html:)

1 голос
/ 21 сентября 2011

Я недавно исследовал и обнаружил собственное PHP-решение для достижения этой цели с помощью FOSS.Класс PHP FPDI можно использовать для импорта документа PDF для использования с классами PHP TCPDF или FPDF , которые предоставляют функциональные возможности для создания и чтения., обновление и написание PDF документов.Лично я предпочитаю TCPDF , поскольку он предоставляет больший набор функций ( TCPDF против FPDF ) , более богатый API ( TCPDF против FPDF ) , другие примеры использования ( TCPDF против FPDF ) иболее активный форум сообщества ( TCPDF против FPDF ) .

Выберите один из вышеупомянутых классов или другой для программной обработки PDFдокументы.Сосредоточив внимание как на текущих, так и на возможных будущих результатах, а также на желаемом опыте пользователя, решите, где (например, сервер - PHP, клиент - JavaScript, оба) и в какой степени (управляемый функцией) Ваша интерактивная логика должна быть реализована.

Лично я бы использовал экземпляр TCPDF, полученный путем импорта документа PDF через FPDI, для итеративной проверки, перевода в общий формат (XML, JSON и т. д.) и сохраните полученное представление в реляционных таблицах, предназначенных для сохранения данных, относящихся к требуемому уровню иерархии и детализации документа.Необходимый уровень детализации часто определяется техническим документом и его упоминанием как текущих, так и возможных будущих результатов.

Примечание: В этом случае я настоятельно рекомендую переводить документы и хранить их вобщий формат для создания слоя абстракции и прозрачности.Например, возможным и непредвиденным будущим результатом может быть предоставление той же функциональности приложения для пользователей, загружающих документы Microsoft Word.Если загруженный документ Microsoft Word не был переведен и сохранен в общем формате, то почти наверняка потребуются обновления API веб-службы и зависимой бизнес-логики.В конечном итоге это приводит к хранению раздутых, неоптимальных данных и неэффективному использованию ресурсов разработки при проектировании, разработке и поддержке нескольких переводчиков.Также было бы неэффективным использование серверных ресурсов для перевода исходящих данных для каждого запроса, в отличие от перевода входящих данных в оптимальный формат только один раз.

Затем я расширил бы таблицы базовых документов, разработав и связав дополнительныетаблицы для сохраняемых данных активов документа, относящихся к функциональным возможностям, таких как:

Версионные дополнения / правки / удаления

  • Что
    • Верхний / нижний колонтитул
    • Текст
      • Исходное значение
      • Новое значение
    • Изображение
      • Страница (ы) (один, много или все)
      • Местоположение (относительный - текстовый якорь, абсолютный - x/ y координаты)
      • Файл (относительный или абсолютный каталог или URL)
    • Кисть (чертеж)
      • Страницы (один, много или все)
      • Местоположение (относительный - текстовый якорь, абсолютный - x / yкоординаты)
      • Форма (координаты х / у для перерисовки линии, квадрата, круга, заданного пользователем и т. д.)
      • Тип (ручка,карандаш, маркер и т. д.)
      • Вес (1px, 3px, 5px и т. д.)
      • Цвет
    • Аннотация
      • Страница
      • Местоположение (относительный - текстовый якорь, абсолютный - координаты х / у)
      • Форма (линия, квадрат, круг, пользователь и т. Д.)
      • Значение (текст аннотации)
    • Комментарий
      • Цель (страница, другой актив текста / изображения / кисти / аннотации, родительский комментарий - многопоточность)
      • Значение (текст комментария)
  • Когда
    • Дата
    • Время
  • Кто
    • Пользователь

Как только некоторые, все или более из документа и его данных об активах сохранятся, я бы спроектировал, задокументировал и разработал API-интерфейс веб-службы PHP, чтобы предоставить функции загрузки CRUD и PDF-документов потребителю пользовательского интерфейса при одновременном усилении ядра. бизнес правила. На данный момент оставшаяся работа теперь лежит на стороне клиента. В настоящее время у меня есть реляционные таблицы, в которых хранятся данные документа и его активов, а также API, предоставляющий потребителю достаточные функциональные возможности, в данном случае клиентский JavaScript.

Теперь я могу проектировать и разрабатывать клиентское приложение с использованием новейших веб-технологий, таких как HTML5, JavaScript и CSS3. Я могу загружать и запрашивать документы PDF с помощью API веб-службы и легко выводить возвращенный общий формат в браузер, однако я решаю (возможно, в данном случае HTML) . Затем я могу использовать 100% нативный JavaScript и / или сторонние библиотеки для функций помощника DOM, создавая векторную графику для обеспечения функций рисования и аннотаций, а также получая доступ и контролируя функциональные и стилистические атрибуты текущего выбранного текста документа и / или изображений. Я могу обеспечить совместную работу в режиме реального времени, используя WebSockets (ранее упомянутый API-интерфейс WebService не применяется) , или с небольшой задержкой, но все еще довольно плавно, используя XMLHttpRequest.

С этого момента небо является пределом, и мяч на вашей площадке!

0 голосов
/ 20 сентября 2011

pdftk - очень хороший инструмент, который так думает (я не знаю, сможет ли он выполнить именно эту задачу).

http://www.pdflabs.com/docs/pdftk-cli-examples/

0 голосов
/ 15 сентября 2011

Существует также очень обширная документация вокруг Zend_PDF () , которая также позволяет загружать и анализировать PDF-документ. Различные элементы PDF могут быть повторены и, следовательно, также преобразованы в HTML5 или что угодно. Вы даже можете вставлять записи с вашего веб-сайта в PDF-файлы и наоборот.

Тем не менее, вам не дали легкое задание. Удачи.

0 голосов
/ 15 сентября 2011

Это трудная задача, которую вы пытаетесь выполнить.

Чтобы прочитать текст из PDF-файла, взгляните на PEAR в PDF_Reader код предложения.

...