2017-02-21 27 views
1

У меня есть приложение для Android и веб-приложение (размещенное на Firebase Hosting). Приложение Android создает данные и сохраняет их в базе данных Firebase Realtime. Оба приложения Android и веб-приложение могут просматривать данные.Где можно создать PDF-файл данных базы данных Firebase - мобильное приложение или веб-приложение Firebase Hosting

Где наилучшее место для создания PDF-данных из базы данных Firebase - приложения для Android или веб-приложения (через JavaScript, например, jsPDF)? Он будет сохранен в хранилище Firebase.

Я подумал, что приложение Android может вызвать бэкэнд для создания PDF-файла, а ссылка на PDF будет отправлена ​​обратно в приложение Android. Однако Firebase - это серверная архитектура, поэтому кажется, что лучшее решение для создания PDF-файла в приложении Android, а затем загрузить его в хранилище Firebase ...?

+1

У Firebase нет встроенных функций для создания PDF-файла, поэтому вам придется либо сгенерировать его на клиенте, либо настроить для него сервер. Рекомендация конкретной библиотеки находится вне темы здесь, в Stack Overflow –

ответ

8

Поскольку есть функции Firebase (Firebase Introduction), вы можете использовать NodeJS для создания PDf, например, с помощью pdfkit (PDFKit). В следующем примере описывается способ создания PDF-файла в AccountCreation (Event), сохранения его в хранилище и отправки его пользователю по почте. Все это происходит на сервере Firebase. Для всех используемых библиотек не забудьте установить npm и включить их в package.json. Трудная часть - add the Firebase Admin SDK to your Server. Кроме того, this многое помогло. Честно говоря, это заняло у меня несколько часов. Поэтому не собирайтесь спрашивать подробности!

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, прикрепленный к электронной почте, пуст? Я знаю, что файл pdf создается правильно, так как я вижу date_output.pdf в хранилище firebase. –