PHP: извлекаем данные из PDF
получаем текстовые и графические данных pdf-документа с помощью PHP
Однажды я столкнулся с необходимостью извлечения информации из документа в формате 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”.