2017-07-26 152 views
3

我是JavaScript新手,我試圖使用pdfkit從firebase函數創建PDF文件。以下是我的功能代碼。在Firebase雲端函數中創建PDF

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

}); 

該函數啓動但發生超時錯誤。 這是在Firebase中創建PDF文件的最佳方式嗎? 我有一些我想要製作成pdf文件的html。

回答

1

只是工作這也爲保存PDF在它的工作原理是這樣

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

猜你應該等待,直到流被關閉,並聽取了錯誤和事物的存儲,但是這是第一個工作我能夠做的例子,現在正在研究如何從存儲中獲取圖像到PDF中。

+0

我結束了使用HTML,PDF,對我來說真是棒極了。我會接受你的回答。 – user1184205

1

我也在此工作,下面您可以找到一個雲功能示例,該示例從託管在Firebase存儲上的模板HTML創建PDF文件。 它使用Hanldebars將一些數據應用到模板,然後在Firebase存儲上再次上傳。 我在這裏使用了node-html-pdf。

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

希望這將有助於下一個這樣:)

+0

嗨Guillaume!什麼包含在template.html裏面? – Mario

+0

@Mario根據http://handlebarsjs.com/文檔,您必須使用html模板。在這種情況下類似的東西是確定: <元的charset = 「utf-8」> <表邊界=「1」> ​​ {{日期}} ​​ { {姓名}} 然而,AF ter模板已經明顯正確編譯,我得到以下錯誤...錯誤:html-pdf:PDF生成超時。 Phantom.js腳本沒有退出。 –

0

我試圖Guillaume的建議,它幾乎讓我在那裏。不幸的是,Phantomjs正在退出,沒有完成。

我最終通過結合紀堯姆的解決方案和https://phantomjscloud.com(和他們的圖書館)解決了這個問題。現在,它的工作就像一個魅力。

後「用戶數據編譯模板」,取代了以下內容:

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

        } 

        }); 
相關問題