Извлечение данных из PDF и преобразование в JSON: личный опыт

3dabef41 a1c4 48bc 844c fbede28b13c8 HTML

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

Извлечение Текста из PDF

Для извлечения текстовой информации я использовал утилиту pdftotext, которая позволяет конвертировать содержимое PDF в текстовый формат с поддержкой кодировки UTF-8 и сохранением структуры документа.

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

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

После этого я применил регулярные выражения для извлечения необходимых данных из полученного текста:

$anagrafica = array();

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

Таким образом, текстовая информация была успешно извлечена и сохранена в массиве $anagrafica для дальнейшего использования.

Извлечение Изображений из PDF

Когда дело дошло до обработки изображений, стандартные методы не подошли, так как изображения в PDF не имели явной разметки. Для их извлечения я обратился к утилите pdftohtml, которая позволяет преобразовать PDF в HTML или XML с сохранением всех элементов, включая изображения.

Вот как я это сделал:

$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-документ, содержащий записи для каждого изображения в PDF. Затем я преобразовал эти записи в объекты SimpleXML и добавил их в массив $images.

Обработка Изображений

После того как изображения были извлечены и сохранены, мне нужно было найти нужные изображения по их характеристикам, таким как ширина. Например, я отфильтровал изображения, ширина которых равнялась 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;
}

Эта команда позволяет получить цвет конкретного пикселя на изображении, что помогает определить, какое именно изображение использовать для дальнейшей обработки.

Заключение

Этот подход к извлечению и обработке данных из PDF-документов оказался весьма эффективным. Используя комбинацию утилит pdftotext, pdftohtml и convert из ImageMagick, я смог извлечь и обработать как текстовую информацию, так и изображения без разметки, что позволило мне успешно преобразовать их в JSON-объект для последующей обработки. Надеюсь, этот опыт будет полезен тем, кто столкнется с аналогичной задачей.

Оцените статью