首页 > 解决方案 > 从 api 响应正文中保存 pdf 文件 - pdf 保存为空白文件

问题描述

我正在使用 nodejs v15 进行 api 自动化,其中我得到一个缓冲区作为响应正文,我需要在本地保存为 PDF 文件。我能够创建一个名为“pdf123.pdf”的 pdf 文件,它有 8kb 和 2 页,这是预期的。我有 2 个概率语句问题 1 - 当我打开保存的 pdf 文件时,它显示 2 个空白页。内容不见了。我也尝试过 encoding = null 和“二进制”。没有按预期工作。(代码如下)

API response.body 如下所示 "%PDF-1.4\n%����\n1 0 obj\n<<\n/Type /Catalog\n/Version /1.5\n/Pages 2.....

let request = require('request-promise');
    var api = "/report/download/request1";
    var auth = "Basic ####";

    var args = {
        headers: {
            "content-type": "application/pdf",
            "Authorization": auth,
        },
        encoding: "binary"
    }
    return new Promise((resolve, reject) => {
        return webApi.restCall(api, "GET", args.data, args.headers).then((response) => {
            let writeStream = fs.createWriteStream('pdf123.pdf');
            writeStream.write(response.body, 'binary');
            writeStream.on('finish', () => {
                console.log('wrote all data to file');
            });
            writeStream.end();
            resolve("Resolved")
        }).catch((err) => {
            reject("API call failed");
        })
    })
}

标签: javascriptnode.jsapiautomationpdf-generation

解决方案


我遇到了同样的问题,除了我需要在新的浏览器选项卡中打开 PDF。我看到了同样的行为——它会以 PDF 格式打开一个新标签,页数正确,但所有页面都是空白的。我终于让它工作了,然后我为你的用例调整了我的代码。请注意,我使用的是 axios,但 AFAIK 的结果不应该有任何差异。

function getPDFandWriteToFile() {

  var api = "/report/download/request1";
  var auth = "Basic ####";

  var config = {
    method: 'get',
    url: api,
    responseType: 'arraybuffer',
    headers: { 
      'Authorization': auth, 
    },    
  }

  return new Promise((resolve, reject) => {
    axios(config)
    .then((response) => {
      let writeStream = fs.createWriteStream('pdf123.pdf')
      writeStream.once('open', (fd) =>{
        writeStream.write(new Buffer.from(response.data, 'binary'))
        writeStream.on('finish', () => {
          console.log('wrote all data to file');
        });
        writeStream.end()
      })
      resolve(response);
    },
      (error) => {
        console.log(error);
        reject(error)
      }
    );
  });  
}

推荐阅读