使用NodeJS在现有PDF表单中填充数据

时间:2016-12-25 14:54:00

标签: node.js pdf

问题:我有一个需要填写的现有PDF表单(* .pdf)。如何使用Node JS动态填充它?

4 个答案:

答案 0 :(得分:10)

在npm上查看以下模块:

node-pdffiller是PDF工具包PDFtk的包装器:

PDFKit的网站上有很多很好的文档:

这些模块具有不同的功能和API。你应该找到适合你需要的东西。

还有一篇很好的文章:

答案 1 :(得分:1)

我也遇到过同样的问题,但是得到的最佳解决方案是 pdf-fill-form

只需尝试一下即可感受到魔力:

var pdfFillForm = require('pdf-fill-form');
var fs = require('fs');

pdfFillForm.write('test.pdf', { "myField": "myField fill value" }, { "save": "pdf", 'cores': 4, 'scale': 0.2, 'antialias': true } )
.then(function(result) {
    fs.writeFile("test123.pdf", result, function(err) {
        if(err) {
            return console.log(err);
        }
        console.log("The file was saved!");
    }); 
}, function(err) {
    console.log(err);
});

答案 2 :(得分:0)

对于仍在寻找解决方案的任何人,请看一下pdf-lib(https://pdf-lib.js.org / https://www.npmjs.com/package/pdf-lib)。

关于如何使用pdf-lib Node.js软件包填写PDF表单文本字段有一个不错的话题:https://github.com/Hopding/pdf-lib/issues/48

答案 3 :(得分:0)

node-pdftk为我工作顺利。

let DOCUMENTDIRECTORY = //directory holding your empty pdfs;

async function producePDFs(documents, outputDirectory) {
  promises = [];

  for (let document of documents) {
    var fields = document["fieldsWithValue"];
    var fieldsWithValue = {};

    for (var i = 0; i < fields.length; i++) {
       fieldsWithValue[fields[i]["name"]] = fields[i]["value"];
    }

    console.log(fieldsWithValue);

    promises.push(
      new Promise(function (resolve, reject) {
        pdftk
          .input(DOCUMENTDIRECTORY + document["file"]["fileName"])
          .fillForm(fieldsWithValue)
          .flatten()
          .output(outputDirectory + document["file"]["fileName"])
          .then((buffer) => {
            getFile(outputDirectory + document["file"]["fileName"], 1000).then(
              //1 second
              (val) => {
                if (val) resolve(1);
              }
            );
          })
          .catch((err) => {
            console.log(err);
            // handle errors
          });
      })
    );
  }

  return Promise.all(promises).then(function () {
    return 1;
  });
}

async function getFile(path, time) {
  return new Promise((resolve, reject) => {
    const timeout = setInterval(function () {
      const file = path;
      const fileExists = fs.existsSync(file);

      console.log("Checking for: ", file);
      console.log("Exists: ", fileExists);

      if (fileExists) {
        clearInterval(timeout);
        resolve(1);
      }
    }, time);
  });
}