在Firebase函数中从Firebase存储填充PDFKit映像?

在Firebase函数中从Firebase存储填充PDFKit映像?,firebase,google-cloud-functions,pdfkit,Firebase,Google Cloud Functions,Pdfkit,我一直在尝试从PDFKit在PDFDoc中填充图像,但无法使其正常工作。使用下面的函数时,Firebase控制台函数日志中出现以下错误。该文件以“image/png”类型存储在Firebase存储上。名称只是一个字符串。我试着在名字后面加上“.PNG”,我收到了同样的错误。我包括了整个函数文件,因为可能有一种更可接受的方法来处理这个问题?在使用Firebase函数时,如何将PDF从Firebase存储插入PDFDoc?多谢各位 function toBase64(url, x, y, pdfdo

我一直在尝试从PDFKit在PDFDoc中填充图像,但无法使其正常工作。使用下面的函数时,Firebase控制台函数日志中出现以下错误。该文件以“image/png”类型存储在Firebase存储上。名称只是一个字符串。我试着在名字后面加上“.PNG”,我收到了同样的错误。我包括了整个函数文件,因为可能有一种更可接受的方法来处理这个问题?在使用Firebase函数时,如何将PDF从Firebase存储插入PDFDoc?多谢各位

function toBase64(url, x, y, pdfdoc) {
    return new Promise(async(resolve, reject) => {
        var req = await https.get(url, (res) => {
            res.setEncoding('base64');
            let body = "data:" + res.headers["content-type"] + ";base64,";
            res.on('data', (d) => {
                body += d;
            });
            res.on('end', () => {
                pdfdoc.image(body, x, y);
                resolve(res);
            });
        });
        req.on('error', err => {
            console.error('error!');
            reject(err);
        });

    });

}
获取文档时出错:错误:未知图像格式。 在Function.PDFImage.open(/user\u code/node\u modules/pdfkit/js/image.js:43:15) 在PDFDocument.openImage(/user\u code/node\u modules/pdfkit/js/mixins/images.js:102:26) 在PDFDocument.image(/user\u code/node\u modules/pdfkit/js/mixins/images.js:30:24) at/user_code/lib/index.js:71:48 在QuerySnapshot.forEach(/user\u code/node\u modules/firebase admin/node\u modules/@google cloud/firestore/src/reference.js:1012:16) at/user_code/lib/index.js:24:31 在进程中。_tickDomainCallback(internal/process/next_tick.js:135:7)

function toBase64(url, x, y, pdfdoc) {
    return new Promise(async(resolve, reject) => {
        var req = await https.get(url, (res) => {
            res.setEncoding('base64');
            let body = "data:" + res.headers["content-type"] + ";base64,";
            res.on('data', (d) => {
                body += d;
            });
            res.on('end', () => {
                pdfdoc.image(body, x, y);
                resolve(res);
            });
        });
        req.on('error', err => {
            console.error('error!');
            reject(err);
        });

    });

}
import*作为“firebase函数”中的函数;
从“firebase admin”导入*作为管理员;
从“firebase/app”导入*作为firebase;
从“pdfkit”导入*作为PDF文档;
admin.initializeApp(functions.config().firebase);
export const genPdf=functions.https.onRequest((请求,响应)=>{
const bucket=admin.storage().bucket(“decteac2-3hcec.appspot.com”);
const text=request.query.text;
const pdfdoc=新的PDFDocument({autoFirstPage:false});
pdfdoc.info['Title']=text+“.pdf”;
设x=5;
设y=5;
pdfdoc.管道(响应);
const docRef=admin.firestore().collection(“cxforms”).doc(文本);
docRef.get().then(函数(doc){
如果(文件存在){
const pagesRef=admin.firestore().collection(“pages”)。其中(“formKey”,“text=”).orderBy(“pageno”);
pagesRef.get().then(函数(querySnapshot){
设cnt=1;
querySnapshot.forEach(函数(第页){
pdfdoc.addPage({margin:0});
x=5;
y=5;
pdfdoc.moveTo(x,y)
.lineTo(607,5)
.lineTo(607787)
.lineTo(5787)
.lineTo(x,y)
.stroke();
for(设i=0;i
以下是我如何解决这个问题的。关键项是将调用firestorage的响应编码设置为“base64”。另一项是使用async和wait,以便在移动到要渲染的下一个单元元素之前,等待每个单元元素图像填充pdfdoc

function toBase64(url, x, y, pdfdoc) {
    return new Promise(async(resolve, reject) => {
        var req = await https.get(url, (res) => {
            res.setEncoding('base64');
            let body = "data:" + res.headers["content-type"] + ";base64,";
            res.on('data', (d) => {
                body += d;
            });
            res.on('end', () => {
                pdfdoc.image(body, x, y);
                resolve(res);
            });
        });
        req.on('error', err => {
            console.error('error!');
            reject(err);
        });

    });

}
if(cellEl.type==“Image”){wait toBase64(cellEl.url,x,y,pdfdoc);}

function toBase64(url, x, y, pdfdoc) {
    return new Promise(async(resolve, reject) => {
        var req = await https.get(url, (res) => {
            res.setEncoding('base64');
            let body = "data:" + res.headers["content-type"] + ";base64,";
            res.on('data', (d) => {
                body += d;
            });
            res.on('end', () => {
                pdfdoc.image(body, x, y);
                resolve(res);
            });
        });
        req.on('error', err => {
            console.error('error!');
            reject(err);
        });

    });

}

我很感激这个帖子。我已经使用pdftk很多年了,但之前从未使用过FireStore。您是否可以分享如何/如果必须安装二进制文件才能通过云功能使用pdftk,