spectactor (spectactor) wrote,
spectactor
spectactor

Category:

Дружим PHP и PDF

Задача заключается в следующем - постраничное чтение pdf файла на сервере, отправка клиенту страницы в формате png/jpeg. Я выбрал пакет ImageMagick.. 

Распаковываем архив и делаем ./configure. В конце будет показан список форматов, которые поддерживает ваша система. Недостающие мне  форматы я  дожимал установкой библиотек из исходных текстов в каталог по умолчанию /usr/local : TIFF , JPEG , DJVU. Теперь еще раз делаем так:
./configure LDFLAGS='-L/usr/local/lib -R/usr/local/lib'
make
make install
Скачаем IMAGICK расширение для PHP собираем его так:
phpize
./configure --with-imagick=/usr/local
make
make install
Остается прописать его в php.ini  и перегрузить apache:
extension=imagick.so
Теперь самое интересное, как это работает. Документация по Imagick в PHP крайне убогая и представляет собой скудное описание вида. Но гугление именно по строке "imagick" дало такой результат:
<?
 $pdf = new imagick( 'test1.pdf[19]' );  //   читаем 20ую страницу документа
 $pdf->setImageFormat( "jpeg" );        //   формат вывода
 $pdf->scaleImage(1024,NULL);        //   размер выводимой страницы
 header( "Content-Type: image/jpeg" ); 
 echo $pdf;                                               //  отдаем 20ую страницу клиенту
?>

Есть много способов получения количества страниц в PDF файле. Первый способ для лохов - решение с помощью Imagick, в виду тормозности практического значения не имеет:
 
<?php
$im = new Imagick();
$im->readImage("test1.pdf");
$pages=$im->getIteratorIndex();       
print"$pages";
?>


Второй способ, достаточно быстр.. Юзаем утилиту identify:
 
<?
$CMD="identify /var/www/im/test1.pdf";
echo exec($CMD);
?>

Данный скрипт выведет информацию о 21 страничном PDF файле test1.pdf. Само-собой в системе должен быть установлен Image Magick, а вот расширение для php Imagick - необязательно...
/var/www/im/test1.pdf[20] PDF 420x595 420x595+0+0 16-bit Bilevel DirectClass 1.251MBB 0.000u 0:00.000


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

<?
$handle = fopen($fname, "r");
 $contents = fread($handle, 4096);
 $fl=preg_match("/\/Count \d+/",$contents,$y);
 $y[0]=str_replace("/Count ","",$y[0]);
 $y[0]=$y[0]-1;

echo $y[0];
fclose($handle);
?>

Ну а если и это не помогает, можно попытаться запустить изящный скрипт (контрольный в голову):
 

<?

$cmd="gs -q -sPDFname=/var/www/catalog/kray/test1.pdf pdfpagecount.ps";
echo exec($cmd);

?>

где файл pdfpagecount.ps содержит следующее:
 

/PDFfile PDFname (r) file def

/PageCountString 255 string

def
systemdict /.setsafe known { .setsafe } if
/.show.stdout { (%stdout) (w) file } bind def
/puts { .show.stdout exch writestring } bind def
GS_PDF_ProcSet begin
pdfdict begin
PDFfile
pdfopen begin
/FirstPage where { pop } { /FirstPage 1 def } ifelse
/LastPage where { pop } { /LastPage pdfpagecount def } ifelse
(%%Pages: ) puts
LastPage FirstPage sub 1 add

PageCountString cvs puts

quit

Последние два способа отличаются хорошей скоростью выполнения и, насколько я понимаю, не требуют установки расширения  Imagick и пакета Image Magick.


Очень добротную книгу ImageMagick Tricks: Unleash the power of ImageMagick with this fast, friendly tutorial and tips guide с описанием Image Magick можно скачатьтут

Tags: flash, image magick, imagick, jpeg, pdf, php, png
Subscribe

  • php mssql utf8 debian squeeze из пакетов

    Рассмотрим установку MSSQL для PHP на Debian squeeze: apt-get install libsybdb5 freetds-common php5-sybase apt-get install freetds-bin Настроим…

  • Дружим PHP и DJVU

    Кроме установок Imagick и Image Magick, описанных тут, нам понадобиться установка DJVULibre. Что я делал..../configure --enable-djview…

  • Поддержка MSSQL для PHP в Linux

    Винрарная статья по установке Распаковываем исходник FreeTDS и делаем так: ./configure --enable-msdblib --prefix=/usr/local/freetds make make…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments