服务器端的HTML到pdf转换?

时间:2015-01-10 10:10:01

标签: jquery html5 princexml

我们正在使用包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 

在没有浏览器帮助的情况下,是否可以在服务器端执行相同的操作?

7 个答案:

答案 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)

您可以像这样调用princexml服务器端:

prince sample.html -o sample.pdf 

请参阅command-line documentation

答案 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