从GraphicsMagick中的流中缩略图pdf的第一页

Ray*_*oal 2 pdf thumbnails amazon-web-services graphicsmagick

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

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

如果我有一个名为的文件,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
    .
    .
    .
Run Code Online (Sandbox Code Playgroud)

一切正常,但对于多页 pdf,gm正在从 pdf 的最后一页生成缩略图。我怎样才能进去[0]?我没有在gm 文档中看到页面选择器,因为他们的所有示例都使用文件名,而不是流我相信应该有一个 API,但我还没有找到。

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

Max*_*rok 5

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

在您的代码中:

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

不要对函数的名称感到困惑。它不仅适用于 GIF 的框架,而且适用于 PDF 的页面

在 GitHub 上查看此函数

感谢@BenFortune对有关 GIF 第一帧的类似问题的回答。我把它作为灵感并用 PDF 测试了这个解决方案,它确实有效。

希望能帮助到你。