我正在尝试下载一个pdf,然后使用nodejs中的pdf-lib合并它。 pdf 正在合并,我总共有 8 页,每页 4 页,问题是页面是空白的。 我尝试使用流式下载 pdf 进行同样的操作,下载的是正确的内容。 我不想使用任何第三方库进行下载。 我想我错过了一些东西。 代码如下。
async function downloadPdfBuffer(url, outputPath){
logger.info({message: 'downloadPdfBuffer PDF', url, outputPath});
try {
const response = await httpRequestService.createAxiosConfigAndSend({
method: 'GET',
url: url,
})
return response.data;
} catch (error) {
logger.error({message: 'Error downloading PDF:', error});
throw error;
}
};
async function downloadAndmergePdf(pdfLinks){
const maxTwoPdfs = _.slice(pdfLinks,0,2);
const allPdfs = maxTwoPdfs.map(async pdfLink => {
const pdfNameArr = pdfLink.split('?')[0].split('/');
const pdfName = pdfNameArr.pop();
return downloadPdfBuffer(pdfLink,pdfName);
// return await join(process.cwd(), pdfName)
});
const settledPromises = await Promise.allSettled(allPdfs);
const mergedPdf = await PDFDocument.create();
const mergedPdfPromises = settledPromises.map(async buff => {
if(buff.status === 'fulfilled'){
const pdf = await PDFDocument.load(Buffer.from(buff.value,'binary'),{ignoreEncryption:true});
const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
copiedPages.forEach((page) => {
mergedPdf.addPage(page);
});
// }
}
})
await Promise.all(mergedPdfPromises);
const buf = await mergedPdf.save();
fs.writeFileSync('new.pdf',buf);
}
downloadAndmergePdf(['https://www.adobe.com/support/products/enterprise/knowledgecenter/media/c4611_sample_explain.pdf','https://www.adobe.com/support/products/enterprise/knowledgecenter/media/c4611_sample_explain.pdf'])
我无法理解这个问题,我尝试了多种方法,例如转换为base64后用Buffer写入,转换为二进制然后写入。 似乎没什么作用。 我也试过
const response = await httpRequestService.createAxiosConfigAndSend({
method: 'GET',
url: url, responseType:'arraybuffer'
})
然后将其写入文件。
const pdf = await PDFDocument.load(response.data,{ignoreEncryption:true});
还
const pdf = await PDFDocument.load(Buffer.from(response.data,'binary'),{ignoreEncryption:true});
如果您将
responseType:'arraybuffer'
添加到 axios
请求,则问题不在于您的代码,而在于示例文档,该文档具有不允许页面提取和文档组装的限制。
如果您使用其他一些示例并且
responseType:'arraybuffer'
,代码可以工作:
const response = await httpRequestService.createAxiosConfigAndSend({
method: 'GET',
url: url, responseType:'arraybuffer'
})
//...
// samples without restrictions
downloadAndmergePdf(['https://file-examples.com/storage/fe83e1f11c664c2259506f1/2017/10/file-example_PDF_500_kB.pdf','https://file-examples.com/storage/fe83e1f11c664c2259506f1/2017/10/file-example_PDF_500_kB.pdf'])