amazon-web-services - 在 GraphicsMagick 中对流中的 pdf 第一页进行缩略图

标签 amazon-web-services pdf thumbnails graphicsmagick

如果我有 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的最后一页有时是空白的,而且我在命令行上运行gm时注意到对于大型 pdf,[0] 返回速度非常快,而没有 [0] 则会扫描整个 pdf。在 AWS Lambda 上,快速完成以节省资源非常重要并避免超时!)

最佳答案

可以使用.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关于 GIF 第一帧。我以此为灵感,用 PDF 测试了这个解决方案,它确实有效。

希望有帮助。

关于amazon-web-services - 在 GraphicsMagick 中对流中的 pdf 第一页进行缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51033963/

相关文章:

amazon-web-services - AWS Beanstalk 和 IPset

node.js - Node 环回+API响应返回二进制数据

pdf - 使用 Ghostscript 调整 PDF 大小

CSS 剪辑和绝对定位

java - 当我尝试访问应用程序的 Intent 数据时,为什么它会崩溃?

android - 来自 Web 的 ListView 的图像缩略图

ssl - 如何将 SSL 证书附加到单实例 beanstalk 应用程序

amazon-web-services - Api Gateway Stages 的不同 Cognito 池授权器

linux - amazon web service -EC2 linux vm 没有显卡或共享显卡

python - 在 Python 中为现有 PDF 创建大纲/目录