用node.js中的firebase存储和缓冲区有效地分割和服务PDF文件(骑士之路)
#typescript #node #firebase #express

prologueðâtrogut

在编码的土地上,客户的愿望是最高的,我偶然发现了一个巨大的挑战。手头的任务是驯服一个野生的PDF,将其不守规矩的页面分开,以防止浏览器放置合适。有了强大的火箱存储和我身边的可信赖缓冲区,我开始了一个史诗般的任务。当我揭开杀死滞后时间和用技巧服务的pdf的秘密时,加入我的秘密!

一章一词Ö-代码)(代码)

曾经,在一个不远的数字领域中,有一个调皮的PDF名为“ example.pdf”。这是一个沉重的生物,臭名昭著,因为它引起了浏览器混乱,并以懒惰的方式使用户沮丧。我们的勇敢的开发人员掌握了代码和决心,试图将命令带入此不守规矩的文件。让我们深入了解魔法森林,见证魔法的展开:

import { RequestHandler } from 'express';
import { Config } from '../../../utils/config';
import { getFilePath } from '../../../utils/helpers/common';
const { Storage } = require('@google-cloud/storage');
import * as mime from 'mime';
const { PDFDocument } = require('pdf-lib');

export const getBookFileWithRange: RequestHandler = async (req: any, res) => {
  const dummyFileURL = 'https://dummy-firebase-storage.com/books/example.pdf';

  // Behold! The filename of our fearless PDF hero!
  const filename = 'example.pdf';

  // Preparing our trusty steed, the Firebase Storage
  const storage = new Storage();

  try {
    const bucket = storage.bucket(Config.storageBucket);
    const fileName = filename;

    // Venturing into Firebase Storage to fetch the mythical file
    const file = await bucket.file(filename);

    // Slaying the PDF dragon, one byte at a time
    const [fileBuffer] = await file.download();

    // Unlocking the ancient secrets of pdf-lib
    const firstDonorPdfDoc = await PDFDocument.load(new Uint8Array(Buffer.from(fileBuffer)));

    // Creating an empty canvas for our newly crafted PDF masterpiece
    const pdfDoc = await PDFDocument.create();
    let start: number = Number(req.query.startPage);
    let pageCount = 0;
    let end: number = Number(req.query.endPage);

    // Carefully selecting and copying the desired pages
    for (start - 1; start - 1 <= end - 1; start++) {
      const [page] = await pdfDoc.copyPages(firstDonorPdfDoc, [start - 1]);
      pdfDoc.insertPage(pageCount, page);
      pageCount++;
    }

    // Polishing our creation, preparing it for the grand reveal
    const pdfBytes = await pdfDoc.save();

    // Identifying the magical essence of our creation (the content type)
    const contentType = mime.getType(fileName);

    // Announcing to the world the type of our creation
    res.set('Content-Type', contentType?.toString());

    // The moment of triumph has arrived! Sending our masterpiece to the waiting world
    return res.status(200).send(Buffer.from(pdfBytes));
  } catch (error) {
    console.error('Oh no! The dragon proved too fierce:', error);
    return res.status(500).send('Error downloading file');
  }
};

第二章 - 深水潜水)

在我们异想天开的冒险中,我们依靠几个神奇的文物:

Express:勇敢而可靠的Express框架,引导我们通过网络的危险路线。

pdf-lib:一个使我们掌握PDF操纵力量的巫师库,使我们能够轻松拆分,复制和创建PDF文档。

Firebase Storage:一种神秘的云存储服务,授予我们安全存储和检索文件的能力。

mime:一个很小的库,可以帮助我们揭示PDF的真实身份,向等待世界揭示其内容类型。

第3章€â(服务器端)

在这个异想天开的故事中,我们不仅着手进行拆分和服务PDF文件的任务,而且还发现了将代码连接到服务器的魔力。让我们仔细研究一下如何将PDF拆分功能集成到我们的index.js或server.js文件:

import cors from 'cors';
import express from 'express';
import { getBookFileWithRange } from './handlers/get/books/getBookFile';

const app = express();
app.use(cors());

// Endpoint for serving PDF files with page range
app.get('/book/file/by/url/:filename', getBookFileWithRange);

// Your other API endpoints can be added here

// Start the server
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在上面的代码段中,我们首先导入必要的库,例如CORS和Express,以处理与服务器相关的功能。然后,我们从PDF处理模块导入GetBookFileWithRange。

接下来,我们创建一个Express应用程序的实例,将其配置为使用CORS中间件,并定义用于将PDF文件提供特定页面范围的API端点。您可以添加其他端点和路线来满足您的特定应用程序需求。

最后,我们通过调用收听方法并指定服务器应在其中侦听的端口号来启动服务器。在这种情况下,我将其设置为端口3000,但是您可以根据您的要求进行修改。

第4章(进行API调用)

现在,我们已经启动并运行了出色的服务器,是时候通过进行API调用来检索完美量身定制的PDF来释放其功能了。我们将击中的API端点是/book/file/by/url/:filename,它接受一些查询参数来自定义输出。让我们潜入并探索如何充分利用它!

端点

GET /book/file/by/url/:filename

查询参数

  1. startPage(必需):指定启动页码应分割pdf的位置。必须是一个正整数。

  2. endPage(必需):指定结尾页号,直到应分开PDF为止。必须是一个高于或等于startPage的正整数。

第5章 - !(结尾)

使用这些迷人的工具,我们踏上了崇高的追求,以杀死可怕的滞后时间,并向我们的用户提供完美量身定制的PDF。代码生动起来,以精确和宽限的方式执行每个步骤。

总而言之,通过将Firebase存储,PDF-LIB库和缓冲对象的功能结合在一起,我们可以以安全且优化的方式有效地拆分并提供PDF文件。该解决方案允许在确保流畅的用户体验的同时管理大型PDF文件的灵活性。

现在,随着太阳落在我们的编码冒险中,我,骑士柯林斯必须告别您。不要忘了喜欢……和shareð。