dr.Brain

doctor Brain

мир глазами веб-разработчика

PHP: извлекаем данные из PDF

получаем текстовые и графические данных pdf-документа с помощью PHP

dr.Brain

время чтения 2 мин.

Photo by Gerold Hinzen on Unsplash

Однажды я столкнулся с необходимостью извлечения информации из документа в формате PDF, с дальнейшим преобразованием полученных данных в JSON-объект для их дальнейшей обработки.

Обработка текстовой информации не вызвала никаких проблем. Для извлечения текста разумно использовать pdftotext:

$content = shell_exec('pdftotext -enc UTF-8 -layout input.pdf -');

После этого, я использовал регулярное выражение, чтобы получить данные файла:

$anagrafica = array();

if (preg_match('/^Denominazione\W*(.*)/m', $content, $aDenominazione)) {
     $anagrafica['denominazione'] = $aDenominazione[1];
 }

Но как извлечь данные изображений, не имеющих разметки?

Для этого я применил linux-команду pdftohtml:

$rawImages = shell_exec('pdftohtml -enc UTF-8 -noframes -stdout -xml "'.$this->filePath.'" - | grep image');
$tok = strtok($rawImages,"\r\n");

while ($tok !== false) {
    $oImage = simplexml_load_string($tok);
    $images[] = $oImage;
    $tok = strtok("\r\n");
}

Таким образом, с помощью pdftohtml я сформировал XML-документ с записями для каждого текстового поля и изображения.

Получился массив картинок в виде XML-элементов $rawImages, который я отправил, как SimpleXmlObjects в массив $images.

Затем, я нашел нужные мне изображения по ширине (например, нашел изображения, параметр width которых был равен 77-и пикселям) и отсортировал их по положению по вертикали.

Так же я запросил цвет пикселя в каждой нужной позиции картинки с помощью команды convert библиотеки ImageMagick и сохранил все полученные результаты в JSON-объект.

$color = shell_exec('convert "'.$imagePath.'" -format \'%[pixel:p{100,50}]\' info:- ');

switch ($color) {
    case 'srgb(253,78,83)':
        $anagrafica[$this::chekcs[$pos]]='red';
    break;
    case 'srgb(123,196,78)':
        $anagrafica[$this::chekcs[$pos]]='green';
    break;
    case 'srgb(254,211,80)':
        $anagrafica[$this::chekcs[$pos]]='yellow';
    break;
};

Спасибо за внимание.


Перевод статьи Claudio Fior “Extract data from a PDF”.

Новые публикации

Далее

Категории

О нас

Frontend & Backend. Статьи, обзоры, заметки, код, уроки.