缩略图来自 GraphicsMagick 中流的 pdf 的第一页

Posted

技术标签:

【中文标题】缩略图来自 GraphicsMagick 中流的 pdf 的第一页【英文标题】:Thumbnail the first page of a pdf from a stream in GraphicsMagick 【发布时间】:2018-12-04 15:33:39 【问题描述】:

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

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

如果我有一个名为 doc.pdf 的文件,那么将 doc.pdf[0] 传递给 gm 效果很好。

但我的问题是我在 AWS Lambda 函数上生成缩略图,而 Lambda 将从源 S3 存储桶流式传输的数据作为输入数据。我的 lambda 的相关片段如下所示:

// 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,gm 正在从 pdf 的最后一页生成缩略图。我如何在其中获得[0]?我在gm documentation 中没有看到页面选择器,因为他们的所有示例都使用文件名,而不是流,我认为应该有一个 API,但我还没有找到。

(注意:[0] 非常重要,不仅因为多页 PDF 的最后一页有时是空白的,而且我注意到在带有大型 pdf 的命令行上运行 gm 时,[0] 返回非常快,而如果没有[0],整个 pdf 都会被扫描。在 AWS Lambda 上,快速完成以节省资源并避免超时非常重要!)

【问题讨论】:

包含一些冗余的可能解决方案是将 s3 对象本地存储在 /tmp/ 文件夹中(每个 lambda 都可以访问 /tmp 目录),然后使用 gm(pdfFileName + "[0]")。换句话说,将文件从 s3 下载到 lambda 临时文件夹中,然后以与本地运行相同的方式运行 gm 谢谢,我可以试一试,但我很惊讶没有函数或函数参数。也许赏金会引起一些关注。 :) 【参考方案1】:

可以使用.selectFrame()方法,相当于在文件名中直接指定[0]

在您的代码中:

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

不要对函数的名称感到困惑。它不仅适用于 GIF 的 frames,而且适用于 PDF 的 pages

在 GitHub 上查看此功能 source。

感谢@BenFortune 他的answer 类似于question 关于GIF 第一帧的内容。我以此为灵感并用 PDF 测试了这个解决方案,它确实有效。

希望对你有帮助。

【讨论】:

完美,我希望它会那么容易。我一定已经浏览了 lib except 中的所有源文件以获取 args! (我为 [0] 做了 grep,但你不知道 course 它会是一个变量。)非常有意义。

以上是关于缩略图来自 GraphicsMagick 中流的 pdf 的第一页的主要内容,如果未能解决你的问题,请参考以下文章

ftp+nginx+lua_Nginx+GraphicsMagick来实现目录浏览实时缩略图

CentOS7下安装GraphicsMagick1.3.21

graphicsmagick - 将图像转换为 pdf,反之亦然

图片工具GraphicsMagick的下载安装配置使用

图片工具GraphicsMagick的下载安装配置使用

来自 MapView Annotation-iOS 的缩略图