Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Работа с fpdf и ошибка exception
 
 автор: elenaki   (18.09.2015 в 10:35)   письмо автору
 
 

Дали задачу на редактирование pdf-файлов. Их много. Они все разные. После долгих поисков поняла, что аналога pdf-редактора на php не создашь. В лучшем случае можно залепить заплаткой и написать на ней что-то свое. Мне надо:
1. Удалить/скрыть чужой логотип
2. Приклеить свой логотип и некий текст рядом
3. удалить/скрыть чужой адрес в подвале и написать там свой.

В некоторых надо еще убрать одну строку примерно в середине листа. Все это я проделывала в Foxit-editor. И делала бы и дальше, это несложно. Но работа механическая, сильно отвлекает от основной. Особенно, если клиент в офисе и ждет свой договор. Надо все бросать и переключаться от работы с кодом на работу с графикой. А потом долго вспоминать, на чем была остановлена работа с кодом. Как только вспомню, возможно, опять придется все бросить и делать другой договор.

Короче, настала пора автоматизации рутины. Нашла класс fpdf. Только он, вроде бы, разрешает загружать существующий pdf в качестве шаблона, а потом на нем делать изменения. Заклеить шапку и подвал и подставить свои получилось быстро. Немного помучилась с греческими шрифтами. Со строкой в середине листа потратила больше всего времени, она от договора к договору прыгала то вверх то вниз. Пришлось делать выбор при загрузке исходного файла - на одном или на двух листах договор (от этого зависело положение строки, которую надо было скрыть, не задевая соседние).

И тут началось самое противное. От двух из семи контор договоры начали приходить в виде, который fpdf прочитать не может. Редактор открывает. fpdf вылетает с exeption. Я думала, таких будет немного (на 600 договоров нашлось штук 10). Но их все больше. Все новые договоры от этих двух контор приходят в нечитаемом для fpdf виде.

Причем, одна свои договоры клепает в том же fpdf! Я это увидела в свойствах файла. По поиску ошибки нашла, что в платной версии fpdf ее исправили. А мне приходится сначала пропускать файл через PDF-Tools (маленькая бесплатная прога), очищая его от метаданных, и только потом скармливать своему скрипту для замены. Все равно получается быстрее, чем в графическом редакторе, но хотелось бы, чтоб все делал php.

http://www.vankouteren.eu/blog/2009/07/fpdf-error-unable-to-find-xref-table/
Вот обсуждение ошибки. Кто-то пишет, что решил проблему, но решения не дает.


I’ve had this error on certian files and opening with adobe pro and saving worked for some but not all. So I looked at the
code and FPDI uses the first 100 bytes of the PDF file to look for the xref table. I changed this to be the first 200 bytes and 
it worked for all my files.


FPDI - это расширение fpdf как раз для "редактирования". Я так и не смогла найти, где оно читает "первые 100 байт", чтобы сделать их 200. В русском нете вообще ничего не нашла на эту тему. Может, кто-то уже решил?

  Ответить  
 
 автор: elenaki   (18.09.2015 в 15:48)   письмо автору
 
   для: elenaki   (18.09.2015 в 10:35)
 

Нашла, где выбираются первые 100 байт. Исправила на 200. Не помогло.


$cycles = -1;
        $bytesPerCycle = 100;

        fseek($this->_f, $tempPos = $tempPos + $xrefPos + 4); // set the handle directly after the "xref"-keyword
        $data = fread($this->_f, $bytesPerCycle);

        while (($trailerPos = strpos($data, 'trailer', max($bytesPerCycle * $cycles++, 0))) === false && !feof($this->_f)) {
            $data .= fread($this->_f, $bytesPerCycle);
        }

        if ($trailerPos === false) {
            throw new Exception('Trailer keyword not found after xref table');
        }

        $data = ltrim(substr($data, 0, $trailerPos));

        // get Line-Ending
        $found = preg_match_all("/(\r\n|\n|\r)/", substr($data, 0, 100), $m); // check the first 100 bytes for line breaks
        if ($found === 0) {
            throw new Exception('Xref table seems to be corrupted.');
        }

  Ответить  
 
 автор: elenaki   (24.09.2015 в 10:26)   письмо автору
112.8 Кб
 
   для: elenaki   (18.09.2015 в 15:48)
 

Есть подозрение, что версия pdf в импортируемом файле не играет роли. Проблема в мета-данных, которые зашиты внутри файла.

