我们正在使用包princexml pdf转换器从html文件创建一个pdf文件。对于创建html文件,数据由服务器提供。在使用jquery的浏览器中,为pdf创建创建输入字符串(html代码)。从浏览器接收到输入字符串后,服务器会创建一个html文件,该文件是princexml pdf转换器的输入,用于创建pdf。
Example for the input string
var sample = "<html>text</html>";//browser side
sample.html converted to sample.pdf //server side
在没有浏览器帮助的情况下,是否可以在服务器端执行相同的操作?
答案 0 :(得分:2)
您可以使用http://phantomjs.org/之类的无头浏览器。这允许从渲染页面生成图像。另请参阅http://www.lelesys.com/en/media/technology/phantomjs-as-screen-capture-to-generate-image-pdf-files.html
这允许您使用jquery和其他所有东西 - 因为它使用了实际渲染引擎。我猜你甚至不需要princexml。还有关于捕获的常见问题页面:http://phantomjs.org/screen-capture.html
答案 1 :(得分:1)
您可以借助以下任何一个图书馆来实现这一目标......
FPDF - FPDF是一个PHP类,它允许使用纯PHP生成PDF文件,也就是说不使用PDFlib库。 FPDF中的F代表Free:您可以将它用于任何用途并根据您的需要进行修改。
HTML2PDF - HTML2PDF是一个用PHP4(使用FPDF)和PHP5(使用TCPDF)编写的HTML到PDF转换器。 它允许以PDF格式转换有效的HTML 4.01,并在LGPL下发布。
dompdf - dompdf是一个HTML到PDF的转换器。从本质上讲,dompdf(主要)是CSS 2.1兼容的HTML布局和用PHP编写的渲染引擎。它是一个样式驱动的渲染器:它将下载和读取外部样式表,内联样式标记以及各个HTML元素的样式属性。它还支持大多数表示HTML属性。
GIT位置:https://github.com/dompdf/dompdf
pdfcrowd - Pdfcrowd API是一个在线工具,可让您轻松地在PHP应用程序中将网页和原始HTML代码转换为PDF。 PDF是在云中生成的,不需要第三方库。您只需要一个很小的PHP API客户端库。
答案 2 :(得分:1)
答案 3 :(得分:1)
查看wkhtmltopdf - 使用Webkit(QtWebKit)@ http://wkhtmltopdf.org
将HTML转换为PDF答案 4 :(得分:1)
您可以在不使用浏览器的情况下执行此操作。目前您正在使用jQuery生成HTML内容,因此您需要浏览器,因为jQuery在浏览器中运行,对吧?
您可以通过编写生成所需HTML内容的服务器端应用程序将HTML代码的生成移动到服务器端,并将其发送到pdf转换器。
可以从许多服务器端编程语言中调用Princexml,如下所示:http://www.princexml.com/doc/9.0/
从列表中选择一种服务器端语言,使用该语言生成HTML并将HTML发送到pdf转换器。这就是全部。
答案 5 :(得分:0)
请参阅此处的文档 http://www.princexml.com/doc/7.1/ 您可以选择服务器端语言并完成工作。只需填写表格并提交数据即可。
答案 6 :(得分:0)
我知道这是一个有点老的问题,但是由于我找到了一个很棒的模块,所以我想与所有人共享它。
名为 Puppeteer 的模块,它可以使您以无头模式运行Chrome 并通过API与之交互。因此,现在您可以创建一个模板,并通过POST调用获取该模板的占位符的值,并在服务器中即时生成 PDF 。
我创建了一个小的POC,这是它的链接:Demo-Puppeteer
让我在这里做一些解释:
...........
const content = await compile(templateName, data);
/***
* Launched the headless chrome in memory.
*/
const browser = await puppeteer.launch();
/***
* Created a new page(tab)
*/
const page = await browser.newPage();
/***
* Set the content of the new page
*/
await page.setContent(content, { waitUntil: 'networkidle0' });
/***
* Telling chrome to emulate screen i.e how the page looks if
* it would have been rendered in the normal browser.
*/
await page.emulateMedia('screen');
const byteArray = await page.pdf({
format: "A4",
landscape: true,
scale: 1.29,
printBackground: true
});
const buffer = Buffer.from(byteArray, 'binary');
/**
* We don't need the acknowledgement of this call that is the
* reason we are not waiting for this call to return.
*/
browser.close();
return buffer;
.......
现在,此缓冲区基本上是二进制数据,您必须使用Node的文件模块将其写入文件中。
有关更多说明,请查看Exlpanation Link