Преобразование файлов HTML в PDF [закрыто]


128

Мне нужно автоматически сгенерировать файл PDF из существующего (X) HTML-документа. Во входных файлах (отчетах) используется довольно простой макет на основе таблиц, поэтому поддержка действительно причудливых материалов JavaScript / CSS, вероятно, не нужна.

Поскольку я привык работать на Java, предпочтительнее решение, которое легко использовать в java-проекте. Однако он должен работать только в системах Windows.

Один из возможных способов сделать это, но не дает хорошего качества вывода (по крайней мере, из коробки), - это использовать CSS2XSLFO и Apache FOP для создания файлов PDF. Проблема, с которой я столкнулся, заключалась в том, что, хотя CSS-атрибуты хорошо конвертируются, макет таблицы довольно запутан, и текст вытекает из ячейки таблицы.

Я также быстро взглянул на Jrex, Java-API для использования движка рендеринга Gecko.

Есть ли способ получить отрисованную страницу из движка рендеринга Internet Explorer и автоматически отправить ее в инструмент PDF-Printer? У меня нет опыта программирования OLE в Windows, поэтому я понятия не имею, что возможно, а что нет.

У тебя есть идея?


3
Недавно я создал пакет документов для библиотеки Java, который может конвертировать документы xhtml в pdf. Текущая версия не является чем-то продвинутым, но если ваши шаблоны xhtml простые, эта библиотека может пригодиться.
— Якуб Торбицки 08

Я думаю, что лучше всего использовать возможности браузеров для перевода. См. Stackoverflow.com/q/25574082/39998
— Дэвид Хофманн

Я застрял в создании pdf из html, который содержит кириллические буквы. Все нормально, кроме кириллических букв, которые пропущены. У кого-нибудь была такая проблема?
— Кристиан Илиев

@krisiliev: У меня были похожие проблемы, и насколько я помню, используемый шрифт был очень важен. Большинство шрифтов не поддерживают полные символы UTF8, но следующие должны: 'font-family: Arial Unicode MS;' (CSS). Также обязательно используйте правильную кодировку (я бы посоветовал всегда использовать UTF-8)
— panschk

2
эта ссылка помогла мне hmkcode.com/itext-html-to-pdf-using-java
— Mateen

Ответы:


73

Проект визуализатора XHTML « Летающая тарелка » поддерживает вывод XHTML в PDF. Взгляните на пример здесь .


20
Настоящая проблема с летающим саузером заключается в том, что он использует itext для рендеринга PDF, который является лицензированной библиотекой AGPL v3
— Дэвид Хофманн,

11
Версия itext, используемая Flying Saucer, - 2.0.8, которая была доступна под LGPL. Только версия с номером 5 или выше входит в более ограничительную лицензию. stackoverflow.com/questions/2692000/…
— Гэри

8
Я бы сказал, что настоящая проблема с Flying Saucer заключается в том, что для нее требуется правильно сформированный и действительный XML-документ. Легко случайно нарушить рендеринг PDF, включив что-то вроде амперсанда в ваш HTML или какой-то код javascript, который делает визуализированный HTML не строгим XHTML. Хотя это можно смягчить с помощью автоматических тестов или некоторого процесса, который включает проверку XML.
— SteveT

3
@LateralFractal Насколько я могу судить, Flying Saucer 9.0.8 (я думаю, последняя версия) использует iText 2.1.7, которая является последней версией iText с разрешающей лицензией --- LGPL. mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/…
— Джонатан Кросмер,

2
@JonathanCrosmer Ага. Есть два пакета FlyingSaucer для PDF, один для iText v2 и один для iText v5. Предполагая, что оба имеют одинаковую функциональность; риск AGPL можно избежать.
— Боковой фрактал

49

Вы пробовали WKHTMLTOPDF ?

Это простая утилита оболочки, реализация WebKit с открытым исходным кодом. Оба бесплатны.

Мы поставили небольшой учебник здесь

РЕДАКТИРОВАТЬ (2017):

Если бы мне нужно было что-то построить сегодня, я бы больше не пошел по этому пути.
Но вместо этого использовал бы http://pdfkit.org/ .
Вероятно, лишив его всех зависимостей nodejs для запуска в браузере.


16
Для прямого преобразования HTML-страницы в PDF это лучше, чем все, что я видел, бесплатное или коммерческое.
— MGOwen

Работает ли он на Mac OS?
— Эран Медан

1
@Eran, мы используем его в linux. Думаю, есть и версия для Windows
— Mic

1
@Mic Да, есть и версия для Windows.
— Viccari,

