节点 PDFkit 空白页
node PDFkit blank pages
我正在用 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
});
抱歉英语不好,我是意大利人
可能是您的 pdf 中的二进制字符在传输过程中没有被正确编码,这可以解释为什么在本地它可以但在传输时却不行 - pdf 是 ascii 和二进制字符的混合体,如果二进制文件已损坏,您似乎得到了一个空白的 pdf。
这可能是浏览器方面的问题,这种方法对我有用:
加上这个:
编辑:最好还是使用: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);
})
};
});
我 运行 遇到了同样的问题,但没有涉及任何客户端代码。所以这个问题不仅仅是客户端。显然,PDFKit 正在传输的服务器端响应不是按照 PDFKit 的要求编码 "binary",而是应用 "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(); } );
我正在用 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
});
抱歉英语不好,我是意大利人
可能是您的 pdf 中的二进制字符在传输过程中没有被正确编码,这可以解释为什么在本地它可以但在传输时却不行 - pdf 是 ascii 和二进制字符的混合体,如果二进制文件已损坏,您似乎得到了一个空白的 pdf。
这可能是浏览器方面的问题,这种方法对我有用:
加上这个:
编辑:最好还是使用: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);
})
};
});
我 运行 遇到了同样的问题,但没有涉及任何客户端代码。所以这个问题不仅仅是客户端。显然,PDFKit 正在传输的服务器端响应不是按照 PDFKit 的要求编码 "binary",而是应用 "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(); } );