Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Firebase存储中获取图像并放入PDF_Javascript_Google Cloud Functions_Node Pdfkit - Fatal编程技术网

Javascript 从Firebase存储中获取图像并放入PDF

Javascript 从Firebase存储中获取图像并放入PDF,javascript,google-cloud-functions,node-pdfkit,Javascript,Google Cloud Functions,Node Pdfkit,所以我是PDF工具包的新手,对Javascript有基本的了解,但我似乎一辈子都不知道如何将Firebase存储中的图像放入PDF,或者是否有方法使用GCF存储该图像并将其放入PDF。我正在使用Google Cloud函数生成PDF,到目前为止,我的Node.js如下所示: exports.pdf = functions.https.onRequest((request,response)=>{ //Create a document const PDFDocument =

所以我是PDF工具包的新手,对Javascript有基本的了解,但我似乎一辈子都不知道如何将Firebase存储中的图像放入PDF,或者是否有方法使用GCF存储该图像并将其放入PDF。我正在使用Google Cloud函数生成PDF,到目前为止,我的Node.js如下所示:

exports.pdf = functions.https.onRequest((request,response)=>{
    //Create a document
    const PDFDocument = require('pdfkit');
    const doc = new PDFDocument();
    const storageBucket = admin.storage().bucket();
    const logo = g
    generateHeader(doc);
    // Pipe its output somewhere, like to a file or HTTP response
    // See below for browser usage

    // Embed a font, set the font size, and render some text
    doc.font('Courier')
       .fontSize(15)
       .text('Some text with an embedded font!', 100, 100);

    // Add an image, constrain it to a given size, and center it vertically and horizontally
    // doc.image('https://firebasestorage.googleapis.com/v0/b/redog-bf9c8.appspot.com/o/pdfresource%2Fsplash.png?alt=media&token=25028ea2-5085-4782-9038-88b694b69f50', {
    //    fit: [250, 300],
    //    align: 'center',
    //    valign: 'center'
    // });

    // Add another page
    doc.addPage()
       .fontSize(25)
       .text('Here is some vector graphics...', 100, 100);

    // Draw a triangle
    doc.save()
       .moveTo(100, 150)
       .lineTo(100, 250)
       .lineTo(200, 250)
       .fill("#FF3300");

    // Apply some transforms and render an SVG path with the 'even-odd' fill rule
    doc.scale(0.6)
       .translate(470, -380)
       .path('M 250,75 L 323,301 131,161 369,161 177,301 z')
       .fill('red', 'even-odd')
       .restore();

    // Add some text with annotations
    doc.addPage()
       .fillColor("blue")
       .text('Here is a link!', 100, 100)
       .underline(100, 100, 160, 27, {color: "#0000FF"})
       .link(100, 100, 160, 27, 'http://google.com/');

    // Finalize PDF file
    const myPdfFile = admin.storage().bucket().file('/test/Arbeitsvertrag.pdf');
const stream = doc.pipe(myPdfFile.createWriteStream());
    doc.end();
    });

    function generateHeader(doc) {
        doc
          .image("storage/pdfresource/splash.png", 50, 45, { width: 50 })
          .fillColor("#444444")
          .fontSize(20)
          .text("ACME Inc.", 110, 57)
          .fontSize(10)
          .text("123 Main Street", 200, 65, { align: "right" })
          .text("New York, NY, 10025", 200, 80, { align: "right" })
          .moveDown();
      }
我遇到的问题是在GenerateHeader函数中…它一直存在,它找不到文件…有人知道我如何将其指向正确的方向吗?

我没有完全回答您的问题,但如果您想在PDF中嵌入静态图像,例如公司徽标,这里有一个解决方案

您可以将图像存储在
functions
文件夹下的文件夹中,并在您的云功能代码中调用它

例如,在IDE中,在
functions
文件夹下创建一个文件夹
images
,在此文件夹下添加图像
splash.png
,并在代码中调用图像,如下所示:

  doc
    .image('./images/splash.png', 50, 45, { width: 50 })
    .fillColor('#444444')
    ....

然后重新部署云功能,它应该可以做到这一点。

这里的解决方案是将下载url放入一个单独的功能中:

  function toBase64(url) {
                return new Promise(async (resolve, reject)=>{
                    var https = require('https');
                    var req = await https.get(url, (res) => {
                        res.setEncoding('base64');
                        let body = "data:" + res.headers["content-type"] + ";base64,";
                        console.log("BODY", body)
                        res.on('data', (d) => {
                            body += d;
                        });
                        res.on('end', () => {
                            console.log("END", body)

                            resolve(body);
                        });
                    });
                    req.on('error', err => {
                        console.error('error!',err);
                        reject(err);
                    });

                });

            }
然后将其放入您的文档中,如下所示:

return Promise.all([toBase64(url)]).then(([base64])=>{
doc.image(base64,{width:50});
})

这确实是我想做的事情之一,但我还需要能够从Firebase存储(用于其他人的公司徽标)中提取它。我会投票,因为它给了我一半的解决方案,所以谢谢你