我的数据库包含600000行。我必须逐页读取数据库中的数据(每页1000条记录)。然后动态生成pdf,并使用node.js 将其流式传输为可下载的pdf
我已经在Hello世界的示例代码中完成了这项工作。
链接中的想法:在Node.js 中提供动态生成的PDF和远程图像
这是我的密码。
var express = require('express'),
request = require('request'),
expressJSON = require('express-json'),
pdfDocument = require('pdfkit');
// Start Express
var app = express();
// Use JSON in POST body
app.use(expressJSON());
// Setup POST response
app.get('/post_pdf', function(req, res) {
// Create PDF
var doc = new pdfDocument();
// Write headers
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Access-Control-Allow-Origin': '*',
'Content-Disposition': 'attachment; filename=Untitled.pdf'
});
// Pipe generated PDF into response
doc.pipe(res);
// Process image
request({
url: 'http://dummyimage.com/640.jpeg',
encoding: null // Prevents Request from converting response to string
}, function(err, response, body) {
if (err) throw err;
var idx =0;
var fource2Stream = function(){
idx++;
if(idx >= 10) {
doc.end(); // Close document and, by extension, response
return;
}
doc.addPage();
// Inject image
doc.image(body); // `body` is a Buffer because we told Request
// to not make it a string
doc.addPage();
doc.text ('Hello world!', 100, 100);
doc.addPage();
doc.text('Hello world!', 100, 100);
doc.flushPages();
setTimeout(fource2Stream, 5000);
};
fource2Stream();
return;
});
});
app.listen(8080);
使用NodeJS生成PDF的最简单方法是使用pdf-master
包。您可以通过一个函数调用使用HTML生成静态和动态PDF。
只需向generatePdf
函数提供数据。您还可以使用HTML和CSS设计PDF。
安装
npm install pdf-master
示例
步骤1-添加所需的包并生成PDF
const express = require("express");
const pdfMaster = require("pdf-master");
const app = express();
app.get("", async (req, res) => {
var PDF = await pdfMaster.generatePdf("template.hbs");
res.contentType("application/pdf");
res.status(200).send(PDF);
});
generatePdf()
语法和参数
generatePdf(
templatePath, //<string>
data, //<object> Pass data to template(optional)
options //<object> PDF format options(optional)
);
Step 2
-创建HTML模板(使用.hbs扩展名而不是.HTML保存模板)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
以模板和PDF格式选项渲染动态数据
const express = require("express");
const pdfMaster = require("pdf-master");
const app = express();
app.get("", async (req, res) => {
var students = {
{
id: 1,
name: "Sam",
age: 21
},
{
id: 2,
name: "Jhon",
age: 20
},
{
id: 3,
name: "Jim",
age: 24
}
}
let options = {
displayHeaderFooter: true,
format: "A4",
headerTemplate: `<h3> Header </h3>`,
footerTemplate: `<h3> Copyright 2023 </h3>`,
margin: { top: "80px", bottom: "100px" },
};
let PDF = await pdfMaster.generatePdf("template.hbs", students, options);
res.contentType("application/pdf");
res.status(200).send(PDF);
});
上述示例的模板(使用.hbs扩展名保存模板)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
<h1>Student List</h1>
<ul>
{{#each students}}
<li>Name: {{this.name}}</li>
<li>Age: {{this.age}}</li>
<br />
{{/each}}
</ul>
</body>
</html>
要了解有关pdf主文件的更多信息,请访问