システム開発で思うところ

Javaで主にシステム開発をしながら思うところをツラツラを綴る。主に自分向けのメモ。EE関連の情報が少なく自分自身がそういう情報があったら良いなぁということで他の人の参考になれば幸い

イメージファイルをPDFにまとめるシェルスクリプト

やりたいこと

複数のpngファイルを1つのpdfにまとめたい

環境

Lubuntu20.04(VirtualBox

下準備

ImageMagick をインストール

sudo apt install imagemagick-6.q16

ImageMagickの環境設定

/etc/ImageMagick-6/policy.xml 

の設定値を変更

resource

画像ファイルが中途半端に結合されていて「きっと、作業領域が狭いかったんだろう。」ということで、数値を適当に増やしていきました。

結構 増やしたつもりでも足りないケースがあり、最終的に「えーい、もういいや ビックリするくらい多くとってしまおう」という結果が以下。*1

coder

noneread|writeに変更

これもPDFだけで良いはずですが、とりあえず適当にザクザク設定変更

<policymap>
  <!-- <policy domain="system" name="shred" value="2"/> -->
  <!-- <policy domain="system" name="precision" value="6"/> -->
  <!-- <policy domain="system" name="memory-map" value="anonymous"/> -->
  <!-- <policy domain="system" name="max-memory-request" value="256MiB"/> -->
  <!-- <policy domain="resource" name="temporary-path" value="/tmp"/> -->
  <policy domain="resource" name="memory" value="3GiB"/>
  <policy domain="resource" name="map" value="3GiB"/>
  <policy domain="resource" name="width" value="16KP"/>
  <policy domain="resource" name="height" value="16KP"/>
  <!-- <policy domain="resource" name="list-length" value="128"/> -->
  <policy domain="resource" name="area" value="3GiB"/>
  <policy domain="resource" name="disk" value="3GiB"/>
  <!-- <policy domain="resource" name="file" value="768"/> -->
  <!-- <policy domain="resource" name="thread" value="4"/> -->
  <!-- <policy domain="resource" name="throttle" value="0"/> -->
  <!-- <policy domain="resource" name="time" value="3600"/> -->
  <!-- <policy domain="coder" rights="none" pattern="MVG" /> -->
  <!-- <policy domain="module" rights="none" pattern="{PS,PDF,XPS}" /> -->
  <!-- <policy domain="delegate" rights="none" pattern="HTTPS" /> -->
  <!-- <policy domain="path" rights="none" pattern="@*" /> -->
  <!-- <policy domain="cache" name="memory-map" value="anonymous"/> -->
  <!-- <policy domain="cache" name="synchronize" value="True"/> -->
  <!-- <policy domain="cache" name="shared-secret" value="passphrase" stealth="true"/> -->
  <!-- <policy domain="system" name="pixel-cache-memory" value="anonymous"/> -->
  <!-- <policy domain="system" name="shred" value="2"/> -->
  <!-- <policy domain="system" name="precision" value="6"/> -->
  <!-- not needed due to the need to use explicitly by mvg: -->
  <!-- <policy domain="delegate" rights="none" pattern="MVG" /> -->
  <!-- use curl -->
  <policy domain="delegate" rights="none" pattern="URL" />
  <policy domain="delegate" rights="none" pattern="HTTPS" />
  <policy domain="delegate" rights="none" pattern="HTTP" />
  <!-- in order to avoid to get image with password text -->
  <policy domain="path" rights="none" pattern="@*"/>
  <!-- disable ghostscript format types -->
  <policy domain="coder" rights="read|write" pattern="PS" />
  <policy domain="coder" rights="none" pattern="PS2" />
  <policy domain="coder" rights="none" pattern="PS3" />
  <policy domain="coder" rights="read|write" pattern="EPS" />
  <policy domain="coder" rights="read|write" pattern="PDF" />
  <policy domain="coder" rights="read|write" pattern="XPS" />
</policymap>

実行シェルスクリプト

#!/bin/sh
# パラメータ指定しない場合は、実行shと同列のフォルダ配下全てのpngファイルをpdfにまとめる
# pdfファイル名はフォルダ名
# temp.pdfを一気にファイル名指定ができたら良いんだけど、ちょっとわからない。
# 結果としては、親フォルダ配下にマージしたPDFを集めるということで良しとする

echo "Start ..............."

CURRENT_DIR=`dirname $0`

if [ $# = 1 ]; then
    CURRENT_DIR=$1
fi

items=$CURRENT_DIR/*

for item in $items; do
    if [ -d ${item} ]; then
        cd ${item}
        DIR_NAME=`basename ${item}`
        echo $DIR_NAME
        ls *.png | sort -n | tr '\n' ' ' | sed 's/$/\ temp.pdf/' | xargs convert
        mv -f temp.pdf ../${DIR_NAME}.pdf
    fi
done

echo "............. All Done"

参考

convertで画像をPDFへ変換する - Akionux-wiki

Ubuntu18.04 ImageMagick convertで、not authorized xxx.pdf エラー | Ninton

「さようなら ImageMagick」の考察 - Qiita

さいごに

ImageMagick脆弱性で色々と問題はあるみたいなので ご利用は自己責任で*2

*1:数値に根拠は無いので、各環境にあわせてチューニングしてください

*2:私は作業後に気が付いて、このブログをメモとして残して作業が終わったら削除しました