Пользователь
0,0
рейтинг
24 июля 2008 в 13:57

Разработка → И ещё один способ генерации PDF

Навеяно топиком о генрации PDF с помощью ghostscript и Inkscape.

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

Итак, генерация PDF с помощью QT


Не буду повторяться о том что такое PDF, я думаю все и так в курсе. Сразу приступим к делу.

Что нам понадобится:



— Выделенные сервер с возможностью установки своих приложений на linux.
— Библиотека QT 4.4 с модулем qt-webkit. Это мозг нашего приложения.
— Иходный код или уже скомпилированый проект wkhtmltopdf. Это сердце нашего приложения.
— Xvfb Xvfb маленький заменитель Х-сервера. Ресурсов не кушает, но и ничего не показывает. Зато выполняет нужные нам функции.

Немного теории:



Мы собираемся генерировать PDF из HTML, отрендерив HTML страничку с помощью движка HTML-рендеринга webkit и отпечатав её на виртуальный PDF-принтер.

Подготавливаем систему:



1. Запускаем Xvfb для того что бы наше хоть и консольное приложение не требовало подклбючения к X11
#/usr/bin/Xvfb :0 -screen 0 1024x768x24 -ac

Вот тут надо бы прописать это дело в автозагрузку, но я не буду советовать так как линуксы у всех разные и вариантов это сделать много.

2. Я надеюсь что QT уже установлена в системе. А wkhtmltopdf скачан или скомпилирован собственноручно.
Установим его в /usr/bin/wkhtmltopdf

3. Тест.
#DISPLAY=":0.0" wkhtmltopdf habrahabr.ru habr.pdf

Должно заработать :)

Пишем оболочку.



Поскольку для написания моего текущего проекта во всю используется Zend Framework, то компонент будет являться эдаким расширением к нему.
Подробнее об этом можно написать целую статью. Буду надеяться что те, кто до сих пор не поковырялись в нём, наконец-то найдут в себе силы этим заняться.

Вот такой класс:
<?php

class Zfe_PDFGen {
    
    const 
DISPLAY ':1.0';
    const 
CACHEDIR '/application/cache/'// From Document Root
    
const EXEC '/usr/bin/wkhtmltopdf';
    
    private 
$_source;
    
    private 
$_destination;
    
    function 
Zfe_PDFGen($aSource$aDestination){
        
        
$this->setSource($aSource);
        
$this->setDestination($aDestination);

    }    
    
    public function 
setSource($aSource) {
        
$filename = new Zfe_Uuid();
        
$tmpfile $_SERVER['DOCUMENT_ROOT']. self::CACHEDIR $filename ".html";
        
file_put_contents($tmpfile$aSource);
        
$this->_source $tmpfile;
    }
    
    public function 
setDestination($aDestination) {
        
$this->_destination $_SERVER['DOCUMENT_ROOT']. $aDestination;
    }
    
    public function 
generate() {
        
$result '';
        
        
$exec sprintf('DISPLAY="%s" %s %s %s'self::DISPLAYself::EXEC$this->_source$this->_destination);
        
        
exec($exec$result); 
                
        
unlink($this->_source);
        
    }
    
}



Замечу, что для генерации имени файла используется Zfe_UUid (случайный уникальный идентификатор согласно RFC 4122), у вас его конечно не будет, но написать свой генератор, я думаю, не составит труда.

Пример использования

<?php
$fetchview 
= new Zend_View();
$fetchview->addScriptPath($this->view->getScriptPaths());
$result $fetchview->render('index/_mailpdfgen.phtml');
        
$data $result;

$PDF = new Zfe_PDFGen($data'/html/files/test.pdf');
        
$PDF->generate();



Вот, собственно, и всё


Чем это лучше/удобнее? Ну хотя бы тем что ПДФ теперь генерируется из «родного» и «понятного» для любого верстальщика формата.
А главное генерируемый ПДФ выглядит чертовски симпатично. Быстро работает.

Минусов, конечно, тоже хватает.
— Не все имеют свои сервера.
— exec()
— в шаблонах для ПДФок пути к картинкам в тегах и подобных, приходится писать полными или относительно файла шаблона. Что не совсем удобно.
Чиркин Дима @josser
карма
47,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (14)

  • 0
    еще один минус - нубы, такие как я, не смогут использовать ни этот, ни тот вариант генерации PDF.
    • 0
      дануладно! Задавайте вопросы, я всё разясню. Перестанете быть нубом. :)
      • 0
        спасибо, конечно, но не надо. Эти знания мне точно не пригодятся ;) Если вопрос встанет ребром - найму специалиста.
        • 0
          Собственно для спецов эти топики и создаются=)
  • 0
    А поддержка cp1251 имеется? И русские шрифты? ))
    • 0
      Шрифты есть. Всё видно. Для теста можете нажать "Print Preview" в Сафари. Именно так и будет выглядеть сгенерированый HTML.

      Насчёт 1251 - не уверен так как не проверял. Но должно работать. Главное подсунуть корректный html с <meta ... charset=cp1251">

      Ну а вообще - пора бы уже на UTF переходить.. С ним точно проблем нет
  • 0
    ищу php спецов.перспективный проект пишите мне люди
  • 0
    Решил использовать wkhtmltopdf для создания pdf-ок для последующего чтения их на КПК.

    wkhtmltopdf habrahabr.ru habrahabr.pdf -O Portrait -s A6

    Получился мелковатый шрифт правда.
  • 0
    А посоветуйте пожалуйста, чем отрендерить пдф в Qt под Win32 для вывода его например на QLabel?
    • 0
      Ох, я простой пхп-девелопер. За что вы меня так? :))
      • 0
        Ну вдруг приходилось)
        на самом деле не обратил внимания, что хоть Qt но для веба.
  • 0
    > — в шаблонах для ПДФок пути к картинкам в тегах и подобных, приходится писать полными или относительно файла шаблона. Что не совсем удобно.

    Пишу в css и шаблонах все от корня и картинки не показывались.
    Помогло добавления тэга base href='урлсайта' в начало страницы.
  • 0
    Отличный топик! Сам пришел один в один к этому решению, попробовав несколько html2pdf-генераторов! Решил еще погуглить, и вот он — готовый код!))
  • 0
    На гитхабе есть еще готовый phpwkhtmltox еxtension для php, не пробовали его?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.