我正在寻找创建pdf
我网站网页的可打印版本。诸如express.render()
仅将页面呈现为pdf
有人知道这样做的节点模块吗?
如果没有,您将如何实施?我已经看到一些关于使用无头浏览器的方法,例如phantom.js
,但是不确定流程如何。
Answers:
扩展穆斯塔法的答案。
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
phantomjs-node
在NPM上不存在,npm install phantom@2 -S
用于节点v小于5.0或npm install phantom -S
节点版本5.0或更高版本
Phantom.js是一个无头Webkit服务器,它将加载任何网页并将其呈现在内存中,尽管您可能看不到它,但是它具有屏幕捕获功能,您可以在其中将当前视图导出为PNG,PDF ,JPEG和GIF。看看phantom.js文档中的这个例子
如果要将HTML导出为PDF。您有很多选择。甚至没有节点
选项1:在html页面上有一个调用window.print()函数的按钮。使用浏览器的本地html到pdf。使用媒体查询使您的html页面在pdf上看起来不错。并且还具有事件之前和之后的打印结果,可用于在打印之前更改页面。
选项2. htmltocanvas或rasterizeHTML。将您的html转换为canvas,然后在canvas对象上调用toDataURL()以获取图像。并使用jsPDF之类的JavaScript库将该图像添加到PDF文件中。这种方法的缺点是pdf不会变得可编辑。如果要从PDF提取数据,则有不同的方法。
选项3. @Jozzhard答案
我发现最好的解决方案是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);
}
});
尝试使用Puppeteer从HTML创建PDF
从外部URL创建PDF
这是对先前答案的改编,其中利用了html-pdf
,但也将其与结合使用,requestify
因此可以与外部URL结合使用:
安装你的依赖
npm i -S html-pdf requestify
然后,创建脚本:
//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
有时只能成功制作PDF-github.com/marcbachmann/node-html-pdf/issues/181
包
我用html-pdf
易于使用,不仅可以将pdf保存为文件,还可以将pdf内容通过管道传输到WriteStream(这样我就可以将其直接流式传输到Google Storage,以将报告保存在那里)。
使用CSS +图像
它考虑了CSS。我面临的唯一问题-它忽略了我的图像。我发现的解决方案是src
用base64替换attrribute值中的url ,例如
<img src="data:image/png;base64,iVBOR...kSuQmCC">
您可以使用您的代码进行操作,也可以使用在线转换器之一,例如https://www.base64-image.de/
从html片段+ CSS编译有效的html代码
html
文档的一部分(我只是在jQuery选择器上应用了.html()方法)。css
文件的内容。使用该两个值(存储在变量中html
,并css
因此)我编译使用有效的HTML代码模板字符串
var htmlContent = `
<!DOCTYPE html>
<html>
<head>
<style>
${css}
</style>
</head>
<body id=direct-sellers-bill>
${html}
</body>
</html>`
并将其传递给html-pdf的create
方法。
对于那些不想在服务器上安装PhantomJS以及Chrome / Firefox实例的用户-或因为PhantomJS项目当前已暂停,这是一个替代方案。
您可以将转换外部化为API来完成这项工作。许多存在并且各不相同,但是您将获得的是具有最新功能的可靠服务(我认为CSS3,Web字体,SVG,Canvas兼容)。
例如,使用PDFShift(免责声明,我是创始人),您可以简单地通过使用以下request
程序包来做到这一点:
const request = require('request')
request.post(
'https://api.pdfshift.io/v2/convert/',
{
'auth': {'user': 'your_api_key'},
'json': {'source': 'https://www.google.com'},
'encoding': null
},
(error, response, body) => {
if (response === undefined) {
return reject({'message': 'Invalid response from the server.', 'code': 0, 'response': response})
}
if (response.statusCode == 200) {
// Do what you want with `body`, that contains the binary PDF
// Like returning it to the client - or saving it as a file locally or on AWS S3
return True
}
// Handle any errors that might have occured
}
);
使用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' }
});
如果您到达这里,是想寻找一种从Express的同事的视图模板制作PDF的方法,而我则做了express-template-to-pdf
这使您可以从Express中使用的任何模板(Pug,Nunjucks等)生成PDF。
它取决于html-pdf,并且被编写为在路由中使用,就像使用res.render一样:
const pdfRenderer = require('@ministryofjustice/express-template-to-pdf')
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'pug')
app.use(pdfRenderer())
如果您使用过res.render,那么使用它应该看起来很明显:
app.use('/pdf', (req, res) => {
res.renderPDF('helloWorld', { message: 'Hello World!' });
})
您可以将选项传递给html-pdf以控制PDF文档的页面大小等
仅依靠他人的出色工作。
我认为,最好的方法是通过API,这样您就不会在运行非托管代码的应用程序中添加大型且复杂的依赖项,而该依赖项需要经常更新。
这是一个简单的方法,每月可免费使用800个请求:
var CloudmersiveConvertApiClient = require('cloudmersive-convert-api-client');
var defaultClient = CloudmersiveConvertApiClient.ApiClient.instance;
// Configure API key authorization: Apikey
var Apikey = defaultClient.authentications['Apikey'];
Apikey.apiKey = 'YOUR API KEY';
var apiInstance = new CloudmersiveConvertApiClient.ConvertWebApi();
var input = new CloudmersiveConvertApiClient.HtmlToPdfRequest(); // HtmlToPdfRequest | HTML to PDF request parameters
input.Html = "<b>Hello, world!</b>";
var callback = function(error, data, response) {
if (error) {
console.error(error);
} else {
console.log('API called successfully. Returned data: ' + data);
}
};
apiInstance.convertWebHtmlToPdf(input, callback);
通过上述方法,您还可以根据需要在本地或自己的基础结构上安装API。
您还可以使用pdf节点创建者软件包
套件网址-https: //www.npmjs.com/package/pdf-creator-node