Lambda Layer で PDFTK を利用する。


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

次の 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;
}