Пустые PDF-файлы загружаются на Google Drive через API Google Drive - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь загрузить сгенерированный PDF-файл в папку на диске Google, используя pdfkit и api на диске Google, но каждый раз, когда он загружается, он является пустым документом, хотя его размер совпадает с размером сгенерированные ярлыки. У меня есть отдельная конечная точка, которую я возвращаю 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);
};


index. 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");
                }
            }
        );
    }

1 Ответ

1 голос
/ 28 апреля 2020

Когда я увидел doc, я подумал, что это объект потока. Поэтому я хотел бы предложить следующую модификацию. Пожалуйста, измените функцию createLabel следующим образом.

С:

return await getStream(doc);

Кому:

return doc;

Ссылка:

...