LoginSignup
0
0

More than 3 years have passed since last update.

Lambda Layer で PDFTK を利用する。

Last updated at Posted at 2021-04-15

API Gateway + Lambda を使ってS3上のPDFをマージする処理を実装した際に、
PDFTK を Lambda Layer に組み込んだ時のメモ。

PDFTK を動かす Lambda Layer の作成方法

  1. Dockerなどで Amazon Linux 2の環境を用意(もしかしたらcentosだったかも・・・)
  2. Amazon Linux 2 上で PDFTK をビルド(もしかしたらcentosだったかも・・・)
  3. ビルドした PDFTK のファイルを Lambda Layer の構成に組み込む

1. Dockerなどで Amazon Linux 2の環境を用意

ここは省略

2. Amazon Linux 2 上で PDFTK をビルド

PDFTKのサイトの「 Build from Source Code 」の手順でビルドする。
https://www.pdflabs.com/docs/install-pdftk-on-redhat-or-centos/

3. ビルドした PDFTK のファイルを Lambda Layer の構成に組み込む

この2ファイルを下記Lambda Layer の構成に組み込み、nodejsフォルダを圧縮して Lambda Layer にアップロードするだけ。
・/usr/local/bin/pdftk
・pdftk-2.02-dist/lib64/libgcj.so.10

スクリーンショット 2021-04-15 160915.png

次の index.js では、pdftk の cat (結合) と version (バージョン表示)のみ実装している。

index.js

const { PATH, LD_LIBRARY_PATH, PKG_CONFIG_PATH } = process.env

const BIN = '/opt/nodejs/node_modules/pdftk-lambda/bin'

process.env.PATH            = `${PATH}:${BIN}`
process.env.LD_LIBRARY_PATH = `${LD_LIBRARY_PATH}:${BIN}`
process.env.PKG_CONFIG_PATH = `${PKG_CONFIG_PATH}:${BIN}`

/**
 * バージョン
 */
module.exports.version = () => {
  return new Promise((resolve, reject) => {
    require('child_process').exec(
      'pdftk --version',
      (error, stdout, stderr) => {
        if (error) reject(error)
        else resolve(stdout)
      }
    )
  })
}

/**
 * 結合
 * Example:pdftk pdf1.pdf pdf2.pdf cat output combined.pdf
 */
module.exports.cat = ( inputFiles, outputFile ) => {
  console.log('pdftk ' + inputFiles.join(' ') + ' cat output ' + outputFile);
  return new Promise((resolve, reject) => {
    require('child_process').exec(
      'pdftk ' + inputFiles.join(' ') + ' cat output ' + outputFile,
      (error, stdout, stderr) => {
        if (error) reject(error)
        else resolve(stdout)
      }
    )
  })
}


Lambda Layer を使う場合はこんな感じ。

var pdftk  = require('pdftk-lambda');

/**
 * PDF結合
 */
async function pdfMerge( inPutFiles, outPutFile ){
    let ret = true;
    try{
        await pdftk.cat( inPutFiles, '"' + outPutFile + '"' );
    }catch(e){
        ret = !ret;
        console.log('-(pdtfk cat error log start )-');
        console.log(e);
        console.log('-(pdtfk cat error log end )-');
    }
    return ret;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0