【问题标题】:Facing Error when Converting Base64 to PDF file in ReactJS/Javascript在 ReactJS/Javascript 中将 Base64 转换为 PDF 文件时遇到错误
【发布时间】:2020-08-04 09:46:14
【问题描述】:

我正在努力在 ReactJS 中将 PDF 显示为附件。我已经设法将base64带到前端,但是在我尝试创建blob对象后它不起作用,虽然它进入了Acrobat阅读器但显示了错误。有什么建议请告诉我如何正确地将base64转换为pdf。

我还上传了我在控制台登录 pastebin 时得到的 base64 代码,https://pastebin.com/W4zEXyPy

注意: 当我尝试在https://base64.guru/ 修复时,它显示无效的字符串和字符(数据:应用程序/pdf;),我尝试使用content.slice(29);,所以它将从JVB...(而不是data:application/pdf;base64,JVBERi0xL........)开始但得到同样的错误。 Link to pic of Repair Base64 atbase64guru

Error: 未正确解码

  • NodeJS 后端代码响应 API 调用

         let token = req.cookies.access_token;
             if (token) {
               let Invoice_No_Actual = req.body.invoice_Name;
               res.set("Content-disposition", "attachment; filename=" + `${__dirname}\\` + `${Invoice_No_Actual}` + `.pdf`);
               res.contentType("application/pdf");
               res.send(`data:application/pdf;base64,${new Buffer.from(data).toString("base64")}`);
             }
           });
    
  • 前端代码 API调用

     const headers = new Headers();
            headers.append("content-type", "application/json");
            headers.append("responseType", "application/pdf");
    
            const options = {
              method: "POST",
              headers,
              credentials: "include",
              body: JSON.stringify(invoice_Object),
              // body: "My HTML String",
            };
    
            const newRequest = new Request("http://localhost:5000/api/invoice-only", options);
    
            (async () => {
              const invoice_Call = await fetch(newRequest)
                .then((res) => {
                  return text1 = res.text();
                })
                .then((data) => {
                 generateFile(data, invoice_Name);
                });
            })();
          };
    
  • generateFile()函数调用前端-收到响应后


    let generateFile = (content, fileName) => {
    
        console.log("content", content); // here at console if i copy the code and use online tool(https://base64.guru/converter/decode/pdf) it shows the correct pdf

        let content1= content.slice(29);// content1 is correct base64 as if i use it online tool it correctly generate the PDF document
        const blob = new Blob([content1], { type: "application/pdf" });
        console.log(blob);
        const link = document.createElement("a");
        link.href = window.URL.createObjectURL(blob);
        link.download = fileName;
        link.click();
      };

【问题讨论】:

  • 在我使用 .slice 方法后,我使用在线工具时输出的字符串会生成正确的 PDF,所以我认为问题出在我创建 blob 对象但不确定之后。

标签: javascript reactjs pdf pdf-generation blob


【解决方案1】:

一个简单的console.log(content.slice(29)) 可以揭示你的错误。问题是content1 变量包含一个以“VBE...”开头的字符串,而它必须以“JVBE...”开头。所以,你的错误是 slice() 函数丢弃了太多字符。

【讨论】:

  • @umair 你能分享你的最终工作代码吗?我遇到了完全相同的问题。我的 PDF 正在生成和下载,但我无法打开它。我收到与您报告的相同的错误。我也在使用 content.slice(0) 并将完整内容放入 blob。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多