在nodejs中下载并合并pdf

问题描述 投票:0回答:1

我正在尝试下载一个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}); 

javascript node.js pdf-lib.js
1个回答
0
投票

如果您将

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'])
© www.soinside.com 2019 - 2024. All rights reserved.