【PDFツール】PDFを分割して固有のファイル名を付けて保存する(cpdf編)

個人宛の文書を業務システムやWordの差し込み文書機能を利用して作成し、メールに添付して送信したいときなどがあります。人数が少なければ一人ずつPDF化すればいいのですが、多くの人数を扱う時には現実的ではありません。

そこで複数の個人宛ての文書を一斉にPDF化し、何らかのルールに従ってページごとに分割できると便利です。色々と方法はあると思いますがこの記事では二つの方法を紹介したいと思います。いずれも「cpdf」というソフトウェアを利用して処理を行います。

cpdfとは

cpdfは、コマンドラインベースのツールであり、PDFファイルの操作や変換を行うための機能を提供するソフトウェアです。

cpdfを使用すると、PDFファイルの結合、分割、回転、しおりの追加、暗号化、圧縮、テキストやイメージの抽出など、さまざまな操作を行うことができます。

また、コマンドラインからcpdfを使用することで、自動化やスクリプト化が容易になります。cpdfは「Coherent PDF Command Line Tools」のサイトからダウンロードできます。

PDFにしおりを追加しAdobe Acrobatで分割

まずは複数ページのPDFのページ毎にcpdfでしおりを追加して、Adobe Acrobatでしおり毎に分割する方法です。PDFにしおりが付いてしまえば、ページの分割とファイルの保存はAcrobatの標準機能で処理できるので、お手元にAcrobatがあればわかりやすい方法だと思います。

複数ページのPDFの用意

個人宛ての通知文書をExcelのリストからWordの差し込み文書機能で複数ページにまとめられているPDFファイルがあるとします。以下は、採用面接の日程を通知するWord文書にExcelリストから必要な項目を差し込んで複数ページのPDFファイルに出力した例です。

 

しおりの情報を含むのテキストファイルを作成

このPDFにcpdfを利用して「しおり」を追加します。

まず、PDFファイルに追加するしおりの情報を含むテキストファイルを作成します。テキストファイルには、しおりの階層レベルと各しおりのタイトル、ページ番号などを指定します。以下は、テキストファイル(例:shiori.txt)の例です。

  1. 先頭の数字は、しおりの階層レベルです。トップは「0」です。しおりは階層構造を持つことができるので「1」を指定すると「0」の下に入ります。
  2. 次のダブルクォーテーション( ” )で囲まれた文字列は、しおりの表示名(ラベル)です。
  3. 最後の数字は、しおりがリンクするページの番号を指定します。最初のページは「1」となります。

PDFにしおりを追加

コマンドプロンプトを開き、しおり情報を含むテキストファイルと元のPDFファイルがあるフォルダに移動して以下のコマンドを実行します。このコマンドを実行すると、指定したしおり情報が含まれたPDFファイルが生成されます。

cpdf -add-bookmarks shiori.txt input.pdf -o output.pdf
  • shiori.txt:しおりの情報を含むテキストファイルの名前
  • input.pdf:しおりを追加する元のPDFファイルの名前
  • output.pdf:しおりが追加された出力PDFファイルの名前

 

PDFをしおりで分割

次にしおり情報が含まれたPDFファイルをAcrobatで開き、しおりで分割して保存する手順を以下に説明します。

  1. ツールパネルで、「ページを整理」を選択します。
  2. 「ページを整理」メニューの「分割」を選択します。
  3. 「次で分割:」で、「上位レベルのしおり」を選択します。
  4. 「出力オプション」を選択します。「出力オプション」画面が表示されます。
  5. 「出力オプション」画面で、分割したファイルを保存するフォルダを指定します。
  6. 「ファイル名」は「ファイル名にしおり名を使用」にチェックします。
  7. 「OK」を選択し、「出力オプション」画面を閉じます。
  8. 「分割」を選択すると、しおりで分割されたPDFファイルが指定のフォルダに保存されます。

 

スクリプトを使用してPDFを分割

もう一つはバッチファイルにスクリプトを記述し、cpdfでPDFファイルの分割からファイル名を付けて保存までの一連の処理を実行うとするものです。少々スクリプトの知識が必要になりますので、若干ハードルは高いかもしれません。

@echo off
setlocal enabledelayedexpansion

chcp 65001

set CSV_FILE=clientlist.csv
set PDF_FILE=input.pdf
set NO=1

for /f "tokens=1,2 delims=, skip=1" %%a in ('type "%CSV_FILE%"^|findstr /r "."') do (
  set KOJIN_CD=%%a
  set NAME=%%b
  set OUTPUT_FILE=面接日時のお知らせ(!KOJIN_CD!!NAME!).pdf
  cpdf %PDF_FILE% !NO! -o !OUTPUT_FILE!
  set /a NO+=1
)

echo Dividing and renaming files has been completed.