Прикладываю скриншоты со свойствами файлов:
1 - неоптимизированный, скриптом не открывается. (версия 1.7)
2 - пропущен через FoxIt (версия не изменилась - 1.7). Можно даже не выбирать опцию "Оптимизировать" в FoxIT, просто открыть и сохранить, после этого файл открывается скриптом.
3 - пропущен через pdfTools с опцией Remove Meta-data. После него меньше всего инфы остается и файл открывается скриптом, хотя версия и тут 1.7

Вывод: нам мешают мета-данные, и конкретно - опция для быстрого просмотра в интернете. Если бы файл создавался в редакторе, можно было бы попросить не ставить галочку при сохранении на этой опции. Но процесс автоматизирован. Не читаются fpdf-скриптом даже те файлы, которые были им созданы! Не мои, а те, которые нам присылают. Что за бред?

  Ответить  
 
 автор: elenaki   (24.09.2015 в 10:42)   письмо автору
38.4 Кб
 
   для: elenaki   (24.09.2015 в 10:26)
 

Нашла договор от 12/2014 от фирмы, с которой у нас сейчас проблемы. Открывается! Создан fpdf-скриптом, версия pdf ниже - 1.4. Нет опции ускоренного просмотра в интернете. И открывается! Но. На сайте fpdf пишут, что бесплатная версия fpdf не работает с версиями выше 1.4. Значит, пока у них была бесплатная версия, все было хорошо, наша бесплатная ее читала. А как только они купили fpdf, наша бесплатная перестала? Это они таким образом вынуждают покупать? Знаю, скажете 100 евро - ерунда. Но шеф удавится и за эту мелочь.

  Ответить  
 
 автор: elenaki   (29.09.2015 в 18:37)   письмо автору
 
   для: elenaki   (18.09.2015 в 10:35)
 

На сегодняшний день еще две компании что-то сделали со своими сервисами и их договоры перестали читаться скриптом.
Они сговорились, что ли?

Пришлось поднатужиться и прикрутить tcpdf с модулем tcpdi для загрузки "макета" (того pdf, который надо изменить). Она
сложнее, чем fpdf. Но зато все в UTF-8. Пришлось помучиться в поисках нужных шрифтов, но в итоге все заработало и даже
размер получаемого файла удалось уменьшить, а то поначалу получались метровые.
Наверху что-то начали подозревать. Говорят, что-то ты шибко быстро обрабатываешь pdf-ки. Не успеем трубку положить,
сообщив тебе имя клиента, а уже новый архив готов и лежит в папке... Ты, наверно, уже дописала ту программу, о которой
мы мечтали? Пришлось признаться, что дописала, сейчас причешу и выложу.

Сколько же я всего перебрала - tpdf, mpdf, fpdf+fpdi, dompdf, tcpdf просто и tcpdf+tcpdi. Кстати, надо будет его прикрутить и к
другому модулю, который xml-ки читает и pdf-ки из них делает. Там у меня стоял html2pdf, но вдруг перестал понимать шрифт,
выводит вопросики.

  Ответить  
 
 автор: confirm   (30.09.2015 в 00:52)   письмо автору
 
   для: elenaki   (29.09.2015 в 18:37)
 

Используется mPDF v. 6.0, используется исключительно как конвертер подготовленного по шаблону html-кода, и еще ни разу никаких проблем не возникало. Единственное чего не удалось победить в нем это стили списков.

  Ответить  
 
 автор: elenaki   (01.10.2015 в 09:19)   письмо автору
 
   для: confirm   (30.09.2015 в 00:52)
 

У меня была задача по изменению существующего pdf, а это немного другое, чем создать pdf из html.

  Ответить  
 
 автор: confirm   (05.10.2015 в 23:48)   письмо автору
 
   для: elenaki   (01.10.2015 в 09:19)
 

В контексте описанной ошибки это имеет значение?

  Ответить  
 
 автор: elenaki   (06.10.2015 в 10:52)   письмо автору
 
   для: confirm   (05.10.2015 в 23:48)
 

Имеет. Если не открывается сам файл, который должен стать фоном, то никакой новый файл и не создасться.

  Ответить  
 
 автор: confirm   (06.10.2015 в 15:53)   письмо автору
 
   для: elenaki   (06.10.2015 в 10:52)
 

Странный у вас диалог однако, то у вас было проблемой, что ваши документы не может открыть программа, что собственно никак не должно быть связано с тем, из чего был создан документ, то теперь речь о каком-то фоне. Обычно в таких случаях нужно смотреть "не накосячил ли я?", а уж потом не дуркует ли программа.

  Ответить  
 
 автор: elenaki   (06.10.2015 в 20:40)   письмо автору
 
   для: confirm   (06.10.2015 в 15:53)
 

