节点PDFkit空白页面
我用node.js和这个包创buildPDF: https : //github.com/devongovett/pdfkit
我的问题是,当我在浏览器上下载PDF时,总是blanck …服务器端代码:
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 : //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); }) }; });
我在同一个问题上运行,但没有涉及任何客户端代码。 所以这个问题不仅仅是客户端。 很显然,服务器端响应PDFKitpipe道input不是根据PDFKit的要求编码“二进制”,而是应用“utf8”。
可悲的是,截至今天,没有办法将一些默认编码分配给由ServerResponse提供的stream。 请参阅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都被caching在内存中,所以当涉及大量的同时请求或生成巨大的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(); } );
- 保持节点JS连接打开并写入(GET请求)
- 如何使用NodeJs获取MongoDB中的数据库列表?
- 由节点和mongodb错误
- 将使用loopback-component-passport的用户angular色设置为内置模型
- socket.on('连接'…事件永远不会触发nodejs + express + socket.io
- 如何在nodejs中检查数据againts xss?
- MongoDB:mongos进程,node-mongodb-native,connect-session-mongo
- PassportJS上的Facebook策略可以有多个回叫url吗?
- 抓取POST仅在Express API服务器React FrontEnd中返回_id对象