By Du Wan (Yixian)
First, let's take a quick look at several key concepts mentioned in this article:
template.yml
file. For more information about Fun, see here.Note: The operations in this article are applicable to Fun version 3.0.0-beta.2 and all later versions.
This project is developed based on MacOS. However, the tools involved are platform independent and also applicable to the Linux and Windows operating systems. Before proceeding with the example, make sure that the following tools are correctly installed, updated to the latest version, and properly configured
Fun is based on Docker to simulate the local environment.
MacOS users may use homebrew to install these tools:
brew cask install docker
brew tap vangie/formula
brew install fun
Windows and Linux users must read this article to successfully install these tools.
After the installation, first run the fun config
command to initialize the configuration.
Note: Make sure to use a Fun version 3.0.0-beta.2 or any later version.
$ fun --version
3.0.0-beta.2
The default Linux environment of Function Compute is Debian Jessie. To convert PDF files to JPG files in the Debian Jessie environment, run the fun install sbox
command to start a sandbox environment and perform the following operations.
$ fun install sbox -r nodejs10 -i
root@fc-nodejs10:/code# apt-get update && apt-get install -y ghostscript
....
root@fc-nodejs10:/code# ls
test.pdf
root@fc-nodejs10:/code# gs -sDEVICE=jpeg -dTextAlphaBits=4 -r144 -o test.jpg test.pdf
GPL Ghostscript 9.26 (2018-11-20)
Copyright (C) 2018 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
root@fc-nodejs10:/code# ls
test.jpg test.pdf
The command for the conversion is gs -sDEVICE=jpeg -dTextAlphaBits=4 -r144 -o test.jpg test.pdf
. The options in the command are as follows:
-sDEVICE=jpeg:
Specifies the output device as jpeg
. The other optional value is jpeggray
-o:
Specifies the output file-dTextAlphaBits:
Specifies the text sampling antialiasing-dGraphicsAlphaBits:
Specifies the image sampling antialiasing-r144:
Sets the dpi of the picture to 14For more options, visit https://www.ghostscript.com/doc/9.21/Devices.htm
To port the conversion result of Ghostscript in the sandbox to the Node.js 10 runtime of Function Compute, initialize a local Fun project to install, debug, pack, and upload the dependency locally.
$ fun init event-nodejs10
Start rendering template...
+ /Users/vangie/Desktop/test
+ /Users/vangie/Desktop/test/.funignore
+ /Users/vangie/Desktop/test/index.js
+ /Users/vangie/Desktop/test/template.yml
finish rendering template.
Update the content of the template.yml
file as shown below.
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
ghostscript:
Type: 'Aliyun::Serverless::Service'
Properties:
Description: 'helloworld'
pdf2jpg:
Type: 'Aliyun::Serverless::Function'
Properties:
Handler: index.handler
Runtime: nodejs10
CodeUri: './'
EnvironmentVariables:
GS_LIB: ".fun/root/usr/share/ghostscript/9.26/Resource/Init:\
.fun/root/usr/share/ghostscript/9.26/lib:\
.fun/root/usr/share/ghostscript/9.26/Resource/Font:\
.fun/root/usr/share/ghostscript/fonts:\
.fun/root/var/lib/ghostscript/fonts:\
.fun/root/usr/share/ghostscript/fonts:\
.fun/root/usr/share/fonts"
The environment variable GS_LIB
is required to install Ghostscript in the code directory.
Update the content of the index.js
file as shown below.
const { exec } = require('child_process');
module.exports.handler = function (event, context, callback) {
const cmd = 'gs -sDEVICE=jpeg -dTextAlphaBits=4 -r144 -o /tmp/test.jpg test.pdf';
exec(cmd, (err, stdout, stderr) => {
if (err) {
console.log(stdout);
console.log(stderr);
callback(err, "convert fail.\n");
} else {
console.log(stdout)
callback(null, 'convert success.\nJPG file save to /tmp/test.jpg\n');
}
});
};
Run the following command to install Ghostscript.
$ fun install -p apt -r nodejs10 ghostscript --save
Ghostscript is installed in the .fun
directory of the current directory.
$ tree . -a -L 4
.
©À©¤©¤ .fun
©¦ ©¸©¤©¤ root
©¦ ©À©¤©¤ etc
©¦ ©¦ ©À©¤©¤ fonts
©¦ ©¦ ©À©¤©¤ ghostscript
©¦ ©¦ ©¸©¤©¤ libpaper.d
©¦ ©À©¤©¤ usr
©¦ ©¦ ©À©¤©¤ bin
©¦ ©¦ ©À©¤©¤ lib
©¦ ©¦ ©À©¤©¤ sbin
©¦ ©¦ ©¸©¤©¤ share
©¦ ©¸©¤©¤ var
©¦ ©¸©¤©¤ lib
©À©¤©¤ .funignore
©À©¤©¤ README.md
©À©¤©¤ fun.yml
©À©¤©¤ index.js
©¸©¤©¤ template.yml
16 directories, 7 files
Create a test.pdf
file in the code directory.
$ tree
.
©À©¤©¤ README.md
©À©¤©¤ fun.yml
©À©¤©¤ index.js
©À©¤©¤ template.yml
©¸©¤©¤ test.pdf
Run the fun local invoke
command to call the function locally.
$ fun local invoke pdf2jpg
using template: template.yml
FC Invoke Start RequestId: 3ea14d81-fd6b-4259-b9a5-dde29c2f022a
load code for handler:index.handler
2019-09-03T07:36:20.200Z 3ea14d81-fd6b-4259-b9a5-dde29c2f022a [verbose] stdout =================== START
2019-09-03T07:36:20.200Z 3ea14d81-fd6b-4259-b9a5-dde29c2f022a [verbose] GPL Ghostscript 9.26 (2018-11-20)
Copyright (C) 2018 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Warning: the map file cidfmap was not found.
Processing pages 1 through 1.
Page 1
2019-09-03T07:36:20.201Z 3ea14d81-fd6b-4259-b9a5-dde29c2f022a [verbose] stdout =================== END
FC Invoke End RequestId: 3ea14d81-fd6b-4259-b9a5-dde29c2f022a
convert success.
JPG file save to /tmp/test.jpg
2019-09-03T07:36:20.212Z 3ea14d81-fd6b-4259-b9a5-dde29c2f022a [error](node:23) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
RequestId: 3ea14d81-fd6b-4259-b9a5-dde29c2f022a Billed Duration: 1590 ms Memory Size: 1998 MB Max Memory Used: 32 MB
Find the generated test.jpg file in the .fun/tmp/invoke
directory.
$ tree .fun/tmp/invoke -L 3
.fun/tmp/invoke
©¸©¤©¤ ghostscript
©¸©¤©¤ pdf2jpg
©À©¤©¤ agenthubout.log
©¸©¤©¤ test.jpg
Now run the fun deploy
command to quickly deploy Ghostscript to Function Compute.
$ fun deploy
using template: template.yml
using region: cn-shanghai
using accountId: ***********4733
using accessKeyId: ***********EUz3
using timeout: 60
Waiting for service ghostscript to be deployed...
Waiting for function pdf2jpg to be deployed...
Waiting for packaging function pdf2jpg code...
package function pdf2jpg code done, the number of files you have packaged is£º1048
function pdf2jpg deploy success
service ghostscript deploy success
Lastly, run the fun invoke <function_name>
command to call the function.
$ fun invoke pdf2jpg
using template: template.yml
========= FC invoke Logs begin =========
FC Invoke Start RequestId: 99cc8b32-6084-4a6b-a1ff-444e06e10eca
load code for handler:index.handler
2019-09-03T07:49:47.454Z 99cc8b32-6084-4a6b-a1ff-444e06e10eca [verbose] stdout =================== START
2019-09-03T07:49:47.455Z 99cc8b32-6084-4a6b-a1ff-444e06e10eca [verbose] GPL Ghostscript 9.26 (2018-11-20)
Copyright (C) 2018 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Warning: the map file cidfmap was not found.
Processing pages 1 through 1.
Page 1
2019-09-03T07:49:47.455Z 99cc8b32-6084-4a6b-a1ff-444e06e10eca [verbose] stdout =================== END
FC Invoke End RequestId: 99cc8b32-6084-4a6b-a1ff-444e06e10eca
Duration: 526.16 ms, Billed Duration: 600 ms, Memory Size: 128 MB, Max Memory Used: 57.09 MB
========= FC invoke Logs end =========
FC Invoke Result:
convert success.
JPG file save to /tmp/test.jpg
How to Develop Function Compute - Installing Dependencies in Interactive Mode
99 posts | 7 followers
FollowAlibaba Cloud Serverless - April 7, 2020
Alibaba Clouder - November 21, 2019
Alibaba Clouder - November 23, 2020
Alibaba Clouder - November 27, 2018
Alibaba Clouder - November 28, 2019
Alibaba Cloud Native - April 26, 2024
99 posts | 7 followers
FollowAlibaba Cloud Function Compute is a fully-managed event-driven compute service. It allows you to focus on writing and uploading code without the need to manage infrastructure such as servers.
Learn MoreVisualization, O&M-free orchestration, and Coordination of Stateful Application Scenarios
Learn MoreServerless Application Engine (SAE) is the world's first application-oriented serverless PaaS, providing a cost-effective and highly efficient one-stop application hosting solution.
Learn MoreAlibaba Cloud (in partnership with Whale Cloud) helps telcos build an all-in-one telecommunication and digital lifestyle platform based on DingTalk.
Learn MoreMore Posts by Alibaba Cloud Serverless