使用Node.js将HTML转换为PDF

我正在寻找创build我的网站网页的可打印的pdf版本。 像express.render()这样的东西只会将页面渲染为pdf

有谁知道这样做的节点模块?

如果不是,你将如何去实施一个? 我已经看到一些方法使用像phantom.js这样的无头浏览器,但不知道stream量是phantom.js

延伸穆斯塔法的答案。

A)安装http://phantomjs.org/然后;

B)安装幻像节点模块https://github.com/amir20/phantomjs-node

在这里输入图像说明

C)下面是一个渲染pdf的例子

 var phantom = require('phantom'); phantom.create().then(function(ph) { ph.createPage().then(function(page) { page.open("http://www.google.com").then(function(status) { page.render('google.pdf').then(function() { console.log('Page Rendered'); ph.exit(); }); }); }); }); 

PDF的输出:

在这里输入图像说明

编辑: 无声打印PDF

java -jar pdfbox-app-2.0.2.jar PrintPDF -silentPrint C:\print_mypdf.pdf

Phantom.js是一个无头的webkit服务器,它会加载任何网页,并将其呈现在内存中,虽然您可能无法看到它,但有一个屏幕捕捉function,您可以在其中导出当前视图为PNG,PDF ,JPEG和GIF。 从phantom.js文档看看这个例子

如果你想将HTML导出为PDF。 你有很多select。 甚至没有节点

选项1:在你的html页面上有一个调用window.print()函数的button。 使用浏览器原生的HTML到PDF。 使用媒体查询,使您的HTML页面看起来不错的PDF。 而且您还可以在打印之前和之后打印可用于更改页面的事件。

选项2. htmltocanvas或rasterizeHTML 。 将你的html转换成canvas,然后调用canvas对象上的toDataURL()来获取图像。 并使用像jsPDF这样的JavaScript库将该图像添加到PDF文件。 这种方法的缺点是pdf不能编辑。 如果你想从PDF中提取数据,有不同的方法。

选项3. @Jozzhard答案

我find的最佳解决scheme是html-pdf。 这很简单,并与大html的工作。

https://www.npmjs.com/package/html-pdf

就这么简单:

  pdf.create(htm, options).toFile('./pdfname.pdf', function(err, res) { if (err) { console.log(err); } }); 

从外部URL创buildPDF

这里是以前使用html-pdf答案的一个改进,但是也将它与requestify相结合,因此它可以与外部URL一起工作:

安装您的依赖关系

 npm i -S html-pdf requestify 

然后,创build脚本:

 //MakePDF.js var pdf = require('html-pdf'); var requestify = require('requestify'); var externalURL= 'http://www.google.com'; requestify.get(externalURL).then(function (response) { // Get the raw HTML response body var html = response.body; var config = {format: 'A4'}; // or format: 'letter' - see https://github.com/marcbachmann/node-html-pdf#options // Create the PDF pdf.create(html, config).toFile('pathtooutput/generated.pdf', function (err, res) { if (err) return console.log(err); console.log(res); // { filename: '/pathtooutput/generated.pdf' } }); }); 

然后你只需从命令行运行:

 node MakePDF.js 

看你美丽的像素完美的PDF为你创造(免费!)

使用html-pdf

 var fs = require('fs'); var pdf = require('html-pdf'); var html = fs.readFileSync('./test/businesscard.html', 'utf8'); var options = { format: 'Letter' }; pdf.create(html, options).toFile('./businesscard.pdf', function(err, res) { if (err) return console.log(err); console.log(res); // { filename: '/app/businesscard.pdf' } }); 

我用html-pdf

易于使用,不仅可以将pdf保存为文件,还可以将pdf内容传送到WriteStream(所以我可以直接将其stream式传输到Google Storage以保存我的报告)。

使用CSS +图像

它考虑到CSS。 我面临的唯一问题 – 它忽视了我的形象。 我find的解决scheme是用base64代替src attrribute中的url,例如

<img src="data:image/png;base64,iVBOR...kSuQmCC">

您可以使用您的代码或使用在线转换器之一,例如https://www.base64-image.de/

从html片段+ css编译有效的html代码

  1. 我必须得到我的html文件的一个片段(我只是在jQueryselect器上添加.html()方法)。
  2. 然后我读了相关的css文件的内容。

使用这两个值(相应地存储在variableshtmlcss )我已经编译了一个有效的HTML代码使用模板string

 var htmlContent = ` <!DOCTYPE html> <html> <head> <style> ${css} </style> </head> <body id=direct-sellers-bill> ${html} </body> </html>` 

并通过它来create html-pdf的方法。