function pdf2text($filename) { // Read the data from pdf file $infile = @file_get_contents($filename, FILE_BINARY); if (empty($infile)) { return ""; } // Get all text data. $transformations = array(); $texts = array(); // Get the list of all objects. preg_match_all("#obj(.*)endobj#ismU", $infile, $objects); $objects = @$objects[1]; // Select objects with streams. for ($i = 0; $i < count($objects); $i++) { $currentObject = $objects[$i]; // Check if an object includes data stream. if (preg_match("#stream(.*)endstream#ismU", $currentObject, $stream)) { $stream = ltrim($stream[1]); // Check object parameters and look for text data. $options = getObjectOptions($currentObject); // $options = getObjectOptions($currentObject); if (!(empty($options["Length1"]) && empty($options["Type"]) && empty($options["Subtype"]))) { continue; } // So, we have text data. Decode it. $data = getDecodedStream($stream, $options); if (strlen($data)) { if (preg_match_all("#BT(.*)ET#ismU", $data, $textContainers)) { $textContainers = @$textContainers[1]; getDirtyTexts($texts, $textContainers); } else { getCharTransformations($transformations, $data); } } } } // Analyze text blocks taking into account character transformations and return results. return getTextUsingTransformations($texts, $transformations); }
function pdf2text($filename) { $infile = @file_get_contents($filename, FILE_BINARY); if (empty($infile)) { return ""; } $transformations = array(); $texts = array(); preg_match_all("#obj(.*)endobj#ismU", $infile, $objects); $objects = @$objects[1]; for ($i = 0; $i < count($objects); $i++) { $currentObject = $objects[$i]; if (preg_match("#stream(.*)endstream#ismU", $currentObject, $stream)) { $stream = ltrim($stream[1]); $options = getObjectOptions($currentObject); if (!(empty($options["Length1"]) && empty($options["Type"]) && empty($options["Subtype"]))) { continue; } $data = getDecodedStream($stream, $options); if (strlen($data)) { if (preg_match_all("#BT(.*)ET#ismU", $data, $textContainers)) { $textContainers = @$textContainers[1]; getDirtyTexts($texts, $textContainers); } else { getCharTransformations($transformations, $data); } } } } return getTextUsingTransformations($texts, $transformations); }
function pdf2text($filename) { // Читаем данные из pdf-файла в строку, учитываем, что файл может содержать // бинарные потоки. $infile = @file_get_contents($filename, FILE_BINARY); if (empty($infile)) { return ""; } // Проход первый. Нам требуется получить все текстовые данные из файла. // В 1ом проходе мы получаем лишь "грязные" данные, с позиционированием, // с вставками hex и так далее. $transformations = array(); $texts = array(); // Для начала получим список всех объектов из pdf-файла. preg_match_all("#obj(.*)endobj#ismU", $infile, $objects); $objects = @$objects[1]; // Начнём обходить, то что нашли - помимо текста, нам может попасться // много всего интересного и не всегда "вкусного", например, те же шрифты. for ($i = 0; $i < count($objects); $i++) { $currentObject = $objects[$i]; // Проверяем, есть ли в текущем объекте поток данных, почти всегда он // сжат с помощью gzip. if (preg_match("#stream(.*)endstream#ismU", $currentObject, $stream)) { $stream = ltrim($stream[1]); // Читаем параметры данного объекта, нас интересует только текстовые // данные, поэтому делаем минимальные отсечения, чтобы ускорить // выполнения $options = getObjectOptions($currentObject); if (!(empty($options["Length1"]) && empty($options["Type"]) && empty($options["Subtype"]))) { continue; } // Итак, перед нами "возможно" текст, расшифровываем его из бинарного // представления. После этого действия мы имеем дело только с plain text. $data = getDecodedStream($stream, $options); if (strlen($data)) { // Итак, нам нужно найти контейнер текста в текущем потоке. // В случае успеха найденный "грязный" текст отправится к остальным // найденным до этого if (preg_match_all("#BT(.*)ET#ismU", $data, $textContainers)) { $textContainers = @$textContainers[1]; getDirtyTexts($texts, $textContainers); // В противном случае, пытаемся найти символьные трансформации, // которые будем использовать во втором шаге. } else { getCharTransformations($transformations, $data); } } } } // По окончанию первичного парсинга pdf-документа, начинаем разбор полученных // текстовых блоков с учётом символьных трансформаций. По окончанию, возвращаем // полученный результат. return getTextUsingTransformations($texts, $transformations); }