このバッチファイルに名前を付けて(例:splitcsv.bat)、元のPDFファイル(例:input.pdf)とCSVファイル(例:clientlist.csv)と同じフォルダに保存します。保存したバッチファイルをダブルクリックするとスクリプトが実行されます。

このスクリプトを実行すると、指定したCSVファイルからデータを読み取り、PDFファイルを分割して固有のファイル名を付けます。分割されたPDFファイルは、指定されたファイル名で保存されます。処理が完了すると、メッセージが表示されます。以下はスクリプトの各行の説明です。

@echo off

@echo off“は、バッチファイルの実行中にコマンドを表示しないようにするための設定です。

setlocal enabledelayedexpansion

setlocal enabledelayedexpansion“は、変数の値を取得する際に遅延評価を有効にする設定です。これにより、変数の値をループ内で更新して利用することができます。

chcp 65001

chcp 65001“は、コマンドプロンプトの文字コードをUTF-8に設定するためのコマンドです。これにより、日本語文字などのマルチバイト文字を正しく表示できます。

set CSV_FILE=clientlist.csv
set PDF_FILE=input.pdf
set NO=1

set CSV_FILE=clientlist.csv“と”set PDF_FILE=input.pdf“は、CSVファイルと元のPDFファイルのパスを指定しています。”set NO=1“は、分割するPDFファイルのページ番号を示すための変数を初期化しています。

for /f "tokens=1,2 delims=, skip=1" %%a in ('type "%CSV_FILE%"^|findstr /r "."') do (

"for /f"ループは、CSVファイルの各行に対して処理を行うためのループです。"tokens=1,2 delims=, skip=1"は、各行のデータをカンマ区切りで分割し、1番目のトークンを”%%a“に、2番目のトークンを”%%b“に割り当てる設定です。”skip=1“は、ヘッダー行をスキップするためのオプションです。

|“は、パイプと呼ばれる特殊な文字です。パイプの前のコマンドの出力を、パイプの後ろのコマンドの入力として渡す役割があります。

findstr“は、テキストデータの中から特定のパターンを検索するためのコマンドです。ここでは、”/r“オプションを使用して正規表現を指定しています。正規表現”.“は、任意の1文字とマッチすることを意味します。

つまり、”type "%CSV_FILE%"^|findstr /r "."“は、指定したCSVファイルの内容を表示し、その中から空でない行(1文字以上の任意の文字を含む行)を抽出する操作を行っています。

この操作により、CSVファイルの各行が検索され、空行が除外されたテキストデータが生成されます。そのテキストデータは後続の処理で使用されます。

set KOJIN_CD=%%a
set NAME=%%b

set KOJIN_CD=%%a“と”set NAME=%%b“は、各行から取得したデータをそれぞれの変数に代入しています。

set OUTPUT_FILE=面接日時のお知らせ(!KOJIN_CD!!NAME!).pdf

set OUTPUT_FILE=面接日時のお知らせ(!KOJIN_CD!!NAME!).pdf“は、出力するPDFファイルのファイル名を設定しています。

!KOJIN_CD!!NAME!“は、遅延評価を利用して変数の値を展開するための構文です。”!KOJIN_CD!KOJIN_CD“変数の値、”!NAME!NAME“変数の値を表します。したがって、各行の値を組み合わせて固有のファイル名を作成しています。

cpdf %PDF_FILE% !NO! -o !OUTPUT_FILE!

cpdf %PDF_FILE% !NO! -o !OUTPUT_FILE!“は、cpdfを使用して、指定したPDFファイルの特定のページを抽出し、抽出されたページに新しいファイル名を付けて保存しています。

%PDF_FILE%“は元のPDFファイルのパスを表し、”!NO!“は元のPDFファイルのページ番号を示す変数の値、”!OUTPUT_FILE!“は新しく保存するPDFファイルのファイル名を表します。

set /a NO+=1

set /a NO+=1“は、処理を行うページ番号を1増やしています。

echo Dividing and renaming files has been completed.

echo Dividing and renaming files has been completed.“は、処理が完了したことを表示するメッセージです。

おわりに

PDFを分割する方法は幾つもあるかと思いますが、ここではcpdfを利用した分割方法を二つ紹介しました。改めてpythonなどのプログラムで処理する方法も紹介できればと考えています。

なお、一つ目の方法では言うまでもなく、無料のAcrobat Readerでは処理できません。編集可能なAcrobat ProやStandardを用意する必要があります。

こうして分割されたPDFは、1ファイルずつメールに添付して個別のアドレス宛に送信するなどの利用が考えられます。以下の記事ではPower Automateで、個人専用のPDFファイルを添付してメールを配信するための仕組みを構築した事例を紹介しています。ご興味あればご覧ください。

関連記事

Power Automateは、効率的な業務プロセスの自動化を可能にする強力なツールです。 本記事では、Power Automateを使用してExcelの名簿を読み込み、個別のファイルを添付して一斉にメールを送信するシステムを構築す[…]