簡體   English   中英

是否可以使用PhantomJS和Node從模板動態生成PDF?

[英]Is it possible to use PhantomJS and Node to dynamically generate PDFs from templates?

背景/需求

我正在與使用Node.JS和Express的Web應用程序上的小組合作。 我們需要能夠生成可以打印為紙質版和紙質版的報告。 最好是我們希望在服務器上為報告和手寫表格動態生成PDF。 我們目前正在服務器上使用EJS模板。

選件

我當時以為,能夠使用模板來構建表單/報告並從生成的HTML生成PDF將很方便,但是據我所知,這樣做的選擇似乎很有限。 我研究了兩種不同的可能解決方案:

編輯:我發現了另一個Node.JS模塊,該模塊能夠從HTML生成名為node-wkhtml的 PDF,它依賴於wkhtmltopdf 我現在正在比較使用node-phantomnode-wkhtml 我已經能夠使用這兩種方法在Node服務器上生成PDF,它們似乎都可以滿足我的需求。

我已經看到了一些使用PhantomJS從網站呈現PDF文檔的示例,但是我看到的所有示例都使用URL,並且不向其提供HTML字符串。 我不確定是否可以使用模板來動態生成PDF報告。

當需要報告時,我希望從EJS模板生成HTML,並使用該模板生成PDF。 無論如何,我是否可以使用Phantom在服務器上完全動態創建頁面而無需發出請求?

我的另一個選擇是使用允許動態生成PDF的PDFkit,但是據我所知,它是一種類似於畫布的API,實際上並不支持任何模板概念。

問題

有誰知道我是否可以將PhantomJS與Node一起使用,以從模板生成的HTML動態生成PDF? 還是有人知道我可以使用其他任何解決方案從我的Node / Express后端生成和提供可打印的報告/表格。

我將為任何試圖用node-phantom做類似事情的人發布答案。 因為node-phantom控制着PhantomJS的本地安裝,所以即使相應的PhantomJS操作是同步的,它也必須對所有內容使用異步方法。 在設置要在PhantomJS中呈現的頁面的內容時,您只需執行以下操作:

page.content = '<h1>Some Markup</h1>';
page.render('page.pdf');

但是,在節點內使用node-phantom模塊時,必須使用page.set方法。 這是我在下面使用的代碼。

'use strict';

var phantom = require('node-phantom');

var html = '<!DOCTYPE html><html><head><title>My Webpage</title></head>' +
    '<body><h1>My Webpage</h1><p>This is my webpage. I hope you like it' +
    '!</body></html>';

phantom.create(function (error, ph) {
    ph.createPage(function (error, page) {
        page.set('content', html, function (error) {

            if (error) {
                console.log('Error setting content: %s', error);
            } else {
                page.render('page.pdf', function (error) {
                    if (error) console.log('Error rendering PDF: %s', error);
                });
            }

            ph.exit();
        });
    });
});

EJS在PhantomJS中運行正常(安裝path模塊后)。 要在給定HTML字符串的情況下在PhantomJS中加載頁面,請執行page.content = '<html><head>...';

npm install ejsnpm install path ,然后:

var ejs = require('ejs'),
    page = require('webpage').create();

var html = ejs.render('<h1><%= title %></h1>', {
    title: 'wow'
});

page.content = html;
page.render('test.pdf');
phantom.exit();

(使用phantomjs而不是node運行此腳本。)

解決此問題的一個非常簡單的解決方案是node-webshot模塊-您可以將原始html直接放入參數中,然后直接打印pdf。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM