【作業効率化】PDFをPNG変換する方法

この記事は、ImageMagickを用いてPDFをPNGに変換するスクリプトを紹介しています。ImageMagickは、多様な画像処理タスクに利用可能ですが、セキュリティリスクも考慮しましょう。

2023年09月30日

前提条件

このコマンドを使用するための前提条件は以下の通りです:

  1. Bashシェルの存在
    Bashがインストールされていること。
    ※ 多くのLinuxディストリビューションおよびmacOSでは、Bashがデフォルトでインストールされています。

  2. ImageMagickのインストール
    スクリプトは、convertコマンドを使用してPDFファイルをPNGに変換します。このコマンドはImageMagickソフトウェアパッケージの一部です。したがって、ImageMagickをインストールして設定する必要があります。

    ImageMagickをインストールするには、ほとんどのLinuxディストリビューションで以下のコマンドを使用できます:

    sudo apt-get install imagemagick    # Ubuntu/Debian系
    sudo yum install ImageMagick        # CentOS/RedHat系
    

    macOSでは、Homebrewを使用してインストールできます

    brew install imagemagick
    
  3. 適切な権限
    指定されたディレクトリにアクセスし、ファイルを読み書き(および削除)する権限が必要です。

  4. 引数として有効なディレクトリの指定
    スクリプトを実行する際には、コマンドライン引数として読み取り可能なディレクトリパスを指定すること。

  5. PDFファイルが存在している
    指定されたディレクトリ内に、変換するPDFファイルが存在すること。

Script

指定されたディレクトリ内の全てのPDFファイルをPNGファイルに変換するツールです。
ちなみに変換が成功すると、元のPDFファイルは削除されるようになっています。

#!/bin/bash

# コマンドライン引数からディレクトリパスを取得
DIR="$1"

# 引数が指定されていない、または無効な場合はエラーメッセージを表示
if [ -z "$DIR" ]; then
  echo "Error: No directory specified."
  exit 1
fi

if [ ! -d "$DIR" ]; then
  echo "Error: Invalid directory specified."
  exit 1
fi

# 指定されたディレクトリに移動
cd "$DIR"

# PDFファイルの数をカウント
total_files=$(ls *.pdf 2> /dev/null | wc -l)
current_file=0

if [ $total_files -eq 0 ]; then
  echo "No PDF files found in the specified directory."
  exit 0
fi

# PDFファイルを一つずつ処理
for pdf in *.pdf; do
  # ファイル名から拡張子を除去
  filename=$(basename -- "$pdf")
  filename_noext="${filename%.*}"

  # PNGに変換
  convert -density 300 "$pdf" "$filename_noext.png"

  # 変換に成功したら元のPDFを削除
  if [ $? -eq 0 ]; then
    rm "$pdf"
    let current_file++
    echo "Converted $pdf to $filename_noext.png ($current_file/$total_files)"
  else
    echo "Error converting $pdf"
  fi
done

echo "Conversion completed."

コマンドライン引数

引数からディレクトリパスを取得します。

DIR="$1"

引数の検証

指定された引数が無効または指定されていない場合、エラーとなります。

if [ -z "$DIR" ]; then
  echo "Error: No directory specified."
  exit 1
fi

if [ ! -d "$DIR" ]; then
  echo "Error: Invalid directory specified."
  exit 1
fi

ファイルの変換

この処理により、ディレクトリ内の各PDFファイルをPNGに変換します。変換が成功した場合、元のPDFファイルは削除されます。

for pdf in *.pdf; do
  filename=$(basename -- "$pdf")
  filename_noext="${filename%.*}"
  convert -density 300 "$pdf" "$filename_noext.png"
  
  if [ $? -eq 0 ]; then
    rm "$pdf"
    let current_file++
    echo "Converted $pdf to $filename_noext.png ($current_file/$total_files)"
  else
    echo "Error converting $pdf"
  fi
done

convert コマンドは、ImageMagick パッケージの一部で、多くの画像形式間での変換を行うことができます。このスクリプトでは、-density オプションを使用して、変換された画像の解像度を300DPIに設定しています。

ImageMagick

システム開発ではよく目にするオープンソースの画像処理系ライブラリですが、使いこなせば非エンジニアでも活躍してくれる便利さんです。

JPEG to PNG

convert コマンドを利用し、一つのフォーマットから別のフォーマットに画像を変換することができます。
※ 上記で紹介したサンプルコードでは pdf to png です

$ convert input.jpg output.png

プロパティの表示

画像ファイルのプロパティ(サイズ、色、フォーマットなど)を表示します。

$ identify image.png

上書き

元の画像を直接変更することができます。convertコマンドは新しいファイルを作成しますが、mogrifyは元のファイルを上書きします。

mogrify -resize 800x600 image.png

合成

二つの画像を合成します。

composite overlay.png background.png output.png

※ この他にもいろいろあります。

共有

ImageMagickをがっつり活用すれば、有料サービスでやってくれるようなこともできちゃったりするので、画像処理系タスクの多い方は勉強してみてもいいかもしれません。
※ ただし、ちらほらと脆弱性も報告されているようです。

今回作成したツール: PDF to PNG

筆者情報
IT業界経験6年目のフルスタックエンジニア。
フロントエンドを軸として技術を研鑽中でございます。