протестирован на Windows XP (версия 0.9.9) и работает очень хорошо. Кроме того, для установки не требуются права администратора на машине.
— Кристофер Махан

44

Проверьте iText ; это чистый набор инструментов Java PDF, который поддерживает чтение данных из HTML. Я недавно использовал его в проекте, когда мне нужно было извлечь контент из нашей CMS и экспортировать в виде файлов PDF, и все это было довольно просто. Поддержка CSS и тегов стилей довольно ограничена, но она без проблем отображает таблицы (хотя мне так и не удалось установить ширину столбца).

Создание PDF-файла из HTML происходит примерно так:

Document doc = new Document(PageSize.A4);
PdfWriter.getInstance(doc, out);
doc.open();
HTMLWorker hw = new HTMLWorker(doc);
hw.parse(new StringReader(html));
doc.close();

9
Это AGPL, кажется, даже хуже, чем GPL, вам нужно иметь открытый исходный код, даже если вы просто обслуживаете PDF, а iText находится на стороне сервера.
— Эран Медан

10
@Eran, просто используйте последнюю не-AGPL версию (com.lowagie: itext: 2.1.7 в Maven).
— Nowaker

1
HTMLWorker устарел в новых версиях IText в пользу XMLWorker; однако поддержка CSS в обоих случаях оставляет желать лучшего (см. demo.itextsupport.com/xmlworker/itextdoc/… ) и не соответствует моим потребностям. Напротив, летающая тарелка была идеальной.
— Pino

Вы можете использовать версию LGPL, которую можно найти на github.com/albfernandez/itext2
— Владимир Рожков

4

Если у вас есть финансирование, ничто не сравнится с Prince XML, как показано в этом видео.


1
Если вы ищете более дешевую альтернативу Prince, попробуйте DocRaptor.com. Он использует Prince в качестве двигателя.
— Julie

А если вы хотите подешевле, но с большим количеством возможностей, попробуйте htm2pdf.co.uk - он использует webkit, а пользователи - настоящий WYSIWIG
— user1914292

3

Есть ли способ получить отрисованную страницу из движка рендеринга Internet Explorer и автоматически отправить ее в инструмент PDF-Printer?

Так работает ActivePDF , что хорошо означает, что вы знаете, что получите, и на самом деле имеет разумную поддержку стилей.

Это также один из немногих пакетов, которые я нашел (если оглянуться на несколько лет назад), который на самом деле поддерживает различные команды CSS для разрыва страницы.


К сожалению, программное обеспечение ActivePDF очень расстраивает - поскольку оно должно запускать браузер IE в фоновом режиме для конвертации, оно может быть довольно медленным и не особенно стабильным.

В настоящее время в бета-версии есть новая версия, которая должна быть намного лучше, но на самом деле у меня не было возможности опробовать ее, поэтому не знаю, насколько это улучшение.


Спасибо за полезный ответ. Я не думаю, что ActivePDF действительно подходит из-за цены, но хорошо знать, что что-то подобное существует.
— panschk

API GrabzIt из HTML в PDF: grabz.it/html-to-pdf-image-api.aspx Работает так же, как визуализирует HTML в браузере, а затем создает PDF, что обеспечивает более точное преобразование PDF.
— user1474090

2

Вы можете использовать безголовый Firefox с расширением. Бегать довольно раздражает, но дает хорошие результаты.

Ознакомьтесь с этим ответом для получения дополнительной информации.


Не похоже на очень масштабируемое решение, если нужно параллельно конвертировать страницы в pdf. Если поступит несколько запросов, которые приведут к преобразованию с использованием FF, ваш сервер потеряет несколько гигабайт памяти только для обслуживания нескольких преобразованных страниц. Это откроет ваш сервер для DOS.
— М.П.

Лучше, но похоже: github.com/ariya/phantomjs/wiki/Screen-Capture (согласно we-love-php.blogspot.com/2012/12/… PDF имеет реальный текст, а не растеризованный)
— nafg

0

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

В вашем контексте более простым методом может быть установка драйвера печати PDF, такого как PDFCreator, и просто распечатать страницу на этом выходе.


Как это решение Java? Это драйвер печати для Windows.
— Грей,

OP явно упомянул Windows. И, полагаю, есть аналогичные драйверы для других систем. OP только упомянул Java как возможное решение ...
— PhiLho

0

Амьюни WebkitPDF можно использовать с JNI для решения только для Windows. Это библиотека преобразования HTML в PDF / XAML, бесплатная для коммерческого и некоммерческого использования.

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

применяется обычный отказ от ответственности

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.