1

我正在用 node.js 和这个包创建一个 PDF:https ://github.com/devongovett/pdfkit

我的问题是,当我在浏览器上下载 pdf 时,它完全是空白的……服务器端代码:

    PDFDocument = require('pdfkit');

function creaEtichetta(req, res){
    doc = new PDFDocument
        size: 'a4'
        bufferPages: true



    doc.addPage().fontSize(25).text('Here is some vector graphics...', 100, 100);

    doc.save()
   .moveTo(100, 150)
   .lineTo(100, 250)
   .lineTo(200, 250)
   .fill("#FF3300");

   doc.addPage().fillColor("blue").text('Here is a link!', 100, 100).link(100, 100, 160, 27, 'http://google.com/')

    doc.pipe(res);
    doc.end();
}
exports.creaEtichetta = creaEtichetta;

客户端代码:

var data = {};
    data.azione = "getEtichettaProdotto";

    //Scarico i dati anagrafica
    $.ajax({
        type: 'POST',
        data: JSON.stringify(data),
        contentType: 'application/json',
        url: 'http://46.101.209.16/endpoint',                       
        success: function(etichettas) {
            var blob=new Blob([etichettas]);
            var link=document.createElement('a');
            link.href=window.URL.createObjectURL(blob);
            link.download="Label"+".pdf";
            link.click();
        }//SUCCESS
    });

抱歉英语不好,我是意大利人

4

2 回答 2

2

可能是您的 pdf 中的二进制字符在传输中没有被正确编码,这可以解释为什么在本地它可以,但在传输时却不行 - pdf 是 ascii 和二进制字符的混合,如果二进制文件已损坏,它似乎你得到一个空白的pdf。

这可能是浏览器方面的问题,这种方法对我有用: https ://stackoverflow.com/a/27442914/2900643

再加上这个: https ://stackoverflow.com/a/33818646/2900643

编辑:最好还是使用:https ://github.com/eligrey/FileSaver.js/

服务器:

var doc = new PDFDocument();
doc.pipe(res);
doc.circle(280, 200, 50).fill("#6600FF");
doc.end();

浏览器:

angular.module('app')
.service('PdfService', function($http) {
  var svc = this;

  svc.getPdf = function() {
    return $http.get('/getpdf/', { responseType : 'arraybuffer' });
  };
});

angular.module('app')
.controller('PdfCtrl', function($scope, PdfService) {

  $scope.getPdf = function() {
   PdfService.getPdf().success(function(data) {
    var fileName = 'hello.pdf';
    var pdf = new Blob([data], {type : 'application/pdf'});
    saveAs(pdf, fileName);
   })
 };
});
于 2016-05-07T20:49:09.770 回答
1

我在同一个问题上运行,但没有涉及任何客户端代码。所以这个问题不仅仅是客户端的问题。显然,PDFKit 输入的服务器端响应不是按照 PDFKit 的要求编码“二进制”,而是应用“utf8”。

遗憾的是,到目前为止,还没有办法为 ServerResponse 提供的流分配一些默认编码。见https://github.com/nodejs/node/issues/14146

就我而言,我现在正在通过从 PDFKit 收集分块输出并立即编写来解决这个问题。代替

var doc = new PDF();

res.type( "pdf" ).attachment( "test.pdf" );
doc.pipe( res );

我正在使用这个:

var doc = new PDF();

res.type( "pdf" ).attachment( "test.pdf" );

var buffers = [];
doc.on( "data", function( chunk ) { buffers.push( chunk ); } );
doc.on( "end", function() {
    res.end( Buffer.concat( buffers ), "binary" );
} );

这带来了一个缺点:由于所有 PDF 都缓存在内存中,因此当涉及大量同时请求或生成巨大的 PDF 文件时,此代码会影响服务器端的内存消耗。

令人困惑的是,尝试逐块移交 PDFKit 输出不再起作用:

var doc = new PDF();

res.type( "pdf" ).attachment( "test.pdf" );

doc.on( "data", function( chunk ) { res.write( chunk, "binary" ); } );
doc.on( "end", function() { res.end(); } );
于 2017-08-11T10:26:11.377 回答