2017-07-26 7 views
3

Ich bin neu in Javascript und ich versuche, eine PDF-Datei von einer Firebase-Funktion mit pdfkit zu machen. Unten ist mein Funktionscode.Create PDF in Firebase Cloud Funktionen

const pdfkit = require('pdfkit'); 
const fs = require('fs'); 

exports.PDFTest = functions.https.onRequest((req, res) => { 

var doc = new pdfkit(); 

var loremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in...'; 

doc.y = 320; 
doc.fillColor('black') 
doc.text(loremIpsum, { 
paragraphGap: 10, 
indent: 20, 
align: 'justify', 
columns: 2 
}); 

doc.pipe(res.status(200)) 

}); 

Die Funktion startet, aber dann tritt ein Timeout-Fehler auf. Ist das die beste Möglichkeit, eine PDF-Datei in Firebase zu erstellen? Ich habe etwas HTML, das ich in eine pdf-Datei machen möchte.

Antwort

1

arbeiten gerade dies auch in dem Speicher die PDF zum Speichern von ihm wie diese

const myPdfFile = admin.storage().bucket().file('/test/Arbeitsvertrag.pdf'); 
const doc = new pdfkit(); 
const stream = doc.pipe(myPdfFile.createWriteStream()); 
doc.fontSize(25).text('Test 4 PDF!', 100, 100); 
doc.end(); 

return res.status(200).send(); 

arbeitet Erraten Sie, bis der Strom geschlossen wird, warten sollen, und für Fehler und Dinge hören, aber dies ist das erste Arbeits Beispiel konnte ich nun machen, wie man ein Bild aus dem Speicher in das PDF holt.

+0

Ich landete HTML-pdf verwenden, es funktionierte für mich großartig. Ich werde deine Antwort akzeptieren. – user1184205

1

Ich habe auch daran gearbeitet und hier unten finden Sie ein Beispiel für die Cloud-Funktion, die eine PDF-Datei aus einer HTML-Vorlage erstellt, die auf Firebase-Speicher gehostet wird. Es verwendet Hanldebars, um einige Daten auf die Vorlage anzuwenden und sie dann erneut auf Firebase-Speicher hochzuladen. Ich habe hier node-html-pdf benutzt.

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
const pdf = require('html-pdf'); 
const gcs = require('@google-cloud/storage')({ 
    projectId: '[YOUR PROJECT ID]', 
    //key generated from here https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk?authuser=1 
    keyFilename: '[YOUR KEY]' 
}); 
const handlebars = require('handlebars'); 
const path = require('path'); 
const os = require('os'); 
const fs = require('fs'); 
const bucket = gcs.bucket('[YOUR PROJECT ID].appspot.com'); 

admin.initializeApp(functions.config().firebase); 

exports.helloWorld = functions.https.onRequest((request, response) => { 
    // data to apply to template file 
    const user = { 
    "date": new Date().toISOString(), 
    "firstname" : "Guillaume", 
    }; 
    const options = { 
    "format": 'A4', 
    "orientation": "portrait" 
    }; 
    const localTemplate = path.join(os.tmpdir(), 'localTemplate.html'); 
    const localPDFFile = path.join(os.tmpdir(), 'localPDFFile.pdf'); 

    bucket.file('template.html').download({ destination: localTemplate }).then(() => { 
    console.log("template downloaded locally"); 
    const source = fs.readFileSync(localTemplate, 'utf8'); 
    const html = handlebars.compile(source)(user); 
    console.log("template compiled with user data", html); 

    pdf.create(html, options).toFile(localPDFFile, function(err, res) { 
     if (err){ 
     console.log(err); 
     return response.send("PDF creation error"); 
     } 
     console.log("pdf created locally"); 

     return bucket.upload(localPDFFile, { destination: user.name + '.pdf', metadata: { contentType: 'application/pdf'}}).then(() => { 
     response.send("PDF created and uploaded!"); 
     }).catch(error => { 
     console.error(error); 
     response.send("PDF created and uploaded!"); 
     }); 
    }); 
    }); 
}); 

hoffen, dass dies die nächste dabei helfen zu tun :)

+0

Hallo Guillaume! Was enthält genau in template.html? – Mario

+0

@Mario Sie haben eine HTML-Vorlage verwenden nach http://handlebarsjs.com/ Dokumentation. In diesem Fall so etwas wie das ist ok:

{{date}} { {Vorname}}
jedoch af ter die Vorlage offenbar richtig kompiliert wurde, erhalte ich die folgende Fehlermeldung ... Fehler: HTML-pdf: PDF Generation Timeout. Das Skript "Phantom.js" wurde nicht beendet. –

0

Ich versuchte Guillaume Vorschlag und es mich fast dort ankamen. Leider war Phantomjs ohne Ende fertig.

Ich löste dies durch die Kombination von Guillaume-Lösung und https://phantomjscloud.com (und ihre Bibliothek.) Jetzt funktioniert alles wie ein Charme.

Nach „Vorlage mit Benutzerdaten zusammengestellt“, ersetzen Sie die folgenden Schritte aus:

const phantomJsCloud = require("phantomjscloud"); 
const browser = new phantomJsCloud.BrowserApi([YOURPHANTOMJSCLOUDAPIKEY]); 

var pageRequest = { content: html, renderType: "pdf" }; 

// Send our HTML to PhantomJS to convert to PDF 

return browser.requestSingle(pageRequest) 
     .then(function (userResponse) { 
      if (userResponse.statusCode != 200) { 
       console.log("invalid status code" + userResponse.statusCode); 
      } else { 
       console.log('Successfully generated PDF'); 

       // Save the PDF locally 
       fs.writeFile(localPDFFile, userResponse.content.data, { 
          encoding: userResponse.content.encoding, 
         }, function (err) {        
          // Upload the file to our cloud bucket 
          return pdfBucket.upload(localPDFFile, { destination: 'desired-filename.pdf', metadata: { contentType: 'application/pdf'}}).then(() => { 
          console.log('bucket upload complete: '+ localPDFFile); 
          }).catch(error => { 
          console.error('bucket upload error:', error); 
          }); 
         }); 

        } 

        }); 
Verwandte Themen