Amazon Linux 2にPDFtkをセットアップする

Amazon Linux 2上のLAMP環境でPDFtkを利用したい。Amazon Linux 2のケースは Google検索しても見つからなかったため、使えるようになるまでの手順を残しておきます。

## Amazon Linux 2とは？
Amazon EC2で使用できるLinuxディストリビューション。REHL7の機能がベースとなっている。RHEL7やCentOS7との違いとしては、AWS CLIやSSM Agentが最初から導入済みであるなど、AWSの各種サービスと連携するための仕組みが整っている。EC2単独でなく、色んなサービスと連携するシステムを作りたい時には便利。

参考：[Amazon Linux 2](https://aws.amazon.com/jp/amazon-linux-2/)

## PDFtkとは？
PDFを分割したりマージしたりできるツール。フリーで使える。公式は[こちら](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)。

> PDFtk Free is our friendly graphical tool for quickly merging and splitting PDF documents and pages. It is free to use for as long as you like.

## 問題
PDF操作に便利なpdftkだが、動作に必要なライブラリであるlibgcjがREHL7系のOSからサポート対象外となってしまった。Amazon Linux 2もRHEL7の流れを汲むためサポート対象外。公式ドキュメントにも含まれていない。

> 2) AWS では、以下の主要なパッケージに対して、ユーザー空間のアプリケーションバイナリインターフェイス (ABI) の互換性を維持します。
elfutils-libelf、glibc、glibc-utils、hesiod、krb5-libs、libgcc、libgomp、libstdc++、libtbb.so、libtbbmalloc.so、libtbbmalloc_proxy.so、libusb、libxml2、libxslt、pam、audit-libs、audit-libs-python、bzip2-libs、c-ares、clutter、cups-libs、cyrus-sasl-gssapi、cyrus-sasl-lib、cyrus-sasl-md5、dbus-glib、dbus-libs、elfutils-libs、expat、fuse-libs、glib2、gmp、gnutls、httpd、libICE、libSM、libX11、libXau、libXaw、libXext、libXft、libXi、libXinerama、libXpm、libXrandr、libXrender、libXt、libXtst、libacl、libaio、libatomic、libattr、libblkid、libcap-ng、libdb、libdb-cxx、libgudev1、libhugetlbfs、libnotify、libpfm、libsmbclient、libtalloc、libtdb、libtevent、libusb、libuuid、ncurses-libs、nss、nss-sysinit、numactl、openssl、p11-kit、papi、pcre、perl、perl-Digest-SHA、perl-Time-Piece、perl-libs、popt、python、python-libs、readline、realmd、ruby、scl-utils、sqlite、systemd-libs、systemtap、tcl、tcp_wrappers-libs、xz-libs、zlib

[参照元：Amazon Linux 2 に関するよくある質問 #長期サポート](https://aws.amazon.com/jp/amazon-linux-2/faqs/#Long_Term_Support)
上記の通りlibgcjがない。

PDFtkの代替として[cpdf（Coherent PDF）](http://community.coherentpdf.com/)というのもあるそうだが、こちらはライセンスがフリーではなくビジネス向けには利用不可で、今回は使えなかった。

## CentOS7でPDFtkをインストールする手順
[こちら](https://2000.blog.so-net.ne.jp/2016-06-22)のブログに手順が書かれている。ロバートさん(ロベルトさん？)という方がRHEL7用のpdftkとlibgcjを作ってくれたとのことで、その方のリポジトリからインストールすることができる。

```shell:PDFtkのインストール(CentOS7)
$ wget https://copr.fedorainfracloud.org/coprs/robert/gcj/repo/epel-7/robert-gcj-epel-7.repo;\
wget https://copr.fedorainfracloud.org/coprs/robert/pdftk/repo/epel-7/robert-pdftk-epel-7.repo;\
sed -i -e s/enabled=1/enabled=0/g robert-gcj-epel-7.repo robert-pdftk-epel-7.repo;\
sudo mv robert-*.repo /etc/yum.repos.d;\
sudo yum --enablerepo=robert-gcj,robert-pdftk install -y pdftk
```
(詳細は上記ブログを参照)

## Amazon Linux 2でもやってみた結果
とりあえず同じ手順をやってみる。

```shell:AmazonLinux2

--> 依存性の処理をしています: libgcj.so.14()(64bit) のパッケージ: pdftk-2.02-1.el7.x86_64
パッケージ libgcj-4.8.5-4.el7.x86_64 は既にインストール済みの libgcc-7.3.1-5.amzn2.0.2.x86_64 によって不要扱いになりました。
--> 依存性解決を終了しました。
エラー: パッケージ: pdftk-2.02-1.el7.x86_64 (robert-pdftk)
             要求: libgcj.so.14()(64bit)
            利用可能: libgcj-4.8.5-4.el7.x86_64 (robert-gcj)
                libgcj.so.14()(64bit)
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
```

libgccあるからlibgcjいらないと言われてしまった。でもPDFtkはlibgcjじゃないと動かない。

## Amazon Linuxでやる場合
Amazon Linux(2ではない！)でpdftkを使う手順が[こちら](https://www.magtranetwork.com/aws/amazon_linux_aws_lambda_pdftk.html)のブログに書かれていた。CentOS6の環境でpdftkのソースをダウンロードしコンパイル。libgcjライブラリとpdftkのバイナリをzipでまとめてAmazon Linuxに持っていき展開する。

そしたらCentOS7の環境はロバートさんのおかげで使えるのだから、同じような流れでCentOS7でコンパイル→Amazon Linux 2へ展開すればいけるかも？

## 最終的な方法
CentOS7でpdftkをコンパイルしようとしたがmakeが上手く通らず失敗。
ていうかそもそもCentOS7で動いているのだから、コンパイルせずともライブラリとバイナリを持っていけばいいのでは？

まずはCentOS7環境でこれらの所在を確認。

```shell:CentOS7

$ which pdftk
/usr/bin/pdftk
$ ll /usr/lib64/libgcj.so*
lrwxrwxrwx 1 root root        16 Feb 15 10:53 /usr/lib64/libgcj.so.14 -> libgcj.so.14.0.0
-rwxr-xr-x 1 root root 171922396 Jan  9  2016 /usr/lib64/libgcj.so.14.0.0
```

libgcj.so.14はシンボリックリングのためpdftkとlibgcj.so.14.0.0のみscpでAmazon Linux 2環境へ持っていく。

```shell:CentOS7
$ scp -i (秘密鍵) /usr/bin/pdftk ユーザ名@IPアドレス:~
$ scp -i (秘密鍵) /usr/lib64/libgcj.so.14.0.0 ユーザ名@IPアドレス:~
```

Amazon Linux 2にログインし、送った資材を適切なパスへ配置。CentOS7環境に合わせてシンボリックリンクも作っておく、

```shell:AmazonLinux2
$ sudo mv pdftk /usr/bin
$ sudo mv libgcj.so.14.0.0 /usr/lib64
$ sudo ln -s /usr/lib64/libgcj.so.14.0.0 /usr/lib64/libgcj.so.14
```

動作確認。

```shell:AmazonLinux2
$ pdftk --version

pdftk 2.02 a Handy Tool for Manipulating PDF Documents
Copyright (c) 2003-13 Steward and Lee, LLC - Please Visit: www.pdftk.com
This is free software; see the source code for copying conditions. There is
NO warranty, not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

無事に動きました。かなりイケてない方法だと思うので、他に良い方法がありましたら教えてください:bow: