Я длительное время использовал MPDF, но он медленный, поэтому изучал альтернативы, тестировал разные варианты. Ещё один интересный сопособ: рендрить с помощью Node и PhantomJS: www.npmjs.com/package/phantomjs-pdf
Но я в итоге остановился на wkhtmltopdf. Расскажу свой опыт.
Во-первых, есть готовая обёртка на PHP: github.com/mikehaertl/phpwkhtmltopdf (сам ей не пользуюсь, у меня простая задача, все аргументы зафиксированы, нет смысла в этой обёртке)
Во-вторых, генерировать временный html файл на диске не обязательно, wkhtmltopdf умеет принимать исходный html через stdin, если указать параметр "-" (прочерк). На PHP получается как-то так:
$descriptorspec = [
0 => ['pipe', 'r']; //stdin
1 => ['pipe', 'w']; //stdout
2 => ['pipe', 'w']; //stderr
];
//Обратите внимание на аргументы, которые я передаю при запуске wkthmltopdf
//--disable-smart-shrinking без этого аргумента, всё становится каких-то не правильных пропорций
//--dpi 96 если принудительно не поставить dpi, то размеры указанные в css в милиметрах на печати будут совсем не такими!
//- последний аргумент это прочерк, чтобы передать html через stdin
//bypass_shell (только для Windows): при установке в TRUE процесс будет запущен в обход оболочки cmd.exe
//это нужно для обхода бага https://bugs.php.net/bug.php?id=60181 "proc_open fails to read quoted whitespaced directories in Windows"
$process = proc_open("/path/to/wkthmltopdf --disable-smart-shrinking --margin-left 20mm --dpi 96 -", $descriptorspec, $pipes, null, null, ['bypass_shell' => true]);
if (is_resource($process)) {
//Пишем в stdin html контейнт
fwrite($pipes[0], $html);
fclose($pipes[0]);
//Читаем результаты и ошибки, если они вам нужны в приложении
$stdOut = stream_get_contents($pipes[1]);
$stdErr = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
$exitCode= proc_close($process);
}
Но я использую другой подход: есть отдельный windows сервер, на котором запускается wkthmltopdf, а обращение идёт к нему через простенький самописный веб-сервис: принимает html контент в POST и возвращает готовый PDF — так и живём.
Вообще по wkhtmltopdf активность на github почти нулевая, баги не фиксятся, но ничего лучше пока не нашел. Кто знает C++ — присоединяйтесь к проекту, внесите свой вклад в opensource!
Это интересно, расскажите подробнее, в чём причины такой высокой скорости компиляции Delphi? Сам язык значительно проще или есть и другие существенные факторы?
Новость отличная, но из этого поста так и не понял, в чём конкретно профит? Я и раньше мог пользоваться git на windows. Полез смотреть по ссылкам, вот более подробное описание: groups.google.com/forum/m/#!topic/git-for-windows/Pc-0uI6KEAc
Это всё конечно круто, вернее, это лучше чем ничего, но вся эта синхронизация и переходы между продуктами по ссылкам с номерами тикетов и коммитов туда-сюда выглядят костыльно.
Вот крутой план: даёшь единый продукт! Чтобы YouTrack + TeamCity + Upsource + какя-нибудь wiki ala confluence + функционал хостинга репозиториев типа gitlab/github enterprise/stash = JetBrains Ultimate App! И всё это чтобы было написано на Kotlin, работало быстро, без багов, с возможностью использовать разные backend СУБД (Oracle,Postgree,MySQL,MSSQL,Mongo,Rethink...), с удобным инсталлятором standalone версии (которая сама бы обновлялась) и с облачным сервисом!
Вопрос по YouTrack возник: раньше видел на самом сайте YouTrack упоминание, что он создан с помощью MPS, теперь этого упоминания нет. Хотя на самом сайте MPS такой абзац остался (https://www.jetbrains.com/mps/). Вы всё ещё используете MPS в YouTrack? А теперь пишете новую версию YouTrack на Kotlin — т.е. MPS оказался не так удобен?
Из реальной жизни: есть класс описывающий выпадающий список HtmlSelect. Конструктор принимает массив опций. Но иногда не хочется прям так сразу готовить этот массив опций (делать запросы к базе, например). Вместо этого передадим в анонимную функцию, которая умеет строить и возвращать массив опций. А внутри HtmlSelect::render() мы проверим, запускать ли функцию или у нас на руках готовый массив значений. Эдакий DependencyInjection для бедных — вместо целого сервиса предоставляющего список опций мы передаём либо готовые опции (допустим, примитивные [1=>'Yes', 0=>'No']), либо функцию.
Приложение и генераторы были преобразованы в PSR-2. Самые большие изменения в текущем стиле Laravel — это вложенность пространств имен и структур управления, которые теперь пойдут по тот же ветке.
The app and generators have been converted to PSR-2. The biggest change from current Laravel style is tabs to spaces and control structures will now go on the same line.
Кстати, я в основном программирую на PHP. Какое-то время назад заинтересовался Clojure, посмотрел лекции Рича Хикки, купил книжечку, читаю (люблю сначала толстую книжку прочитать). И тут в статье:
Но я в итоге остановился на wkhtmltopdf. Расскажу свой опыт.
Во-первых, есть готовая обёртка на PHP: github.com/mikehaertl/phpwkhtmltopdf (сам ей не пользуюсь, у меня простая задача, все аргументы зафиксированы, нет смысла в этой обёртке)
Во-вторых, генерировать временный html файл на диске не обязательно, wkhtmltopdf умеет принимать исходный html через stdin, если указать параметр "-" (прочерк). На PHP получается как-то так:
Более подробно про разные параметры принимаемые wkthmltopdf рекомендую почитать здесь: wkhtmltopdf.org/usage/wkhtmltopdf.txt
Да, если нужен header-html и footer-html, то пара временных html файлов на диске всё-таки понадобится.
В третьих, на Linux машинах есть неприятный баг, что шрифты выглядят меньше, чем при печати в PDF этого же html файла с помощью браузера: github.com/wkhtmltopdf/wkhtmltopdf/issues/2171
По этому багу, в том числе, есть много обсуждений на StackOverflow, но фикса в ближайшее время не предвидится, предлагается workaround: github.com/wkhtmltopdf/wkhtmltopdf/issues/2171#issuecomment-139164039
Но я использую другой подход: есть отдельный windows сервер, на котором запускается wkthmltopdf, а обращение идёт к нему через простенький самописный веб-сервис: принимает html контент в POST и возвращает готовый PDF — так и живём.
Вообще по wkhtmltopdf активность на github почти нулевая, баги не фиксятся, но ничего лучше пока не нашел. Кто знает C++ — присоединяйтесь к проекту, внесите свой вклад в opensource!
Есть ещё www.princexml.com — но он платный и жутко дорогой!
Вот крутой план: даёшь единый продукт! Чтобы YouTrack + TeamCity + Upsource + какя-нибудь wiki ala confluence + функционал хостинга репозиториев типа gitlab/github enterprise/stash = JetBrains Ultimate App! И всё это чтобы было написано на Kotlin, работало быстро, без багов, с возможностью использовать разные backend СУБД (Oracle,Postgree,MySQL,MSSQL,Mongo,Rethink...), с удобным инсталлятором standalone версии (которая сама бы обновлялась) и с облачным сервисом!
API на столько простой, что это просто бомба! (по сравнению с тем же ReactPHP).
В оригинале: laravel-news.com/2015/06/laravel-5-1-released
«Пойдут по той же ветке», ага