通过Google Drive API将空白的PDF上传到Google Drive。

问题描述 投票:0回答:1

我试图上传一个生成的PDF到我的谷歌驱动器文件夹,使用 pdf包 和谷歌驱动器的 顶端 但每次上传时,尽管与生成的标签大小相同,但都是一个空白文档。我有一个单独的端点,我返回 doc.pipe(res) 当我呼叫 createLabel 函数,所以我知道pdf是正确生成的,但当我尝试流媒体时,我的 upload-to-googledrive.js ,该文件成功上传为 空白 pdf。有人有什么建议吗?

create_label.js

module.exports.createLabel = async (
    fromAddress,
    toAddress,
    recipient,
    weight,
    qrCodeUrl,
    orderID
) => {
    const doc = new PDFDocument();

    // Rounded Rect is layout
    doc.roundedRect(10, 10, 590, 720, 5).stroke();
    // Fit the image within the dimensions
    doc.image("assets/rocketship.png", 40, 30, { fit: [100, 100] }).stroke();

    doc.rect(20, 20, 200, 150).stroke();
    doc.fontSize(20).font("Times-Bold").text("From:", 230, 30).moveDown(0.5);
    doc.fontSize(18).font("Times-Roman").text(fromAddress);

    doc.rect(220, 20, 370, 150).stroke();
    doc.fontSize(20).font("Times-Bold").text("To:", 30, 180).moveDown(0.5);
    doc.fontSize(18).font("Times-Roman").text(toAddress).moveDown(1);
    doc.fontSize(18).font("Times-Bold").text(recipient).moveDown(1);

    doc.rect(20, 170, 570, 300).stroke();

    doc.rect(20, 470, 270, 250).stroke();
    doc
        .fontSize(20)
        .font("Times-Roman")
        .text(`Order ID: ${orderID}`, 30, 480)
        .moveDown(0.5);
    doc.fontSize(20).font("Times-Roman").text(`Weight: ${weight}`).moveDown(0.5);

    doc.image(qrCodeUrl, 300, 440, { width: 300 });

    doc.rect(290, 470, 300, 250).stroke();

    doc.end();

    return await getStream(doc);
};


创建标签.js

// other setup code
try {
            const {
                fromAddress,
                recipient,
                shippingPackageId,
                orderID,
                toAddress,
                weight,
            } = req.body;

            logger.info("Attempting to generate QR code");
            const qrCodeUrl = await createQR(shippingPackageId.toString());
            // create label
            logger.info("Attempting to create label");
            const stream = await createLabel(
                fromAddress,
                toAddress,
                recipient,
                weight,
                qrCodeUrl,
                orderID
            );

            logger.info("Uploading to google drive");
            uploadToDrive(orderID, stream);

            //Respond 200 if everything went well
            return res.status(200).send("Succesfully Uploaded to google drive");
        } catch (error) {
            throw res.status(500).send(error);
        }

上传到googledrive.js

module.exports.uploadToDrive = (orderID, stream) => {
// ... google drive setup functions
/**
     * Lists the names and IDs of up to 10 files.
     * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
     */
    function uploadFile(auth) {
        const folderId = `1iAZcU12zgwWC6Iw1eln9kZGx8POhkVLT`;

        const fileMetadata = {
            name: `label_${orderID}.pdf`,
            parents: [folderId],
        };

        const media = {
            mimeType: "application/pdf",
            body: stream,
        };

        const drive = google.drive({ version: "v3", auth });

        drive.files.create(
            {
                resource: fileMetadata,
                media: media,
                fields: "id",
            },
            function (err, file) {
                if (err) {
                    // Handle error
                    throw err;
                } else {
                    console.log("file uploaded");
                }
            }
        );
    }
node.js google-api google-drive-api google-api-js-client
1个回答
1
投票

当我看到 doc我以为是流对象的问题。所以我想提出以下修改意见。请修改 createLabel 如下。

寄件人:

return await getStream(doc);

收件人:

return doc;

参考。

© www.soinside.com 2019 - 2024. All rights reserved.