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