AWS Lambda 函数 - 将 PDF 转换为图像

2024-01-07

我正在开发应用程序,用户可以在其中上传一些 pdf 格式的图纸。上传的文件存储在S3上。上传后,文件必须转换为图像。为此,我创建了 lambda 函数,该函数将文件从 S3 下载到 lambda 执行环境中的 /tmp 文件夹,然后从 imagemagick 调用“convert”命令。

convert sourceFile.pdf targetFile.png

Lambda运行环境是nodejs 4.3。内存设置为128MB,超时30秒。

现在的问题是一些文件转换成功,而另一些文件则失败并出现以下错误:

{ [错误:命令失败:/bin/sh -c 转换 /tmp/sourceFile.pdf /tmp/targetFile.png 转换:%s' (%d) "gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" "-sOutputFile=/tmp/magick-QRH6nVLV--0000001" "-f/tmp/magick-B610L5uo" "-f/tmp/magick-tIe1MjeR" @ error/utility.c/SystemCommand/1890. convert: Postscript delegate failed/tmp/sourceFile.pdf':没有这样的 文件或目录@ error/pdf.c/ReadPDFImage/678。转换:无图像 定义`/tmp/targetFile.png' @ 错误/convert.c/ConvertImageCommand/3046。 ] 被杀:假,代码:1, 信号:空,cmd:'/bin/sh -c 转换/tmp/sourceFile.pdf /tmp/targetFile.png' }

起初我不明白为什么会发生这种情况,然后我尝试使用相同的命令在本地 Ubuntu 计算机上转换有问题的文件。这是终端的输出:

**** Warning: considering '0000000000 XXXXX n' as a free entry. **** This file had errors that were repaired or ignored. **** The file was produced by: **** >>>> Mac OS X 10.10.5 Quartz PDFContext <<<< **** Please notify the author of the software that produced this **** file that it does not conform to Adobe's published PDF **** specification.

所以消息非常清楚,但文件无论如何都会转换为 png。如果我尝试做convert source.pdf target.pdf在那之后convert target.pdf image.png,文件已修复并转换,没有任何错误。这不适用于 lambda。

由于同样的事情在一种环境中有效,但在另一种环境中无效,所以我最好的猜测是 Ghostscript 的版本是问题所在。 AMI 上安装的版本是 8.70。在我的本地机器上 Ghostsript 版本是 9.18。

我的问题是:

  • 是ghostscript的版本问题吗?这是旧版本的错误吗 幽灵脚本的版本?如果没有,我怎样才能告诉ghostscript(用或 不使用 imagemagick)来修复或忽略错误,就像它所做的那样 我当地的环境?
  • 如果旧版本有问题,是否可以构建ghostscript 从源代码创建nodejs模块,然后使用该版本 Ghostscript 而不是安装的那个?
  • 有没有更简单的方法将 pdf 转换为图像而不使用 imagemagick 和 Ghostscript ?

UPDATElambda代码的相关部分:

var exec = require('child_process').exec;
var AWS = require('aws-sdk');
var fs = require('fs');
...

var localSourceFile = '/tmp/sourceFile.pdf';
var localTargetFile = '/tmp/targetFile.png';

var writeStream = fs.createWriteStream(localSourceFile);
writeStream.write(body);
writeStream.end();

writeStream.on('error', function (err) {
    console.log("Error writing data from s3 to tmp folder.");
    context.fail(err);
});

writeStream.on('finish', function () {
    var cmd = 'convert ' + localSourceFile + ' ' + localTargetFile;

    exec(cmd, function (err, stdout, stderr ) {

        if (err) {
            console.log("Error executing convert command.");
            context.fail(err);
        }

        if (stderr) {
            console.log("Command executed successfully but returned error.");
            context.fail(stderr);
        }else{
            //file converted successfully - do something...
        }
    });
});

您可以在以下存储库中找到适用于 Lambda 的 Ghostscript 的编译版本。 您应该将这些文件添加到要作为源代码上传到 AWS Lambda 的 zip 文件中。

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

这是一个调用 Ghostscript 函数的 npm 包:

https://github.com/sina-masnadi/node-gs https://github.com/sina-masnadi/node-gs

将编译好的Ghostscript文件复制到项目中并添加npm包后,就可以使用executablePath('path to ghostscript')函数将包指向您之前添加的已编译的 Ghostscript 文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Lambda 函数 - 将 PDF 转换为图像 的相关文章

  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch
  • Node npm 包抛出使用严格:全局发布和安装后未找到命令

    我正在尝试发布 npm 包 当我全局安装该包并尝试运行 cli 命令时 我收到此错误 nvm versions node v0 12 2 bin myPack line 1 use strict command not found nvm
  • 无法连接到 Node.js 上的 MySQL 数据库

    我仍然不明白为什么在尝试连接到 Node js 上的 MYSQL Server 时仍然收到此错误消息 ERROR Error ER ACCESS DENIED ERROR Access denied for user root localh
  • @mailchimp/mailchimp_marketing/types.d.ts'不是nodeJs中的模块

    我在 NodeJS 应用程序中导入了 import mailchimp mailchim marketing import mailchimp from mailchimp mailchimp marketing 但是 它给出以下错误 ty
  • NPM 无法在 Windows 上安装“truffle”

    我正在尝试使用 npm 安装 truffle 但我不熟悉 NodeJS 并且不明白为什么 npm 不会安装它 我尝试npm install g truffle在具有管理员权限的 Powershell 中 经过几行输出后 我收到以下错误消息块
  • Browserify - 如何在浏览器中调用通过 browserify 生成的文件中捆绑的函数

    我是 Nodejs 和 browserify 的新手 我从这个开始link http browserify org 我有文件 main js 其中包含此代码 var unique require uniq var data 1 2 2 3
  • 下载 csv 文件 node.js

    我正在使用 node js 构建一个应用程序并尝试将数据下载为 csv 文件 我正在使用 json2csv https www npmjs com package json2csv https www npmjs com package j
  • Nodejs 中的子域

    如何处理nodejs的子域请求 例如以下代码回显test在控制台中的任何请求http localhost 9876 任何内容 http localhost 9876 5Banything 5D var http require http h
  • Node.js 升级在 Windows 中仍然显示旧版本

    我已使用 msi 安装程序下载并安装了新版本的 nodejs 4 1 2 之后我跑了node v 但它仍然显示旧版本 0 12 2 我尝试重新启动Windows 甚至卸载nodejs并重新安装它 但仍然显示相同的内容 为什么会发生这种情况
  • 在文件之间共享 mqtt 客户端对象

    我这样连接到 MQTT mqtt js const mqtt require mqtt var options needed options var client mqtt connect mqtt someURL options clie
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 使用socket.io进行用户身份验证

    我已经红色了这个教程 http howtonode org socket io auth http howtonode org socket io auth 它展示了如何使用express和socket io对用户进行身份验证 但是有没有一
  • 如何使用 Create-React-App 节点服务器定义 MIME 类型?

    我正在尝试处理这个 WebAssembly 注释 注意 要运行instantiateStreaming and compileStreaming 您需要您的网络服务器来提供 wasm 文件application wasmMIME 类型 ht
  • HTML 格式的 Google Apps 脚本

    是否可以在我的 HTML 中使用 google apps 脚本 我希望能够从外部框架 例如 Node js 以纯 Javascript 形式从表单写入电子表格 https developers google com apps script
  • npmjs.org - 找不到自述文件

    我是 npm 包的主要作者scramjet 一个月以来 我遇到了关于可视性的问题README md在 npmjs 中 The npm 中的超燃冲压发动机包 https www npmjs com package scramjet shows
  • 在 Node 中使用 Babel 导入与请求 [重复]

    这个问题在这里已经有答案了 我想在一个文件中导入一个类 use strict import models from model class Foo bar export default new Foo 当我使用导入时它有效 例如 impor
  • 如何解决 Socket.io 404(未找到)错误?

    我正在使用 Socket io 和 Express 在我的项目中 我有一个登录页面和一个主页 当我成功登录时 我导航到 localhost 3000 home 并收到以下错误 GET http localhost 3000 socket i
  • libxmljs 的替代品 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 目标 使用 Node js 访问网页 使用 xpath 语法操作 DOM 并打印新的 DOM libxm
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • 下载中带有文件名的 NodeJS sendFile

    我尝试使用以下代码将文件发送给客户端 router get get myfile function req res next res sendFile other file name dat 它工作正常 但当用户从以下网址下载此文件时我需要

随机推荐

  • UITableView 中的自定义单元格在滑动编辑后立即移动

    我只想要一个简单的 UITableView 能够向左滑动删除 一切正常 除了我的原型单元中文本视图的正确约束似乎在滑动删除后发生了变化 这是我的表代码 func tableView tableView UITableView cellFor
  • 触摸表视图单元格后的第一个方法 didSelectRowAtIndexPath 或prepareforSegue?

    我根据其类型设计了不同书籍的表格视图 如果用户触摸单元格 则会对需要书籍项目的新视图控制器执行segue 我已在中初始化了这本书 void tableView UITableView tableView didSelectRowAtInde
  • 如何向现有 Windows EC2 实例添加实例存储?

    我有一个 Windows 2008 EC2 实例 我已对其 EBS 启动驱动器进行了一些自定义 我将实例启动为 m1 small 或 m1 large 并且实例存储不会显示为附加驱动器 我读到 ec2 run instances 命令中的
  • 如果文本框为空,如何禁用按钮

    首先 我很抱歉我的英语不好 我是 C 初学者 我制作了一个 Windows 窗体应用程序 但如果文本框为空 我无法禁用一个按钮 我尝试了一些启用的方法 但它们不起作用 希望有人能帮我解决这个问题 非常感谢 public partial cl
  • 如何在 Jenkins 中通过 ssh-agent 直接在 Windows 上使用 git

    我正在尝试更新裸 git 存储库作为构建的一部分 在 Linux 上 它相对简单 dir my git repo git sshagent git sh git fetch origin module module 但是我不知道如何在 Wi
  • 如何向 Oracle 数据库中 CLOB 中包含的 xml 添加属性?

    如何向 Oracle 数据库中 CLOB 中包含的 xml 添加属性 我可以使用 UpdateXML 函数来更新现有属性 但它不会添加属性 您可以使用以下组合deleteXml 与任一appendChildXml insertChildXm
  • App Engine 和 Firebase 托管在一个域中

    我有一个自定义域 travelbox id 已连接到 Firebase 托管 我还有一个 App Engine 应用程序作为我的 API 我想将 App Engine 应用程序托管在api dev travelbox id 我将自定义域映射
  • 如何使母版页中内容页的默认焦点

    我有带有内容占位符的母版页 我有使用母版页的内容页 在我的所有内容页面中 我需要默认关注文本框 以便用户可以直接在文本框中键入内容 而不是将鼠标移到文本框上 在某些页面中没有文本框 因此我不会将默认焦点保留在那里 有什么方法可以在我的母版页
  • Java 字符串返回 null

    我试图让一个类从另一个类返回一个字符串 尽管我得到的返回值为空 我有一个 set 方法 可以在原始类中设置字符串 但是当在第二个类中调用该方法时 我得到 null 返回 这是第一堂课 public class IceCream instan
  • Android Kotlin 回收器视图中点击事件的新意图

    我刚刚开始学习使用 Kotlin 进行 Android 开发 我有一个列出项目的回收者视图 我正在尝试为该项目创建 onClick 事件 然后启动一个新意图并传递项目 id 尝试实例化意图 无法使用提供的参数调用以下函数 时出现错误 我认为
  • 通过在另一个模块中混合来覆盖模块混合行为

    我希望能够来回切换实例如何响应消息 我想通过混合一个模块 然后混合另一个模块来覆盖该行为来做到这一点 Example module Dog def speak puts woof woof end end module Cat def sp
  • 使用数组 C# 中的值过滤数据表

    我有一个删除方法 它获取一个 GUID 数组 并且我有一个数据表 如何过滤数据表 使其仅包含 GUID public void delete Guid guidlist datatable template ReadTemplateList
  • 无效查询参数的 HTTP 404 与 400

    这是我的请求网址 http server com app user getuser userId 9999 http server com app user getuser userId 9999 注意userId是查询参数 未嵌入路径参数
  • 如何在 NEXT JS 中的路由之间传递状态?

    我的页面中有一个对象内的数据 我想从该页面重定向到另一个页面以及数据 如下面的代码 const redirectAppointmentStep1 value gt router push pathname Appointment booki
  • 使用“new”创建对象时使用“return”

    我今天发现了一些非常奇怪的事情 如果你使用构造函数创建对象并且new关键字 但是return来自构造函数的函数 其行为如下 新创建的 对象 是一个函数 这个新函数可以像平常一样调用 但是 如果您保留对this在构造函数中 this引用从构造
  • 在流体容器中,我可以使元素的高度和宽度一样吗?

    我正在使用 container fluid 并且对于使用 span2 等在列上进行水平宽度设置非常有效 我有一个独特的要求 即我想要呈现 方形 的东西 同时仍然享受 Bootstrap 响应式宽度设置的好处 有没有一种好方法可以确保我的元素
  • FormView 绑定中的 DropDownList

    我想将下拉列表绑定到List
  • jQuery 的scrollLeft 不起作用

    我刚刚推出http elliewauters com http elliewauters com有一个我想解决的小问题 该网站使用大量动画水平滚动从一个 页面 到下一个 页面 但刷新时大多数浏览器都会记住滚动位置并返回到之前的位置 我不想要
  • 如何在 Nginx 上使用 PHP 以不同用户身份运行 shell 脚本?

    尝试使用 POST 请求触发 shell 脚本 由 nginx 处理 到目前为止还没有成功 我拥有的 exec whoami nginx nginx x 220 498 Nginx web server var lib nginx sbin
  • AWS Lambda 函数 - 将 PDF 转换为图像

    我正在开发应用程序 用户可以在其中上传一些 pdf 格式的图纸 上传的文件存储在S3上 上传后 文件必须转换为图像 为此 我创建了 lambda 函数 该函数将文件从 S3 下载到 lambda 执行环境中的 tmp 文件夹 然后从 ima