За последние 24 часа нас посетили 55478 программистов и 1721 робот. Сейчас ищут 2352 программиста ...

Конвертация PDF в plain text

Тема в разделе "Прочие вопросы по PHP", создана пользователем rusart, 21 сен 2006.

  1. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Необходима помощь!
    Задача:
    Необходимо конвертнуть pdf в plain text или html средствами php. Для этих целей была использована функция-конвертор, найденная на php.net. Эта функция корректно выдирает текст на английском языке, а вот вместо русского выползает нечто вроде:

    Код (Text):
    1. 5ќ««СоШKuzЂќ¦§¬№116?CFg……”РЦиcЂ
    2. Ђћ¶Щя22H‹§Л(HbМьнэ*эYэЮююю[ю–юБюзяVяy%-.|‡‘™ЎҐҐЄЇ¶ЖМЧЭмт
    3. #*,1?GIIMQQUUWZZabhhЂ‚ѓ„Ќ•••?™Ґ©
    4. ¶¶·єєХЯжкт%'/9CCGORRgooprv~§і№Ц
    5. %-
    Жду предложений по поводу решения данной проблемы.
    Исходный код функции-конвертора:
    Код (Text):
    1. <?php
    2. $test = pdf2string("D:/www/search/test.pdf");
    3. echo "$test";
    4.  
    5. # Returns a -1 if uncompression failed
    6. function pdf2string($sourcefile)
    7. {
    8.    $fp = fopen($sourcefile, 'rb');
    9.    $content = fread($fp, filesize($sourcefile));
    10.    fclose($fp);
    11.  
    12.    # Locate all text hidden within the stream and endstream tags
    13.    $searchstart = 'stream';
    14.    $searchend = 'endstream';
    15.    $pdfdocument = "";
    16.  
    17.    $pos = 0;
    18.    $pos2 = 0;
    19.    $startpos = 0;
    20.    # Iterate through each stream block
    21.    while( $pos !== false && $pos2 !== false )
    22.    {
    23.      # Grab beginning and end tag locations if they have not yet been parsed
    24.      $pos = strpos($content, $searchstart, $startpos);
    25.      $pos2 = strpos($content, $searchend, $startpos + 1);
    26.      if( $pos !== false && $pos2 !== false )
    27.      {
    28.          # Extract compressed text from between stream tags and uncompress
    29.          $textsection = substr($content, $pos + strlen($searchstart) + 2, $pos2 - $pos - strlen($searchstart) - 1);
    30.          $data = @gzuncompress($textsection);
    31.          # Clean up text via a special function
    32.          $data = ExtractText($data);
    33.          # Increase our PDF pointer past the section we just read
    34.          $startpos = $pos2 + strlen($searchend) - 1;
    35.          if( $data === false ) { return -1; }
    36.          $pdfdocument = $pdfdocument . $data;
    37.      }
    38.    }
    39.  
    40.    return $pdfdocument;
    41. }
    42.  
    43. function ExtractText($postScriptData)
    44. {
    45.    while( (($textStart = strpos($postScriptData, '(', $textStart)) && ($textEnd = strpos($postScriptData, ')', $textStart + 1)) && substr($postScriptData, $textEnd - 1) != '\\') )
    46.    {
    47.      $plainText .= substr($postScriptData, $textStart + 1, $textEnd - $textStart - 1);
    48.      if( substr($postScriptData, $textEnd + 1, 1) == ']' ) // This adds quite some additional spaces between the words
    49.      {
    50.          $plainText .= ' ';
    51.      }
    52.  
    53.      $textStart = $textStart < $textEnd ? $textEnd : $textStart + 1;
    54.    }
    55.  
    56.    return stripslashes($plainText);
    57. }
    58.  
    59. ?>
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    с перекодировкой поэсперементируйте
     
  3. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Проверено. Перекодировка с использованием mbstring результатов не дала. Были проверены все доступные кодировки.
     
  4. Davil

    Davil Guest

    А как насчет convert_cyr_string() ? Она предназначенна ИМЕННО для кириллицы.
     
  5. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    К сожалению, не подходит.
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    выложи PDF куда-нить. я посмотрю что можно сделать?
     
  7. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    http://lightcms.xost.ru/pub/test.pdf
     
  8. Mavir

    Mavir Guest

    Преобразовать нужно именно этот файл или нужен скрипт на все случаи жизни? Может просто выделить весь текст и вставить в ворд или блокнот :)
     
  9. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Если бы так, задачи не стояло бы. Ее можно уточнить и слегка расширить: необходим скрипт, умеющий выдирать из pdf-а текстовые данные (причем, как на английском, так и на русском).
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    rusart

    там все дело в самом PDF. скрипт выдирает правильно, а вот дальше ...

    я пробовал сгенерировать PDF через fpdf - все нормально читается и выдирается.

    твой PDF получен из MSWORD и что он туда пихает черт его знает. даже штатный pdftotext из набора xpdf непонимает его.

    думаю тут жопа.
     
  11. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Хуже, что даже если взять лицензию от Apache (имеется там такая в pdf), с ней тоже возникнут проблемы. В общем-то проблема уже решена на 80% в самое ближайшее время выложу решение.
     
  12. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    очень интересно, т.к. сам имею часто дела с PDF
     
  13. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Частично (~на 80%) решение имеется здесь:
    http://forum.fatal.ru/viewtopic.php?p=46744

    Для моей задачи данного решения пока достаточно, а доводить времени нет. Я вернусь к ней чуть позже.
     
  14. GHostly_FOX

    GHostly_FOX Активный пользователь

    С нами с:
    30 ноя 2006
    Сообщения:
    6
    Симпатии:
    0
    Народ помогите с той-же проблемой.
    Я уже проверял предложенный вариант решения поставленной задачи, конвертации PDF в текст но у меня в моей PDFине теряются некоторые куски текста.

    И немогу придумать как мне сделать нормальную разбивку по страницам.
     
  15. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Это на грани невозможного, так как PDF - закрытый формат. Единственное 99% решение проблемы - это использовать внешние утилиты. Для Linux - это pdf2html, для win надо поискать. Хотя, если есть время и знания, можно взять какие-нибудь открытые исходники подобных утилит и попробовать портировать их на php. Изврат, конечно, не если получится, человечество тебе будет благодарно. :)