代码之家  ›  专栏  ›  技术社区  ›  Ray Toal

在graphicsmagick中从流中缩略pdf的第一页

  •  1
  • Ray Toal  · 技术社区  · 6 年前

    如果我有一个pdf文件并且正在运行,我知道如何使用graphicsmagick制作pdf第一页的缩略图 gm 在当地。我可以这么做:

    gm(pdfFileName + "[0]")
      .background("white")
      .flatten()
      .resize(200, 200)
      .write("output.jpg", (err, res) => {
        if (err) console.log(err);
      });
    

    如果我有一个叫 doc.pdf 然后通过 doc.pdf[0] 总经理 效果很好。

    但我的问题是,我正在生成aws lambda函数的缩略图,lambda接受来自源s3存储桶的流式输入数据。我的羔羊的相关切片如下所示:

    // Download the image from S3, transform, and upload to a different S3 bucket.
    async.waterfall([
      function download(next) {
        s3.getObject({
          Bucket: sourceBucket,
          Key: sourceKey
        },
        next);
      },
    
      function transform(response, next) {
        gm(response.Body).size(function(err, size) {       // <--- gm USED HERE
        .
        .
        .
    

    一切正常,但对于多页PDF, 总经理 正在从PDF的最后一页生成缩略图。我怎么得到 [0] 在里面?我在 gm documentation 因为他们所有的例子都使用文件名,而不是流,我相信应该有一个api,但我还没有找到。

    (注:在 [0] 非常重要,不仅因为多页PDF的最后一页有时是空白的,而且我在运行时注意到 总经理 在带有大型pdf的命令行中, [0] 在没有 [0] 扫描整个pdf文件。在aws lambda上,快速完成以节省资源并避免超时是很重要的!)

    1 回复  |  直到 6 年前
        1
  •  3
  •   Maxim Mazurok    6 年前

    你可以用 .selectFrame() 方法,相当于指定 [0] 直接输入文件名。

    在你的代码中:

    function transform(response, next) {
        gm(response.Body)
            .selectFrame(0)       // <--- select the first page
            .size(function(err, size) {
            .
            .
            .
    

    不要对函数的名称感到困惑。它不仅适用于 框架 对于gif,也可以与 对于PDF。

    签出此函数 source 在Github上。

    学分 @BenFortune 为了他的 answer 相似 question 关于gifs第一帧。我以它为灵感,并用pdf测试了这个解决方案,它实际上是有效的。

    希望有帮助。