HTML5 to PDF serverside

Я ищу решение для создания PDF-документа из документа HTML5/CSS3, serveride.

Я знаю, что есть много решений для создания PDF (например, FOP, iText...), но мне нужно убедиться, что он будет выглядеть на 100% аналогичным HTML-странице. Таким образом, я не хочу создавать элемент PDF с помощью элемента типа FOP или iText.

Собственно, что-то должно существовать, потому что это то, что вы делаете, когда печатаете в формате PDF из своего браузера. В идеале решение должно встроить механизм веб-браузера (webkit или gecko). Я пробовал wkHtmlToPdf... но результат не очень хорош (холст HTML5 даже не печатается...)

Если у кого-то есть представление о любом решении, бесплатном или нет, любой язык... Я буду признателен A LOT! Благодарю!!

Ответы

Ответ 1

Я использовал PhantomJS для создания png-изображений с веб-страниц, и он также может создавать PDF файлы, и качество обычно бывает хорошим. Свойство называется захватом экрана и описано здесь. Поддерживаемые форматы: PNG, JPEG, GIF и PDF.

При преобразовании в PDF тексты страниц сохраняются в виде текстов.

После тестирования нескольких других библиотек или программ, нашел PhantomJS самым идеальным решением. PhantomJS использует WebKit, настоящий механизм компоновки и рендеринга.

Несколько примеров приведены в https://github.com/ariya/phantomjs/wiki/Examples. В разделе Рендеринг/растеризация упоминается следующий script, который поможет вам в этом процессе:

rasterize.js rasterizes a web page to image or PDF

Руководство PhantomJS QuicStart говорит:

Возможно создание PDF файла, например. из статьи в Википедии:

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf

или при создании готового к печати чит-листа:

phantomjs rasterize.js http://www.nihilogic.dk/labs/webgl_cheat_sheet/WebGL_Cheat_Sheet.htm webgl.pdf

Я протестировал pdf-версию из нескольких страниц, и если страница соответствует стандартам, она дает хорошие результаты. Текст можно выбирать и печатать как высококачественный, но на некоторых страницах макет в формате pdf не такой, как в png. Ниже приведены два скриншота, которые генерируются с помощью команд:

$ phantomjs rasterize.js 'http://windows.microsoft.com/en-US/windows/home' microsoft.png

$ phantomjs rasterize.js 'http://windows.microsoft.com/en-US/windows/home' microsoft.pdf 

Example of png and pdf generation using Phantomjs

Я также тестировал http://lab.simurai.com/buttons/. PDF и png были очень идентичны, и ниже приведен пример pdf, который я растрировал до 5641px в ширину и обрезал область. Как и в предыдущем примере PDF, текст можно выбрать в PDF, и, как видите, текст острый (без антиалиасов!).

CSS3Buttons

Установка

Я попытался сначала установить Qt-библиотеку и PhantomJS на компиляцию Centos5 из исходного кода, но не повезло. Затем на Ubuntu 11.10 и процесс был безболезненным:

Я загрузил http://phantomjs.googlecode.com/files/phantomjs-1.7.0-linux-x86_64.tar.bz2 и извлек его с помощью

tar -xjvf phantomjs-1.7.0-linux-x86_64.tar.bz2

И затем скопируйте исполняемые phantomjs в bin dir системы:

$ cp phantomjs-1.7.0-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs

и phantomjs были готовы к запуску.

Если сгенерированный PDF файл не подходит, вы можете попробовать обновить Webkit, но я полагаю, что результата должно быть достаточно. PhantomJS имеет отличный цикл обновления, поэтому ошибки должны быть исправлены в разумные сроки.

Часто задаваемые вопросы PhantomJS также имеет хорошую информацию о возможностях.

Ответ 2

В зависимости от сложности вашего HTML вы можете использовать XmlWorker, который является проектом разработчиков iText и использует iText.

Ответ 3

На каком языке вы используете сервер?

Создание скриншота страницы, а затем преобразование изображения в pdf, вероятно, даст вам наилучшие результаты. Он будет показывать страницу точно так же, как она будет отображаться браузером.

Есть некоторые инструменты для демонстрации экрана, такие как browshot.com. Посмотрите API и поддерживаемые языки.

Или вы можете использовать свой инструмент. Для node.js существует хороший проект на github.