2017-02-21 2 views
1

필자는 Android 앱과 웹 앱 (Firebase Hosting에서 호스팅 됨)을 가지고 있습니다. Android 앱은 데이터를 생성하여 Firebase Realtime Database에 저장합니다. Android 앱과 웹 앱 모두 데이터를 볼 수 있습니다.Firebase 데이터베이스 데이터의 PDF 생성 위치 - 모바일 앱 또는 Firebase 호스팅 웹 앱

Firebase 데이터베이스 - Android 앱 또는 웹 앱 (JavaScript를 통해 데이터의 PDF를 생성하는 가장 좋은 장소는 어디입니까? 예 : jsPDF)? Firebase Storage에 저장됩니다.

나는 안드로이드 애플 리케이션이 PDF를 생성하기 위해 백엔드를 호출 할 수 있고, PDF에 대한 링크가 안드로이드 애플 리케이션으로 다시 보내질 것이라고 생각했다. 그러나 Firebase는 서버가없는 아키텍처이므로 안드로이드 앱에서 PDF를 만들고 Firebase Storage에 업로드하는 것이 가장 좋은 해결책 인 것 같습니다 ...?

+1

Firebase에는 PDF를 생성하는 기본 제공 기능이 없으므로 클라이언트에서 생성하거나 서버를 설정해야합니다. 특정 라이브러리를 추천하는 것은 오프 토픽입니다. Stack Overflow –

답변

8

Firebase 기능 (Firebase Introduction)이 있으므로 NodeJS를 사용하여 pdfkit (PDFKit)과 같은 PDfs를 만들 수 있습니다. 다음 예제는 AccountCreation (Event)에서 PDF를 생성하고 저장소에 저장 한 후 메일을 통해 사용자에게 보내는 방법을 설명합니다. 이 모든 것이 Firebase 서버에서 발생합니다. 사용 된 모든 라이브러리에 대해서는 npm을 설치하고 package.json에 포함하는 것을 잊지 마십시오. 까다로운 부분은 add the Firebase Admin SDK to your Server입니다. 또한 this이 많은 도움이되었습니다. 솔직히 말해서 이것은 몇 시간이 걸렸습니다. 그래서 자세한 내용을 물어 hestiate!

const functions = require('firebase-functions'); 
const admin = require("firebase-admin"); 

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

const gmailEmail = '[email protected]' 
const gmailPassword = 'test123.ThisisNoTSave' 
const mailTransport = nodemailer.createTransport(`smtps://${gmailEmail}:${gmailPassword}@smtp.gmail.com`); 

const serviceAccount = require("./youradminsdk.json"); 
//Save this file to your functions Project 

// Your company name to include in the emails 
const APP_NAME = 'My App'; 
const PROJECT_ID = "google-testproject"; 

admin.initializeApp({ 
    credential: admin.credential.cert(serviceAccount), 
    databaseURL: `https://${PROJECT_ID}.firebaseio.com`, 
    storageBucket: `${PROJECT_ID}.appspot.com` 
}); 

var config = { 
    projectId: `${PROJECT_ID}`, 
    keyFilename: './youradminsdk.json' 
}; 

const storage = require('@google-cloud/storage')(config); 
const datastore= require('@google-cloud/datastore')(config); 

// [START onCreateTrigger] 
exports.sendPDFMail = functions.auth.user().onCreate(event => { 
// [END onCreateTrigger] 

     // [START eventAttributes] 
     const doc = new pdfkit; 
     const user = event.data; // The Firebase user. 
     const email = user.email; // The email of the user. 
     const displayName = user.displayName; // The display name of the user. 
     // [END eventAttributes] 

     const bucket = storage.bucket(`${PROJECT_ID}.appspot.com`); 
     console.log(bucket); 
     const filename = Date.now() + 'output.pdf';      
     const file = bucket.file(filename); 
     const stream = file.createWriteStream({resumable: false}); 

     // Pipe its output to the bucket 
     doc.pipe(stream);    
     doc.fontSize(25).text('Some text with an embedded font!', 100, 100);   
     doc.end();   
     stream.on('finish', function() {     
      return sendPDFMail(email, displayName, doc); 
     }); 

     stream.on('error', function(err) { 
      console.log(err); 
     });   
     }) 
    ; 
    // [END sendPDFMail] 


    // Sends a welcome email to the given user. 
    function sendPDFMail(email, displayName, doc) { 
     const mailOptions = { 
      from: '"MyCompany" <[email protected]>', 
      to: email,   
     }; 

     mailOptions.subject = `Welcome to ${APP_NAME}!`; 
     mailOptions.text = `Hey ${displayName}!, Welcome to ${APP_NAME}. I hope you will enjoy our service.`; 
     mailOptions.attachments = [{filename: 'meinPdf.pdf', content: doc, contentType: 'application/pdf' }];   

     return mailTransport.sendMail(mailOptions).then(() => { 
      console.log('New welcome email sent to:', email); 
     }); 
    } 
+0

이메일에 첨부 된 PDF가 비어있는 이유는 무엇입니까? 나는 firebase 기억 장치에 date_output.pdf를 볼 수 있기 때문에 pdf 파일이 올바르게 작성되고 있음을 압니다. –