Node.js NodeJS:使用读取的缓冲区将两个PDF文件合并为一个
我正在使用填充pdf npm模块填充模板pdf,它创建了新文件,该文件从磁盘读取并作为缓冲返回回调。我有两个文件,对它们执行相同的操作。我想将两个缓冲区组合在一起,形成一个pdf文件,然后发送回客户端。我尝试了不同的缓冲区连接方法。可以使用buffer.concat连接缓冲区,如Node.js NodeJS:使用读取的缓冲区将两个PDF文件合并为一个,node.js,pdf,npm,Node.js,Pdf,Npm,我正在使用填充pdf npm模块填充模板pdf,它创建了新文件,该文件从磁盘读取并作为缓冲返回回调。我有两个文件,对它们执行相同的操作。我想将两个缓冲区组合在一起,形成一个pdf文件,然后发送回客户端。我尝试了不同的缓冲区连接方法。可以使用buffer.concat连接缓冲区,如 var newBuffer = Buffer.concat([result_pdf.output, result_pdf_new.output]); 新缓冲区的大小也是输入缓冲区大小的总和。但是当newBuffer作
var newBuffer = Buffer.concat([result_pdf.output, result_pdf_new.output]);
新缓冲区的大小也是输入缓冲区大小的总和。但是当newBuffer
作为响应发送到客户机时,它仍然只显示数组中最后提到的文件
res.type("application/pdf");
return res.send(buffer);
有什么想法吗?支持使用其方法组合PDF
使用流处理缓冲区的示例:
const hummus = require('hummus');
const memoryStreams = require('memory-streams');
/**
* Concatenate two PDFs in Buffers
* @param {Buffer} firstBuffer
* @param {Buffer} secondBuffer
* @returns {Buffer} - a Buffer containing the concactenated PDFs
*/
const combinePDFBuffers = (firstBuffer, secondBuffer) => {
var outStream = new memoryStreams.WritableStream();
try {
var firstPDFStream = new hummus.PDFRStreamForBuffer(firstBuffer);
var secondPDFStream = new hummus.PDFRStreamForBuffer(secondBuffer);
var pdfWriter = hummus.createWriterToModify(firstPDFStream, new hummus.PDFStreamForResponse(outStream));
pdfWriter.appendPDFPagesFromPDF(secondPDFStream);
pdfWriter.end();
var newBuffer = outStream.toBuffer();
outStream.end();
return newBuffer;
}
catch(e){
outStream.end();
throw new Error('Error during PDF combination: ' + e.message);
}
};
combinePDFBuffers(PDFBuffer1, PDFBuffer2);
下面是我们在Express服务器中用于合并PDF blob列表的内容
const { PDFRStreamForBuffer, createWriterToModify, PDFStreamForResponse } = require('hummus');
const { WritableStream } = require('memory-streams');
// Merge the pages of the pdfBlobs (Javascript buffers) into a single PDF blob
const mergePdfs = pdfBlobs => {
if (pdfBlobs.length === 0) throw new Error('mergePdfs called with empty list of PDF blobs');
// This optimization is not necessary, but it avoids the churn down below
if (pdfBlobs.length === 1) return pdfBlobs[0];
// Adapted from: https://stackoverflow.com/questions/36766234/nodejs-merge-two-pdf-files-into-one-using-the-buffer-obtained-by-reading-them?answertab=active#tab-top
// Hummus is useful, but with poor interfaces -- E.g. createWriterToModify shouldn't require any PDF stream
// And Hummus has many Issues: https://github.com/galkahana/HummusJS/issues
const [firstPdfRStream, ...restPdfRStreams] = pdfBlobs.map(pdfBlob => new PDFRStreamForBuffer(pdfBlob));
const outStream = new WritableStream();
const pdfWriter = createWriterToModify(firstPdfRStream, new PDFStreamForResponse(outStream));
restPdfRStreams.forEach(pdfRStream => pdfWriter.appendPDFPagesFromPDF(pdfRStream));
pdfWriter.end();
outStream.end();
return outStream.toBuffer();
};
module.exports = exports = {
mergePdfs,
};
正如@MechaCode所提到的,创建者已经停止了对HummusJS的支持 所以我想给你们两个解决方案
const PDFDocument = require('pdf-lib').PDFDocument
var pdfBuffer1 = fs.readFileSync("./pdf1.pdf");
var pdfBuffer2 = fs.readFileSync("./pdf2.pdf");
var pdfsToMerge = [pdfBuffer1, pdfBuffer2]
const mergedPdf = await PDFDocument.create();
for (const pdfBytes of pdfsToMerge) {
const pdf = await PDFDocument.load(pdfBytes);
const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
copiedPages.forEach((page) => {
mergedPdf.addPage(page);
});
}
const buf = await mergedPdf.save(); // Uint8Array
let path = 'merged.pdf';
fs.open(path, 'w', function (err, fd) {
fs.write(fd, buf, 0, buf.length, null, function (err) {
fs.close(fd, function () {
console.log('wrote the file successfully');
});
});
});
以下示例代码使用节点pdftk
npm模块进行组合
两个pdf缓冲区无缝连接
const pdftk = require('node-pdftk');
var pdfBuffer1 = fs.readFileSync("./pdf1.pdf");
var pdfBuffer2 = fs.readFileSync("./pdf2.pdf");
pdftk
.input([pdfBuffer1, pdfBuffer2])
.output()
.then(buf => {
let path = 'merged.pdf';
fs.open(path, 'w', function (err, fd) {
fs.write(fd, buf, 0, buf.length, null, function (err) {
fs.close(fd, function () {
console.log('wrote the file successfully');
});
});
});
});
节点pdftk npm模块的要求是您需要安装
PDFtk图书馆。你们中的一些人可能会觉得这项开销/乏味。所以我有另一个使用pdf库的解决方案
const PDFDocument = require('pdf-lib').PDFDocument
var pdfBuffer1 = fs.readFileSync("./pdf1.pdf");
var pdfBuffer2 = fs.readFileSync("./pdf2.pdf");
var pdfsToMerge = [pdfBuffer1, pdfBuffer2]
const mergedPdf = await PDFDocument.create();
for (const pdfBytes of pdfsToMerge) {
const pdf = await PDFDocument.load(pdfBytes);
const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
copiedPages.forEach((page) => {
mergedPdf.addPage(page);
});
}
const buf = await mergedPdf.save(); // Uint8Array
let path = 'merged.pdf';
fs.open(path, 'w', function (err, fd) {
fs.write(fd, buf, 0, buf.length, null, function (err) {
fs.close(fd, function () {
console.log('wrote the file successfully');
});
});
});
就我个人而言,我更喜欢使用pdf lib npm模块。可能重复使用请说明PDFBuffer1的类型,PDFBuffer2@M.Abulsoud它们都是由二进制PDF数据填充的。在我的例子中,我使用的方法创建了缓冲区,下面是作者合并PDF的一个示例:我试图在React组件中使用它,但这似乎是不可能的。我遗漏了什么?@ZachEsposito puppeter's page.pdf()返回缓冲区HummusJS现在不受creater支持。谢谢!pdf-lib非常好,这是使用pdf-lib的一个更好的例子