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);
 }
Example #2
0
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);
}
Example #3
0
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);
}