NodeJS react-pdf/renderer的输出与pdf-lib不兼容

pftdvrlh  于 2023-01-20  发布在  Node.js
关注(0)|答案(1)|浏览(216)

我尝试使用@react-pdf/rendererpdf方法将PDF渲染到内存中,然后将结果字节馈送到pdf-libPDFDocument对象中。我这样做的原因是react-pdf不允许嵌入(合并)其他PDF和我们正在使用的合并库(pdf-merger-js)不支持返回合并PDF的页码,这意味着我们无法正确呈现目录。
实际情况是,在获取@react-pdf/renderer.pdf(...)的输出后,将其编码为base64并传递给pdf-lib.PDFDocument.load(...),在浏览器中预览生成的PDF是一个如下所示的字节串。在引入pdf-lib之前,创建此PDF预览没有任何问题:

执行此操作的代码如下所示(toc ==目录,两个参数都是react-pdf元素的集合):

const mergePdfsToObjectUrl = async (toc: ReactElement, pdfPages: any[]) => {
  if (toc && pdfPages?.length > 0) {
    const pdfString = await pdf(toc);
    const string = await pdfString.toString();
    const base64string = encode(string);
    const tocPdf = await PDFDocument.load(base64string);

    // Create a new document
    const doc = await PDFDocument.create();

    // Add individual content pages
    const tocPdfPages = await doc.copyPages(tocPdf, tocPdf.getPageIndices());
    for (const page of tocPdfPages) {
      doc.addPage(page);
    }

    // Write the PDF to a file
    const pdfBytes = await doc.save();
    const url = URL.createObjectURL(new Blob([pdfBytes]));
    return url;
  }

我尝试了各种方法,从不同的编解码器到不同的管道,都是为了将react-pdf数据转换成可用的字节串,但似乎都不起作用。

4urapxun

4urapxun1#

我有一个类似的问题,但我已经设法让pdf显示。

//take your base64string and put into Buffer then load into pdf-lib doc
const base64string = encode(string);
const pdfBuffer = Buffer.from(base64string); // you need this line
const tocPdf = await PDFDocument.load(pdfBuffer);

然后在保存时转换为Unit 8Array,然后转换为Blob,并像您一样创建URL

const pdfBytes = await doc.save();
const bytes  = new Uint8Array( pdfBytes ); // you need this
const blob   = new Blob( [ bytes ], { type: "application/pdf" } ); // also add this
const url = URL.createObjectURL( blob );
return url

现在你可以将url传递给iframe <iframe src={url} title="myPdf"/>,它应该可以正确显示,我遇到的唯一问题是react-pdf生成的pdf不显示任何图像,但是其他的都可以显示。

相关问题