はじめに
Macで複数の画像ファイルからPDFファイルを作成する方法は、GUI・CUI合わせて複数存在する。
いくつか例を示すと以下が存在する。
- Finderで画像ファイルを選択し、副クリックからクイックアクション(「PDFを作成」)で作成(GUI)
- プレビュー.appで作成(GUI)
- ImageMagickをインストールして、
convert *.png hoge.pdf
(CUI)
GUIで行う場合、標準機能を用いるため操作が楽である反面、欲しいPDFファイルが複数ある場合などに都度操作をする必要がある。
また、CUIでImageMagickを用いる場合、欲しいPDFファイルが複数ある場合にループの処理で扱える反面、数値の指定など設定が必要であり解像度に不満が残るケースがある。
手元の環境では、1の方法と3の方法で作成したPDFファイルを比較すると、1の方法では素直に画像ファイルをPDFに変換しているように見える。
それに対し、3の方法では解像度などが落ち、ジャギーが発生するなど損失が起こる。
この問題に対し、Macの標準に備わっているPDFの作成機能をCUIで用いる解決策を本記事では述べる。
手順のフローを以下に示す。
- Automatorで「複数の画像ファイルからPDFを作成する」.appを作成する。
- 1で作成したappを端末上から実行する。
また、画像ファイルのディレクトリ構成は以下を想定している。
ImageDirの中に連番で画像ファイルが配置されている。
|--ImageDir0
|- 001.png
|- 002.png
|- 003.png
|--ImageDir1
|- 001.png
|- 002.png
|- 003.png
|-ImageDir2
|- 001.png
|- 002.png
|- 003.png
アプリケーションの内容
Automatorを起動し、「新規作成」から「アプリケーション」を選択し、以下の内容のアプリケーションを作成する。
「Finder項目を並び替える」では、PDFファイルのページの並び方を画像ファイルの連番の並びになるよう指定している。この項目がないと、画像ファイルが連番となっていても、ページの並びがあべこべになった。
「イメージから新規PDFを作成」では、デスクトップに「イメージから作成した新しいPDF出力.pdf」が保存される。出力の保存先に汎用性がない設定となっている。
アプリケーションの保存
「アプリケーションの内容」で作成したものを、適当な名前(本稿では「gen_pdf.app」とする)で適当なディレクトリ(本稿ではホームディレクトリ)に保存する。
アプリケーションの実行
ちなみに作成したappにImageDirをドラッグアンドドロップすると、デスクトップにPDFファイルが作成される。
以降では、作成したアプリーケションを端末上から実行する
ImageDirの階層から、以下を実行することで、上と同じ実行が行われる。
open -a ~/gen_pdf.app ImageDir
Pythonからの実行
複数のPDF作成を行うため、また、出力PDFのファイル名を指定しやすくするため、Pythonからsubprocessを用いる。
流れとして
- ImageDirからPDFを作成(Automator上で指定した保存先に保存)
- 同時にImageDirの番号を保存したいフォルダへの
mv
コマンドを作成
2でmvコマンドを作成する理由は、open
コマンドの実行終了の通知がPDFの作成実行のタイミングより早く、subprocessでmv
コマンドが実行できないためである。
そのため、print
でmv
コマンドを出力し、全てのPDFが作成完了した段階で、出力をコピーしmv
コマンドをペーストし実行することで解決する。
import os
import glob
import subprocess
# 最終的なPDFの保存先
out_dir = 'pdf'
if not os.path.exists(out_dir):
os.mkdir(out_dir)
n = {フォルダ数}
for i in range(n):
in_path = './ImageDir{}'.format(i)
subprocess.call(['open', '-a', '/${appのパス}/gen_pdf.app', in_path])
if i == 0:
print('mv ${appで指定したPDFの保存先}/story.pdf ./{}.pdf'.format(i, i))
else:
print('mv ${appで指定したPDFの保存先}/story-{}.pdf ./{}.pdf'.format(i))
mv ${appで指定したPDFの保存先}/story.pdf ./0.pdf
mv ${appで指定したPDFの保存先}/story-1.pdf ./1.pdf
mv ${appで指定したPDFの保存先}/story-2.pdf ./2.pdf
端末の出力をコピーし実行することで、最終的に保存したいフォルダへPDFファイルを保存する。
最後に
GUIで動かすものをCUIで動かすため、少しひねくれた方法となった。
しかし、素直に画像からPDFファイルを作成でき、繰り返しによる多量の作成を可能にした。