it-swarm.com.ru

Есть ли PDF парсер для PHP?

Привет, я знаю о нескольких PDF генераторах для php (fpdf, dompdf и т.д.) Я хочу знать о парсере.

По независящим от меня причинам определенная информация, которая мне нужна, находится только в таблице внутри PDF .__, и мне нужно извлечь эту таблицу и преобразовать ее в массив.

Какие-либо предложения?

41
elviejo79

Я написал один раньше (для аналогичных потребностей), и я могу сказать это: веселиться. Это довольно сложная задача. PDF спецификация большая и громоздкая. Есть несколько способов хранения текста внутри него. И главное, что каждый PDF генератор отличается тем, как он работает. Таким образом, хотя что-то вроде TFPDF или DOMPDF создает действительно легко читаемые PDF-файлы (с точки зрения компьютера), Acrobat создает некоторые действительно адские документы. 

Причина в том, как он пишет текст. Большинство основанных на DOM средств визуализации - которые я использовал - записывают всю строку как одну строку и размещают ее один раз (что действительно легко читается). Acrobat пытается быть более эффективным (и это так), записывая только один или несколько символов за раз и размещая их независимо. Хотя это действительно упрощает рендеринг, это делает чтение НАМНОГО сложнее. 

Положительным моментом здесь является то, что формат PDF сам по себе очень прост. У вас есть «объекты», которые следуют регулярному синтаксису. Затем вы можете связать их вместе для создания контента. Спецификация хорошо справляется с описанием формата файла. Но чтение в реальном мире займет немного мозгов ...

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

  1. Adobe любит переназначать шрифты. Таким образом, символ 65, скорее всего, не будет A... Вам нужно найти объект карты и определить, что он делает, исходя из того, какие символы там находятся. И это эффективно, поскольку, если символ не появляется в документе для этого шрифта, он не включает его (что усложняет жизнь, если вы пытаетесь программно редактировать PDF) ...
  2. Напишите это как можно более абстрактно. Напишите классы для каждого типа объекта и каждого собственного типа (строки, числа и т.д.). Пусть эти классы разбираются для вас. Там будет немало повторений, но в итоге вы спасете себя, когда поймете, что вам нужно что-то настроить только для одного конкретного типа) ...
  3. Напишите для конкретной версии или двух PDF спецификацию и примените ее. Проверьте номер версии, и, если он выше ожидаемого, внесите залог ... И не пытайтесь «заставить его работать». Если вы хотите поддерживать более новые версии, разбейте спецификацию и обновите парсер оттуда. Не пытайтесь пробовать и ошибаться на своем пути (это не весело) ...
  4. Удачи со сжатыми потоками. Я обнаружил, что обычно вы не можете доверять аргументам длины для проверки того, что вы распаковываете. Иногда (для некоторых генераторов) это работает хорошо ... Другие отключаются на один или несколько байтов. Я просто пытаюсь сдуть его, если фильтр соответствует, а затем принудительно установить длину ...
  5. При тестировании длин не используйте strlen. Используйте функцию mb_strlen($string, '8bit'), поскольку она будет компенсировать различные наборы символов (и разрешать потенциально недопустимые символы в других наборах символов).

В противном случае, удачи ...

29
ircmaxell

Я использую PDFBox для этого ( http://pdfbox.Apache.org/ ). Это программное обеспечение является javabased и не зависит от платформы. Работает быстро и надежно. Вы можете использовать его через exec или Shell или через PHP/Java-Bridge ( http://php-Java-bridge.sourceforge.net/ )

17
Timo

Вы уже смотрели на xPDF ? Там есть программа pdftotext, которая будет выполнять преобразование. Вы можете вызвать его из PHP, а затем прочитать текстовую версию PDF. Вам нужно будет иметь возможность запускать exec () или system () из php, так что это может работать не на всех размещенных решениях. 

Кроме того, на сайте PHP есть несколько примеров , которые преобразуют PDF в текст, хотя он довольно грубый. Вы также можете попробовать некоторые из этих примеров. На этой странице PHP , найдите luc в phpt dot org.

3
ryanday

Посмотрите на GhostScript или ITextSharp, существуют различные кросс-платформенные версии обоих.

1
Mark Redman

Zend_Pdf является частью Zend Framework . В их руководстве говорится:

Компонент Zend_Pdf представляет собой PDF (Формат переносимого документа) манипулирование двигателем. Это может загрузить, создавать, изменять и сохранять документы . Таким образом, это может помочь любому PHP приложению динамически создавать PDF документы с помощью изменение существующих документов или генерировать новые с нуля.

1
Bill Karwin

На самом деле это не может быть таблица внутри PDF, поскольку PDF теряет такую ​​информацию ...

0
mark stephens

Это это PHP PDF парсер, который существует в двух вариантах:

  1. Бесплатная версия может анализировать PDF-файлы до формата PDF 1.5
  2. Коммерческое дополнение может анализировать любой формат PDF (до текущей версии 1.9)
0
lubosdz