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

时间:2018-06-26 02:10:38

标签: 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时,{{1 }}很快返回,而没有扫描整个PDF [0]。在AWS Lambda上,重要的是要快速完成以节省资源并避免超时!)

1 个答案:

答案 0 :(得分:3)

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

在您的代码中:

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

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

在GitHub上检查此功能source

他的@BenFortune与关于GIF第一帧的类似answer相似,因此获得question的信用。我以它为灵感,并用PDF测试了该解决方案,它确实有效。

希望有帮助。