Сначала я использовала одну библиотеку fpdf. Она прекрасно справлялась с договорами всех фирм, кроме двух. Потом их стало 4, а теперь 5.
Пять из шести что-то делают с pdf- ками, что их не может открыть скрипт. А может только после того, как у файла удалят его мета-данные
другой программой. Но меня это не устраивало. Нашла решение - tcpdf в связке с fpdf. Но и эта связка долго отказывалась работать из-за того,
что не совпадали версии. На сайте tcpdf - только две последние версии, а мне нужна была более ранняя. Она нашлась в joomle. Заработала.
И меня тогда не волновало, что я не читаю pdf, а просто беру его целиком и кладу как фон, накладывая сверху заплатки, а поверх заплаток -
свои картинки и надписи. А теперь мне подсунули картинку на фоне, поверх которой идет нужный мне текст. И теперь надо загруженный pdf
читать, разбирать по объектам и сохранять их по отдельности. А это пока не получается. Думаю, из-за того, что грузится исходная pdf- ка
библиотекой, которая не понимает utf-8. А разбирается - другой, которая utf-8 понимает, но не умеет делать импорт. Есть еще одна такая -
mpdf. Она, вроде, и грузит и utf-8 понимает, но ... она не справляется с теми файлами, у которых мета-данные, а таких теперь большинство,
так что отпадает.
Я и не отрицаю, что косячу. Я не пишу скрипт, я пытаюсь интегрировать те, что нахожу, заставляя их делать то, что мне надо.

  Ответить  
 
 автор: elenaki   (05.10.2015 в 10:35)   письмо автору
 
   для: elenaki   (29.09.2015 в 18:37)
 

Прикрутила. Теперь у меня все в одном месте, в смысле, на одной странице. Разделила на 5 табов - 4 формы для обработки разных pdf-ок и в последнем табе список полученных файлов. Больше делать нечего. Нашли ошибку в одном SOAP-сервисе. Написали в поддержку, ждем ответа.

  Ответить  
 
 автор: elenaki   (06.10.2015 в 11:03)   письмо автору
 
   для: elenaki   (05.10.2015 в 10:35)
 

Рано я обрадовалась, что все закончилось. Фирмы-партнеры продолжают изгаляться. Сейчас одна, у которой был очень простой договор - один логотип, много места - изменила форму pdf. Теперь у нее два логотипа, не так много свободного места, но она влепила огромный watermark посередине листа! Его не закрыть заплаткой, текст идет пoверх. Ломаю теперь голову, как его удалить... Программно. В редакторе это секундное дело, один щелчок. Но файл надо открыть, потом сохранить... опять теряю время.

Можно ли как-то исправить pdf, открыв его по fopen()? Там я вижу имя этой картинки и ее размеры. Можно было бы изменить размеры на нулевые. Или в фильтр поставить Alpha=0%, чтоб прoзрачная стала. Или надо вытащить из pdf весь текст и построить таблицу заново, но уже без дурацкого бакграунда.

  Ответить  
 
 автор: elenaki   (06.10.2015 в 14:55)   письмо автору
 
   для: elenaki   (06.10.2015 в 11:03)
 

Нашлась в tcpdf функция _putimages(). Хорошая. Все картинки как корова языком слизала. И противный фон тоже. Но текст вернулся в неизвестной кодировке. Скорее всего, не нашелся шрифт. Надо искать теперь, как вернуть текст в читаемом виде.

  Ответить  
 
 автор: elenaki   (09.10.2015 в 16:14)   письмо автору
 
   для: elenaki   (06.10.2015 в 14:55)
 

Есть два договора от разных фирм, но созданных в одной программе (PDF-Master подсказал).
У одной после использования функции putimages() текст остается читаемым, у другой - нет.
Правда, у первой нет совсем картинок, но это не важно. Я пробовала и другие pdf-ки через
эту функцию пропустить, все читаются. Главное, чтоб была одна страница только, если много,
то ошибку выдает, но с отображением текста это не связано. Текст читается везде. Кроме того,
где нaдо. Что еще можно придумать? Шрифты там самые обычные - Arial и Arial Bold. Поменять
их фирма-партнер не может. Да и не в шрифтах дело.
Не могу понять, где и кто (fpdf или tcpdf) мне меняет встроенные шрифты на Helvetica? Да еще и
<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding/WinAnsiEncoding>> лепит. Зачем???

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования