2016-05-06 9 views
1

Ich erstelle eine PDF mit node.js und dieses Paket: https://github.com/devongovett/pdfkitKnoten PDFKit leere Seiten

Mein Problem ist, dass, wenn ich das pdf auf dem Browser laden Sie es totaly Blanck ist ... serverseitigen Code :

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; 

clientseitigen Code:

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 
    }); 

sorry für schlechtes Englisch, ich bin italienisch

+0

heeeeelp bitte :( –

+0

Haben Sie mit fs.createWriteStream zu retten versuchte ich anfangen würde, dort erste Server zu eliminieren. – Molda

+0

Auch die doc.pipe sollte über dem ersten doc.addPage sein – Molda

Antwort

2

Es könnte sein, dass die Binärzeichen in Ihrem PDF nicht korrekt in der Übertragung codiert sind, was erklären würde, warum lokal es in Ordnung ist, aber nicht beim Übertragen - PDFs sind eine Mischung aus ASCII und Binärzeichen, und wenn die Binärdatei beschädigt ist es scheint, dass Sie ein leeres pdf erhalten.

Das ist wahrscheinlich ein Browser-Seite Problem zu sein, ist dieser Ansatz für mich gearbeitet: https://stackoverflow.com/a/27442914/2900643

mit dieser Gekoppelt: https://stackoverflow.com/a/33818646/2900643

EDIT: Noch besser verwenden: https://github.com/eligrey/FileSaver.js/

Server:

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

Browser:

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); 
    }) 
}; 
}); 
+0

"Uncaught ReferenceError: svc ist nicht definiert" Was ist SVC? –

+1

Ich benutze angular, und ich habe dies über einen Service (SVC) und Controller aufgeteilt - ich habe ein bisschen mehr zum Codebeispiel hinzugefügt, um dies zu verdeutlichen. Aber wenn Sie angular nicht verwenden, ist der responseType von arraybuffer und das saveAs-Dienstprogramm die wichtigsten Dinge, die Sie brauchen. – MikeH

0

Ich lief in der gleichen Ausgabe, aber ohne clientseitigen Code beteiligt. Also ist dieses Problem nicht einfach Client-Seite. Offensichtlich ist die serverseitige Antwort, auf die PDFKit antwortet, nicht "binär" wie von PDFKit angefordert, sondern "utf8".

Leider gibt es heute keine Möglichkeit, dem von ServerResponse bereitgestellten Stream eine Standardcodierung zuzuweisen. Siehe https://github.com/nodejs/node/issues/14146

In meinem Fall arbeitete ich um dieses Problem für jetzt, indem Sie chunked Ausgabe von PDFKit sammeln und sofort schreiben. Statt

var doc = new PDF(); 

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

Ich benutze diese:

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"); 
}); 

Dieses kommt mit einem Nachteil: da alle PDFs im Arbeitsspeicher zwischengespeichert werden dieser Code einen Einfluss auf Serverseite Speicherverbrauch hat, wenn es um hohe Zahl kommt von gleichzeitigen Anfragen oder zum Generieren großer PDF-Dateien.

Verwirrend versuchen PDFKit Ausgangs Chunk Chunk zu über nicht wieder arbeiten:

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(); });