如何解决pdfmake node js库中的Google Cloud函数本地目录图像读取错误
我在谷歌云函数中使用 pdfmake nodejs 库来生成 pdf 文件。
我正在将图像下载到本地临时目录并在 pdfmake 中使用该图像,并且我已经部署了具有函数本身的本地图像,并且还在 pdf 中使用了该图像。
下载的图片位于“/tmp/image1.png”,本地图片位于“res/image2.png”
使用本地模拟器测试时,代码完全没有问题,但是当我尝试在云函数生产环境中运行时,出现以下错误,
无效图像:错误:未知图像格式。图像字典应包含 dataURL 条目(或 node.js 中的本地文件路径)
我已经部署了接近 14 个版本到云函数迭代图像格式、文件名、仅使用本地图像、仅使用 tmp 文件夹中下载的图像,但没有运气。
当相同的函数在本地模拟器上运行没有任何问题时,我相信这一定是与云函数读写权限有关。
跟随它的依赖,
"dependencies": {
"electron": "^11.1.1","express": "^4.17.1","firebase-admin": "^9.2.0","firebase-functions": "^3.11.0","http": "0.0.1-security","moment": "^2.29.1","open": "^7.3.1","pdfmake": "^0.1.69"
},
以下代码是从链接下载图片到临时文件夹,
var path = require('path');
import http from 'http'
import https from 'https'
import { createWriteStream,unlink } from 'fs'
const tempDir = os.tmpdir()
const tempFileName = path.join(tempDir,'Pic.png')
var url = "https://someimageurl"
var outFileName = path.join(tempDir,'out.pdf')
var tradeMark = "res/mark.png"
var imageSize = 75
var downloadPic = ''
const proto = !url.charAt(4).localeCompare('s') ? https : http;
function makePdf(){
var fonts = {
Roboto: {
normal: 'fonts/Roboto-Regular.ttf',bold: 'fonts/Roboto-Medium.ttf',italics: 'fonts/Roboto-Italic.ttf',bolditalics: 'fonts/Roboto-MediumItalic.ttf'
},Algerian: {
normal: 'fonts/Algerian.ttf',bold: 'fonts/Algerian.ttf',bolditalics: 'fonts/Roboto-MediumItalic.ttf'
}
};
var pdfMakePrinter = require('./node_modules/pdfmake/src/printer');
var printer = new pdfMakePrinter(fonts);
var docDefinition = {
pageOrientation: 'landscape',pageMargins: [20,10,20,0],content: [
{
columns: [
{
image: downloadPic,fit: [imageSize,imageSize],width: 'auto'
},[{
text: "name",style: { bold: true,fontSize: 30,font: 'Algerian',color: 'green' },alignment: 'center',width: '*',},{
text: "sub Header",fontSize: 20,font: 'Roboto',margin: [0,5,10]
},],{
image: tradeMark,fit: [imageSize - 25,imageSize - 25],width: 'auto',12,0]
},columnGap: 20
}
]
};
var pdfDoc = printer.createPdfKitDocument(docDefinition);
pdfDoc.pipe(createWriteStream(outFileName));
pdfDoc.end();
}
function downloadAndPrepareReport(url,filePath) {
console.log("Going to download image file: url: " + url + " filePath: " + filePath)
const proto = !url.charAt(4).localeCompare('s') ? https : http;
return new Promise((resolve,reject) => {
const file = createWriteStream(filePath);
let fileInfo = null;
const request = proto.get(url,response => {
if (response.statusCode !== 200) {
console.log("Image Download failed")
reject(new Error(`Failed to get '${url}' (${response.statusCode})`));
return;
}
fileInfo = {
mime: response.headers['content-type'],size: parseInt(response.headers['content-length'],10),};
response.pipe(file);
});
file.on('finish',() => {
console.log("Image Download Complete")
downloadPic = filePath
makePdf()
resolve("ok done")
}
);
request.on('error',err => {
unlink(filePath,() => reject(err));
});
file.on('error',() => reject(err));
});
request.end();
});
}
downloadAndPrepareReport(url,tempFileName)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。