【问题标题】:Issue on generate pdf with custom name using pdfmake and nodejs使用 pdfmake 和 nodejs 生成具有自定义名称的 pdf 的问题
【发布时间】:2016-06-18 08:27:19
【问题描述】:

我使用 pdfmake 在 nodejs 中生成 pdf 并将数据发送到我的角度请求页面。我可以生成pdf。但我的问题是当我下载 pdf 时,它的名称看起来像“16064905-c4aa-4d40-96db-ca7464c38858.pdf”。如何为我的 .pdf 文件设置自定义名称?

这是我的代码

pdfHandler.createPdfBinary(courseDetail, function(binary) {
    res.header('content-type', 'application/pdf');                                  
    res.send(binary);
}, function(error) {
    res.send('ERROR:' + error);
});

exports.createPdfBinary = function(courseDetail,callback) {
    var docDefinition = {...};
    var pdfDoc = printer.createPdfKitDocument(docDefinition);
    var chunks = [];
    var result;

    pdfDoc.on('data', function(chunk) {
        chunks.push(chunk);
    });

    pdfDoc.on('end', function() {
        result = Buffer.concat(chunks);
        callback(result);

    });

    pdfDoc.end();
}

【问题讨论】:

  • 什么是pdfHandler?

标签: angularjs node.js pdfmake


【解决方案1】:

在您的pdfDoc.on('end', function()

callback(null, result.toString('base64'));

当您收到回调的结果时,添加以下代码并将结果传递给方法

在您的回调结果中

b64toBlob(result, 'application/pdf');

文件下载方法

function b64toBlob(b64Data, contentType, sliceSize) {
  contentType = contentType || '';
  sliceSize = sliceSize || 512;

  var byteCharacters = atob(b64Data);
  var byteArrays = [];

  for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    var slice = byteCharacters.slice(offset, offset + sliceSize);

    var byteNumbers = new Array(slice.length);
    for (var i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }

    var byteArray = new Uint8Array(byteNumbers);

    byteArrays.push(byteArray);
  }

  var blob = new Blob(byteArrays, {
    type: contentType
  });
  if (blob) {
    saveAs(blob, 'your_file_name.pdf'); /// TODO change with your filename
  } else {
    throw 'Could not generate blob';
  }
}

您需要在代码中再添加一个包 FileSaver

更多详情请查看我的 GitHub 示例 https://github.com/daupawar/MeteorAsyncPdfmake

【讨论】:

    【解决方案2】:

    我会做得有点不同。顺便说一句,您可以使用 Content-Disposition 为文件设置自定义名称

    let fileName = 'sample.pdf'
    let stream = pdfHandler.createPdfBinary(courseDetail)
    res.header('Content-Type', 'application/pdf')
    res.header('Content-Disposition', 'attachment; filename=' + fileName)
    stream.pipe(res)
    
    // instead of buffering all chunks and concatenating everything
    // we simply just return the stream, so no callback is necessary
    // ...this is also better for memory
    exports.createPdfBinary = courseDetail => {
        var docDefinition = {...}
        return printer.createPdfKitDocument(docDefinition)
    }
    

    【讨论】:

    • 是的,exports 是你在 NodeJS 中导出模块的方式
    猜你喜欢
    • 2018-08-16
    • 2015-02-07
    • 2017-02-21
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多