Как использовать механизм браузера (chrome/firefox) HTML/CSS/JS для создания PDF файла?
Есть хорошие проекты, которые генерируют pdf из файлов html/css/js
- http://wkhtmltopdf.org/ (с открытым исходным кодом)
- https://code.google.com/p/flying-saucer/ (с открытым исходным кодом)
- http://cssbox.sourceforge.net/ (необязательно прямая генерация PDF)
- http://phantomjs.org/ (с открытым исходным кодом позволяет вывод PDF)
- http://www.princexml.com/ (коммерческий, но вручает лучший там)
- https://thepdfapi.com/ модификация Chrome, чтобы плевать PDF из HTML из
Я хочу программно управлять браузером Chrome или Firefox (потому что они оба кроссплатформенные), чтобы они загружали веб-страницу, запускали сценарии и стилизировали страницу и генерировали файл PDF для печати.
Но как мне начать с автоматического управления браузером, чтобы я мог сделать что-то вроде
render-to-pdf file-to-render.html out.pdf
Я легко могу выполнить эту работу вручную, просмотрев страницу, а затем распечатав ее в формате pdf, и я получу точную, полностью соответствующую спецификации страницу в формате html/css/js в файле PDF. Даже заголовки URL могут быть опущены в pdf через параметры конфигурации в браузере. Но опять же, как мне начать пытаться автоматизировать этот процесс?
Я хочу автоматизировать на стороне сервера открытие браузера, переход на страницу и создание PDF файла с использованием страницы, отображаемой браузером.
Я провел много исследований, я просто не знаю, как сделать правильный вопрос. Я хочу программно управлять браузером, возможно, как селен, но до такой степени, что я экспортирую веб-страницу в формате PDF (следовательно, используя возможности рендеринга браузера для создания хороших PDF файлов)
Ответы
Ответ 1
Для этого в Firefox есть метод API: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/saveAsPDF
browser.tabs.saveAsPDF({})
.then((status) => {
console.log('PDF file status: ' + status);
});
Однако он доступен только для расширений браузера, а не для его вызова с веб-страницы.
Я все еще ищу публичный API для этого...
Ответ 2
Я не эксперт, но PhamtomJS кажется правильным инструментом для этой работы. Я не уверен, хотя о том, какой браузер без браузера он использует внизу (я думаю, это хром/хром)
var page = require('webpage').create();
page.open('http://github.com/', function() {
var s = page.evaluate(function() {
var body = document.body,
html = document.documentElement;
var height = Math.max( body.scrollHeight, body.offsetHeight,
html.clientHeight, html.scrollHeight, html.offsetHeight );
var width = Math.max( body.scrollWidth, body.offsetWidth,
html.clientWidth, html.scrollWidth, html.offsetWidth );
return {width: width, height: height}
});
console.log(JSON.stringify(s));
// so it fit ins a single page
page.paperSize = {
width: "1980px",
height: s.height + "px",
margin: {
top: '50px',
left: '20px'
}
};
page.render('github.pdf');
phantom.exit();
});
Надеюсь, что это поможет.