在 reactJS 中显示 PDF

IT技术 reactjs pdf
2021-03-30 14:39:24

我正在关注这个包https://www.npmjs.com/package/react-pdf

我从后端获得了整个原始 pdf 数据,所以我尝试使用下面的代码。

<ReactPDF file={renderPdf}/>

但它显示“无法加载PDF文件”。我不想在本地保存任何文件。最好的方法是使用后端提供的原始数据显示 pdf。

在终端中,它记录了错误:

URIError: Failed to decode param '/%PDF-1.4%%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%20ReportLab%20Generated%20PDF%20document%20http://www.reportlab.com1%200%20obj%3C%3C/F1%202%200%20R%20/F2%203%200%20R%20/F3%207%200%20R%3E%3Eendobj2%200%20obj%3C%3C/BaseFont%20/Helvetica%20/Encoding%20/WinAnsiEncoding%20/Name%20/F1%20/Subtype%20/Type1%20/Type%20/Font%3E%3Eendobj3%200%20obj%3C%3C/BaseFont%20/Helvetica-Bold%20/Encoding%20/WinAnsiEncoding%20/Name%20/F2%20/Subtype%20/Type1%20/Type%20/Font%3E%3Eendobj4%200%20obj%3C%3C/BitsPerComponent%208%20/ColorSpace%20/DeviceRGB%20/Filter%20[%20/ASCII85Decode%20/FlateDecode%20]%20/Height%20480%20/Length%2036803%20/SMask%205%200%20R%20%20%20/Subtype%20/Image%20/Type%20/XObject%20/Width%20640%3E%3EstreamGb%22-V'
6个回答

看起来您将 PDF 数据<ReactPDF>作为fileprop的值直接传递给组件但是根据文档,您需要使用包含data属性的对象

<ReactPDF
  file={{
    data: renderPdf
  }}
/>

似乎你也可以设置file一个包含url属性的对象,让 ReactPDF 自己从你的后端获取 pdf,如果这更容易的话:

<ReactPDF
  file={{
    url: 'http://www.example.com/sample.pdf'
  }}
/>
尝试使用 data: {renderPdf} 的第一个选项,这将触发错误。第二个选项是不可能的,因为它会触发一个获取请求,而我的后端执行某种授权,它将发送一个 POST 请求来检索 pdf
2021-05-28 14:39:24

如果您的目标只是在应用程序中查看 pdf,最简单的方法是在 HTML 中使用 object 标签。您不需要导入任何库并且适用于大多数浏览器。但这是缺乏定制和样式。

  <object data="http://africau.edu/images/default/sample.pdf" type="application/pdf" width="100%" height="100%">
      <p>Alternative text - include a link <a href="http://africau.edu/images/default/sample.pdf">to the PDF!</a></p>
  </object>

我解决了这个问题。我将从后端收到的二进制数据转换为 ArrayBuffer。

axios.post(//fire your API).then(response =>
        (response.status === 200? response.data : null))
    .then(pdfdata => {
        var len = pdfdata.length;
        var bytes = new Uint8Array( len );
        for (var i = 0; i < len; i++){
            bytes[i] = pdfdata.charCodeAt(i);
        }

        const renderPdf = bytes.buffer

然后我实际上将 bytes.buffer 分配给 renderPDF 以执行渲染。现在它完美地工作了!

在从 react 渲染 html 时,

import PDF from 'react-pdf-scroll'
<PDF file={renderPdf} scale={1.3} pages={Infinity} />
谢谢@MervynLee - 您是否遇到过一个问题,它只是说“正在加载 PDF 文件...”而从不加载 PDF?
2021-05-23 14:39:24
根据 npm 网站npmjs.com/package/react-pdf-scroll已弃用库 react-pdf-scroll
2021-05-31 14:39:24
嗨@JJHolloway,我已经发布了反应中的逻辑和渲染部分的代码,还有什么吗?
2021-06-05 14:39:24
嗨@MervynLee - 你能发布你的解决方案的完整代码吗?
2021-06-06 14:39:24
@JJHolloway 你介意显示服务器返回的响应内容吗?
2021-06-08 14:39:24

如果您从后端返回的数据采用缓冲区格式,那么您可以使用 react-pdf 可以配置的解析 JSON 对象设置文件信息。

file={{data: JSON.parse(renderPDF).data}}

这将呈现您的 PDF 文件。

试试这个

<object width="100%" height="400" data="http://www.africau.edu/images/default/sample.pdf" type="application/pdf">   </object>