android - 在何处生成 Firebase 数据库数据的 PDF - 移动应用程序或 Firebase 托管网络应用程序

标签 android pdf firebase firebase-realtime-database firebase-hosting

我有一个 Android 应用程序和一个网络应用程序(托管在 Firebase 托管上)。 Android 应用程序生成数据并将其保存到 Firebase 实时数据库。 Android 应用程序和 Web 应用程序都可以查看数据。

从 Firebase 数据库生成 PDF 数据的最佳位置在哪里 - Android 应用程序或网络应用程序(通过 JavaScript,例如 jsPDF)?它将保存在 Firebase 存储中。

我认为Android 应用程序可以调用后端生成PDF,然后PDF 的链接将被发送回Android 应用程序。然而 Firebase 是无服务器架构,所以最好的解决方案似乎是在 Android 应用程序上创建 PDF,然后将其上传到 Firebase Storage...?

最佳答案

由于有 Firebase Functions ( Firebase Introduction ),您可以使用 NodeJS 创建 PDfs,例如使用 pdfkit ( PDFKit )。以下示例描述了一种在 AccountCreation(Event) 上生成 PDF 的方法,将其保存到存储器并通过邮件将其发送给用户。所有这一切都发生在 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 = 'yourmail@stackoverflow.com'
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" <noreply@firebase.com>',
            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);
        });
    }

关于android - 在何处生成 Firebase 数据库数据的 PDF - 移动应用程序或 Firebase 托管网络应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42378751/

相关文章:

pdf - 手工编写基本的 PostScript 脚本

c# - 使用 Calibri 字体连字防止 LocalReport.Render

javascript - PDF 响应缩放浏览器调整大小

android - 从gridview中选择图像并将其显示在其他 Intent 上

android - 在带有 React Native 的 Android 中使用 ListView onEndReached 无法按预期工作

android - 如何从Facebook获取电子邮件信息?

android - 如何在 Android 应用程序中解析 CSV 文件?

android - 如何在带有 Firebase 内容的 Android 中使用 Algolia

android - 如何实现 SetOnItemClickListener FirebaseRecyclerViewAdapter

ios - firebase 是否可以根据电话数据或其他形式创建用户,避免在应用程序上注册以进行身份​​验证?