LoginSignup
1
0

More than 3 years have passed since last update.

MacのAutomatorを使ってターミナル上で複数の画像ファイルからPDFを作成する

Last updated at Posted at 2020-12-31

はじめに

Macで複数の画像ファイルからPDFファイルを作成する方法は、GUI・CUI合わせて複数存在する。
いくつか例を示すと以下が存在する。

  1. Finderで画像ファイルを選択し、副クリックからクイックアクション(「PDFを作成」)で作成(GUI)
  2. プレビュー.appで作成(GUI)
  3. ImageMagickをインストールして、convert *.png hoge.pdf(CUI)

GUIで行う場合、標準機能を用いるため操作が楽である反面、欲しいPDFファイルが複数ある場合などに都度操作をする必要がある。
また、CUIでImageMagickを用いる場合、欲しいPDFファイルが複数ある場合にループの処理で扱える反面、数値の指定など設定が必要であり解像度に不満が残るケースがある。
手元の環境では、1の方法と3の方法で作成したPDFファイルを比較すると、1の方法では素直に画像ファイルをPDFに変換しているように見える。
それに対し、3の方法では解像度などが落ち、ジャギーが発生するなど損失が起こる。

この問題に対し、Macの標準に備わっているPDFの作成機能をCUIで用いる解決策を本記事では述べる。

手順のフローを以下に示す。

  1. Automatorで「複数の画像ファイルからPDFを作成する」.appを作成する。
  2. 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を起動し、「新規作成」から「アプリケーション」を選択し、以下の内容のアプリケーションを作成する。
スクリーンショット 2020-12-30 17.29.39.png

「Finder項目を並び替える」では、PDFファイルのページの並び方を画像ファイルの連番の並びになるよう指定している。この項目がないと、画像ファイルが連番となっていても、ページの並びがあべこべになった。

「イメージから新規PDFを作成」では、デスクトップに「イメージから作成した新しいPDF出力.pdf」が保存される。出力の保存先に汎用性がない設定となっている。

アプリケーションの保存

「アプリケーションの内容」で作成したものを、適当な名前(本稿では「gen_pdf.app」とする)で適当なディレクトリ(本稿ではホームディレクトリ)に保存する。

アプリケーションの実行

ちなみに作成したappにImageDirをドラッグアンドドロップすると、デスクトップにPDFファイルが作成される。
スクリーンショット 2020-12-30 17.48.48.png

以降では、作成したアプリーケションを端末上から実行する
ImageDirの階層から、以下を実行することで、上と同じ実行が行われる。

端末
open -a ~/gen_pdf.app ImageDir

Pythonからの実行

複数のPDF作成を行うため、また、出力PDFのファイル名を指定しやすくするため、Pythonからsubprocessを用いる。

流れとして

  1. ImageDirからPDFを作成(Automator上で指定した保存先に保存)
  2. 同時にImageDirの番号を保存したいフォルダへのmvコマンドを作成

2でmvコマンドを作成する理由は、openコマンドの実行終了の通知がPDFの作成実行のタイミングより早く、subprocessでmvコマンドが実行できないためである。
そのため、printmvコマンドを出力し、全てのPDFが作成完了した段階で、出力をコピーしmvコマンドをペーストし実行することで解決する。

python
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ファイルを作成でき、繰り返しによる多量の作成を可能にした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0