Node.js |通过从数据库中读取数据(逐页)生成pdf,并将其作为单个可下载的pdf流式传输



我的数据库包含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主文件的更多信息,请访问

相关内容

  • 没有找到相关文章

最新更新