草庐IT

node.js - ImageMagick 不再在 AWS Lambda 中转换 pdf

coder 2023-05-30 原文

在过去的 18 个月里,我在 S3 对象上运行了一个 AWS Lambda 函数,但它在大约一个月前经过一次小更新后就死了。我已经恢复了它,但它仍然坏了。我已经研究过使用 ImageMagick 进行最基本的 pdf 转换,但没有成功,所以我认为 AWS 更新了一些内容并导致 pdf 模块被删除或停止工作。

我只完成了我在 Node.js 8.10 中的核心代码中基本完成的基本功能:

gm(response.Body).setFormat("png").stream((err, stdout,stderr) => {
  if (err) {
    console.log('broken');
  }
  const chunks = [];
  stdout.on('data', (chunk) => {
    chunks.push(chunk);
  });
  stdout.on('end', () => {
    console.log('gm done!');
  });
  stderr.on('data', (data) => {
    console.log('std error data ' + data);
  })
});

带有错误响应:

std error dataconvert: unable to load module `/usr/lib64/ImageMagick-6.7.8/modules-Q16/coders/pdf.la': file not found

我还尝试迁移到 Node.js 10.x 并使用可通过 aws 无服务器应用程序存储库获得的 ImageMagick 层。在相同的代码上尝试这个会产生这个错误

std error data convert: FailedToExecuteCommand `'gs' -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 '-sDEVICE=pngalpha' -dTextAlphaBits=4 -dGraphicsAlphaBits=4 '-r72x72' '-sOutputFile=/tmp/magick-22TOeBgB4WrfoN%d' '-f/tmp/magick-22KvuEBeuJuyq3' '-f/tmp/magick-22dj24vSktMXsj'' (1) @ error/pdf.c/InvokePDFDelegate/292

在这两种情况下,当在图像文件上运行时,该函数都能正常工作。

基于此,我认为 aws 8.10 ImageMagick 和 10 层都缺少 pdf 模块,但我不确定如何添加它或为什么首先将其删除。修复此功能的最佳方法是什么?

编辑

所以我下载了https://github.com/serverlesspub/imagemagick-aws-lambda-2并手动构建库,将其上传到 Lambda 并使其成功作为一个层工作,但它不包括作为可选库的 GhostScript。我试图将它添加到 Makefile_ImageMagick 中,它构建并在结果中有一些对 Ghostscript 的引用,但运行它并不能解决 PDF 问题(图像仍然有效)。将 GhostScript 可选库添加到 Make 文件的最佳方法是什么?

最佳答案

虽然其他答案有所帮助,但要找到可行的解决方案还有很多工作要做,所以下面是我设法解决这个问题的方法,特别是针对 NodeJS。

下载:https://github.com/sina-masnadi/lambda-ghostscript

压缩 bin 目录并将其作为层上传到 Lambda。

添加 https://github.com/sina-masnadi/node-gs到您的 NodeJS 模块。您可以将它们作为项目的一部分上传,也可以按照我的方式上传(以及所有其他必需的)。

添加 https://github.com/serverlesspub/imagemagick-aws-lambda-2作为一层。最好的方法是在 Lambda 中创建一个新函数,选择浏览无服务器应用程序存储库,搜索“ImageMagick”并选择“image-magick-lambda-layer”(您也可以构建它并将其上传为层) .

将三层添加到你的函数中,我已经按照这个顺序完成了

  1. GhostScript
  2. ImageMagick
  3. NodeJS 模块

将 appPath 添加到 ImageMagick 和 GhostScript 的 require 语句中:

var gm = require("gm").subClass({imageMagick: true, appPath: '/opt/bin/'});
var gs = require('gs');

我的是在一个异步 waterfall 中,所以在我之前的处理函数之前,我添加了这个函数来转换为 png,如果不是图像的话:

  function convertIfPdf(response, next) {
    if (fileType == "pdf") {
      fs.writeFile("/tmp/temp.pdf", response.Body, function(err) {
        if (!err) {
          gs().batch().nopause().executablePath('/opt/bin/./gs').device('png16m').input("/tmp/temp.pdf").output('/tmp/temp.png').exec(function (err, stdout, stderr){
            if (!err && !stderr) {
              var data = fs.readFileSync('/tmp/temp.png');
              next(null, data);
            } else {
              console.log(err);
              console.log(stderr);
            }
          });
        }
      });
    } else {
      next(null, response.Body);
    }
  }

从那时起,您可以执行之前在 ImageMagick 中执行的操作,因为它的格式相同。可能有更好的方法来进行 pdf 转换,但除非使用文件,否则我遇到了 GS 库的问题。如果有更好的方法请告诉我。

如果您在加载库时遇到问题,请确保路径正确,这取决于您如何压缩它。

关于node.js - ImageMagick 不再在 AWS Lambda 中转换 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57067351/

有关node.js - ImageMagick 不再在 AWS Lambda 中转换 pdf的更多相关文章

  1. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

  2. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  3. ruby-on-rails - 使用 Rmagick 或 ImageMagick 在背景上放置标题 - 2

    我有一张背景图片,我想在其中添加一个文本框。我想弄清楚如何将标题放置在其顶部的正确位置。(我使用标题是因为我需要自动换行功能)。现在,我只能让文本显示在左上角,但我需要能够手动定位它的开始位置。require'RMagick'require'Pry'includeMagicktext="Loremipsumdolorsitamet"img=ImageList.new('template001.jpg')img 最佳答案 这是使用convert的ImageMagick命令行的答案。如果你想在Rmagick中使用这个方法,你必须自己移植

  4. ruby-on-rails - Prawn PDF : I need to generate nested tables - 2

    我需要一个表,其中行实际上是2行表,一个嵌套表是..我怎样才能在Prawn中做到这一点?也许我需要延期..但哪一个? 最佳答案 现在支持子表:Prawn::Document.generate("subtable.pdf")do|pdf|subtable=pdf.make_table([["sub"],["table"]])pdf.table([[subtable,"original"]])end 关于ruby-on-rails-PrawnPDF:Ineedtogeneratenested

  5. ruby - 如何在ruby中转换为big endian - 2

    我有一个小端顺序的字符串,作为十六进制编码的字符串000000020597ba1f0cd423b2a3abb0259a54ee5f783077a4ad45fb6200000218000000008348d1339e6797e2b15e9a3f2fb7da08768e99f02727e4227e02903e43a42b31511553101a051f3c00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000我想将每个32位block从l

  6. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

  7. ruby-on-rails - 在 fastercsv 中转义逗号值 - 2

    我正在研究csv生成。我正在分隔由逗号(,)分隔的值。如果字段中的值包含逗号,则不应在excel中分隔该字段。所以我想在那里放一个转义字符。我正在使用FasterCsv。那么我如何放置转义字符。fastercsv的转义字符是什么? 最佳答案 只需引用每个字段(默认为双引号),其中的逗号将被忽略:CSV.generate(:col_sep=>',',:quote_char=>'"')do|row|row"\"Quid,quid\",latinumdictum\n\"sit,altum\",viditur.\n"

  8. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  9. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  10. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

随机推荐