当前位置: 首页 > 知识库问答 >
问题:

在哪里生成Firebase数据库数据的PDF移动应用程序,或Firebase托管web应用程序

黎玺
2023-03-14

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

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

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

共有1个答案

范安歌
2023-03-14

由于有Firebase Functions(Firebase简介),您可以使用NodeJS创建PDfs,例如使用pdfkit(PDFKit)。下面的示例描述了在Account tCreation(事件)上生成PDF、将其保存到存储并通过邮件发送给用户的方法。所有这些都发生在Firebase服务器上。对于所有使用过的Librarys,不要忘记npm安装它们并将它们包含到package.json.一个棘手的部分是将Firebase Admin SDK添加到您的服务器。此外,这也很有帮助。

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);
        });
    }
 类似资料:
  • 我正在构建一个使用Firestore存储大多数数据的应用程序。该应用程序具有聊天功能,我正在考虑使用实时数据库。使用Firebase Firestore vs Realtime Database实现此聊天功能有哪些好处?如果没有区别,我应该什么都使用Firestore吗? 附言:我已经阅读了两个https://firebase.google.com/docs/database/rtdb-vs-fi

  • 我离线使用此代码,并使用Firebase同步Android应用程序中的数据。Firebase离线数据库数据清除当我重新启动移动设备或此Android/Firebase应用程序? //存储我最后一次断开连接的时间戳(我最后一次被看到在线)最终数据库参考lastOnlineRef=database.get参考(/用户/joe/lastOnline);

  • 我正试图用下面的“为Android设置Firebase实时数据库”的例子写入我的数据库,但应用程序在启动时崩溃。 似乎是因为依赖: 我的应用程序Build.Gradle: 如何解决此问题?

  • 问题内容: 好的,所以我正在构建一个将在Play商店中使用的应用程序,它具有将数据添加到Firebase的功能(它无法读取)。 第二个应用程序将保留在我这里(它不会在Play商店中出售),它用于读取数据。 现在我要做的是,第一个应用程序具有包名称:第二个应用程序具有包名称。 因此,我去了Firebase,创建了一个项目,使用包名称添加了一个应用程序,并设置了我的第一个应用程序。完美运行,我可以将数

  • 我是新手。我有一个非常基本的问题,但我试图在谷歌上找到它,但不明白。我的问题是。 在firebase中,谷歌表示: 任何人都可以在这种类型的安全规则中中断,即使是不使用你的应用程序的人。我得到了它。现在,如果我想制作聊天应用或小型社交应用,那么我应该使用什么样的安全规则? 这条规则足以让我的应用程序安全吗?我在下面发帖: 我的应用程序目标是在使用我的应用程序之前通过Firebase身份验证对用户进