2023/12/19 TechnoStyle

pdfCommandUtility 仕様

pdfCommandUtilityはコンソールアプリケーションです。コンソールアプリケーションは、eDocArrangementのコマンド実行から呼び出すことが可能です。

PDFの属性取得/設定やテキスト抽出、ページ分割を行うことができるコンソールアプリケーションです。

注意事項・制限

PDFは印刷を目的としたファイル形式で、PDFからテキストを抽出することを想定したデータ形式にはなっていません。

ですが、文字のフォントやPDFを出力するアプリケーションの仕様によっては、テキスト情報を抽出することができます。

どのようなPDFでも、テキストを抽出できるわけではございません。

例えば、フォントがメイリオの場合は、「長」などの文字が文字化けしてしまいますが、MS ゴシックの場合は、文字化けせず読み込むことができます。

これは、PDFの内部データに文字コードをもっておらず、フォントの情報と変換テーブルを使って文字コードを決定しており、その変換テーブルの情報がアプリやフォントによって間違ったものを出力する場合があるようです。また、変換テーブルそのものが出力されていないPDFはテキストが取得できません。

テキストを選択してコピーしたり、プログラムを使ってテキスト抽出を行ったときに、文字化けする理由の詳細を知りたい方は「ToUnicode CMap」で検索してみてください。

pdfCommandUtility Version 1.1.1で文字化け対策を行い、読み取った文字が変換可能な場合は正しい文字に変換する機能を追加しました。

また、Microsoft Print to PDFでは、Excelで作成した文書の白文字のデータがPDFに出力されますが、Adobe PDFプリンターでは、白文字のデータがPDFに出力されず、抽出することができません。

これは、PDFを作成するアプリケーションが、白文字は紙に印刷しても何も表示されないのなら出力しても意味がないので、データをPDFに出力しないなどの最適化を行っていると考えられます。

他にも、文字がアウトライン化されているPDFなど、見た目では文字と認識できる場合でも、テキストを取得することができない場合がございます。

使用方法

書式

pdfCommandUtility.exe -pf PDFファイル名 [-acp "項目名" "値" ...] [-rcp "項目名" ...] [-ocp "カスタムプロパティファイル名"] [-tef "テキスト抽出ファイル名" ...] [-tep "テキスト抽出ページ" ...] [-tem "テキスト抽出モード" ...] [-tea "テキスト抽出範囲" ...] [-ouf "出力ユーザーデータファイル名"] [-pntm "ページ分割テキスト"] [-pnf "ページ分割ベースファイル名"] [-pnp "ページ分割ページ" ...] [-bpf "束ねPDFファイル名"] [-bp "束ね位置"] [-kangxitocjk "康熙部首からCJK統合漢字への変換"] [-z "結果ファイル名"] [-ec]

「name 1.txt」のように値にスペースが含まれる場合は、"name 1.txt" のようにダブルクォートで括ってください。

可変引数のスイッチの引数に、スイッチと同じ文字の値を使用したい場合は、"'-f'" のようにシングルクォートとダブルクォートで括ってください。

引数の仕様は以下の通りです。[]は省略可能な引数です。(|)は何れか一つを指定する引数です。

-pf PDFファイル名 PDFファイル名を指定します。
-acp "項目名" "値" ...

カスタムプロパティを追加します。

カスタムプロパティの項目名と値のペアを複数指定できます。

-rcp "項目名" ...

カスタムプロパティを削除します。

カスタムプロパティの項目名を複数指定できます。

カスタムプロパティの項目名が存在しない時は無視されます。

-ocp "カスタムプロパティファイル名"

全てのカスタムプロパティの内容をファイルに出力します。

出力するカスタムプロパティファイル名を指定します。

カスタムプロパティの項目名と値をタブで連結して行単位で出力します。

-ouf を指定した時
ユーザーデータファイルにカスタムプロパティを出力するスイッチとなります。
カスタムプロパティファイル名を指定する必要がありますが、適当な文字列で構いません。

-tef "テキスト抽出ファイル名" ...

テキスト抽出ファイル名を指定します。

テキスト抽出ファイル名は複数指定できます。

複数のテキスト抽出ファイル名を指定する事で、複数のテキスト抽出を同時に行えます。

テキスト抽出ファイル名に対応するオプションは、-tef の引数(テキスト抽出ファイル名)の位置に対応する -tep, -tem, -tea に指定してください。

-ouf を指定した時
ユーザーデータファイルにテキスト抽出結果を出力するスイッチとなります。
テキスト抽出ファイル名を指定する必要がありますが、適当な文字列で構いません。

-tep "テキスト抽出ページ" ...

テキスト抽出対象ページを指定します。

テキスト抽出対象ページは複数指定できます。

省略した時は 1 2 3 ... のように、1からの連番が指定された状態となります。

※ -tep の引数の値は -tef の引数の位置と連動します。-tef の引数と対応しない位置の値は無視されます。

-ouf を指定した時
-tep を省略した時は、全ページを対象とします。

-tem "テキスト抽出モード" ...

テキスト抽出モードを指定します。

テキスト抽出モードは複数指定できます。

テキスト抽出モードは以下の何れかです。

line

PDFの見た目の行単位で出力します。

PDFによっては見た目の行単位で取得できないものもあります。テキストに座標情報を持っていないPDFは取得できません。

text

PDF内部で保持している文字列データを、そのままの順でタブで連結した文字列を出力します。

textPosition PDF内部で保持している文字列データの座標とテキストを、そのままの順で行単位で出力します。

省略した時は line です。

※ -tem の引数の値は -tef の引数の位置と連動します。-tef の引数と対応しない位置の値は無視されます。

-ouf を指定した時
-tem の引数の値は -tep の引数の位置と連動します。-tep の引数と対応しない位置の値は無視されます。

-tea "テキスト抽出範囲" ...

テキスト抽出範囲を指定します。

テキスト抽出範囲は複数指定できます。

テキスト抽出範囲はx座標、y座標、幅、高さの順で、4つの数値(単位はmm)を指定します。(4つの数値を1セットとして複数セット指定可能)

例)
-tea "109 30 58 24"

省略した時はページ全体です。

※ -tea の引数の値は -tef の引数の位置と連動します。-tef の引数と対応しない位置の値は無視されます。

-ouf を指定した時
-tea の引数の値は -tep の引数の位置と連動します。-tep の引数と対応しない位置の値は無視されます。

PDFによっては範囲指定で取得できないものもあります。テキストに座標情報を持っていないPDFは取得できません。

-ouf "出力ユーザーデータファイル名"

出力ユーザーデータファイル名を指定します。

PDFファイルのカスタムプロパティ、ページ毎のテキスト抽出結果などを纏めて出力します。

-ouf を指定した時は、-tef や -ocp は無視されます。-tem や -tea が指定されていた時は、最初の引数の値が全てのページのテキスト抽出に適用されます。

-pntm "ページ分割テキスト"

指定された正規表現にマッチするページでページ分割します。

-pntm を指定した時は -pnf を指定してください。

-pnf "ページ分割ベースファイル名"

ページ分割したPDFファイルを保存するベースファイル名を指定します。

ページ分割PDFファイル名は、拡張子の直前に「_分割ページNo」が付与されたファイル名となります。

-pntm で指定した正規表現で () を使用している時は、() に対応したキャプチャー文字列を展開する $数字 を使用できます。

-pntm で指定した正規表現にマッチしたキャプチャー文字列を展開した結果などで、ファイル名が空文字列になった時は、-pf で指定したPDFファイル名が設定されます。

-pnp "ページ分割ページ" ...

ページ分割を行うページを指定します。

ページ分割ページは複数指定できます。"で囲う場合はページ毎に""で囲ってください。

例)
-pnp 1 3 7
-pnp "1" "3" "7"
-bpf "束ねPDFファイル名"

-pf で指定したPDFファイルを束ねるPDFファイル名を指定します。

束ねPDFファイルが存在しない時は、PDFファイルがコピーされます。

-bp "束ね位置"

束ね位置を指定します。-bpf が指定された時に有効となります。

束ね位置は以下の何れかです。

head 先頭に束ねます。
tail 末尾に束ねます。

省略した時は tail です。

-kangxitocjk "康熙部首からCJK統合漢字への変換"

康熙部首からCJK統合漢字への変換を指定します。

一部のPDFプリンターなどで出力したPDFファイルをテキスト抽出すると発生する文字化けに対して、可能な範囲で対応します。(康熙部首からCJK統合漢字への変換を行っても、文字化けが発生する事があります)

康熙部首からCJK統合漢字への変換は以下の何れかです。

on 康熙部首からCJK統合漢字への変換を行います。
off 康熙部首からCJK統合漢字への変換は行いません。

省略した時は on です。

-z "結果ファイル名"

処理結果を出力します。

結果ファイルが存在していた時は上書きします。

-ec 終了コードと結果ファイルに出力されるエラーメッセージの一覧を出力します。

使用例

PDFからテキストを抽出してテキストファイルに出力する例。

PDFファイルからテキスト情報を見た目の行単位で出力します。

pdfCommandUtility.exe -pf target.pdf -tef textExtraction.txt -tem line

PDFファイルからテキストと座標情報を出力します。

pdfCommandUtility.exe -pf target.pdf -tef textExtraction.txt -tem textposition

PDFファイルからテキストを範囲指定で出力します。

pdfCommandUtility.exe -pf target.pdf -tef textExtraction.txt -tem text -tea "109 30 58 24"

PDFファイルの2ページ目に対して複数の範囲を指定してテキストを出力します。

pdfCommandUtility.exe -pf target.pdf -tef textExtraction.txt -tep 2 -tem text -tea "109 30 58 24 9 15 70 35"

PDFファイルの1ページ目と2ページ目に対してそれぞれ範囲を指定してテキストを出力します。

pdfCommandUtility.exe -pf target.pdf -tef textExtraction1.txt textExtraction2.txt -tep 1 2 -tem text text -tea "109 30 58 24" "9 15 70 35"

PDFのカスタムプロパティの設定/取得/削除の例。

カスタムプロパティ「処理年月日」に「2022/09/26」を、「担当者」に「伊藤」をセットします。

pdfCommandUtility.exe -pf target.pdf -acp "処理年月日" "2022/09/26" "担当者" "伊藤"

カスタムプロパティ「処理年月日」を削除します。

pdfCommandUtility.exe -pf target.pdf -rcp "処理年月日"

カスタムプロパティの内容を「target_property.txt」に出力します。

pdfCommandUtility.exe -pf target.pdf -ocp target_property.txt

PDFの情報をeDocArrangement2のユーザーデータファイル形式で出力する例。

カスタムプロパティの情報と全ページのテキスト情報をeDocArrangement2のユーザーデータファイル形式で出力します。

pdfCommandUtility.exe -pf target.pdf -ouf userData.txt -ocp dummy -tef dummy

1ページ目と2ページ目のテキスト情報をeDocArrangement2のユーザーデータファイル形式で出力します。

pdfCommandUtility.exe -pf target.pdf -ouf userData.txt -tef dummy -tep 1 2

PDFのページ分割の例。

1ページ目、3ページ目、8ページ目を先頭ページとしたPDFファイルに分割します。分割PDFファイル名は順に new_1.pdf new_3.pdf new_8.pdf となります。

pdfCommandUtility.exe -pf target.pdf -pnf new.pdf -pnp 1 3 8

テキストマッチングによるPDFのページ分割の例。

正規表現「会社名\s*\[(.*?)\]」にマッチするページを先頭ページとしたPDFファイルに分割します。分割PDFファイル名は正規表現でキャプチャーした会社名とします。分割PDFファイル名が重複する時は、ファイル名の末尾に正規表現にマッチしたページ番号が付与された分割PDFファイル名となります。

pdfCommandUtility.exe -pf target.pdf -pntm "会社名\s*\[(.*?)\]" -pnf $1.pdf

正規表現「Page:1/\d+」にマッチするページを先頭ページとしたPDFファイルに分割します。正規表現にマッチするページが 1, 3, 8 ページの場合は、分割PDFファイル名は順に new_1.pdf new_3.pdf new_8.pdf となります。

pdfCommandUtility.exe -pf target.pdf -pntm "Page:1/\d+" -pnf new.pdf

PDFファイルの束ねの例。

target.pdf を bundle.pdf の末尾に束ねます。

pdfCommandUtility.exe -pf target.pdf -bpf bundle.pdf -bp tail

リターンコード

リターンコードは以下の通りです。

0 正常終了
1 対象外のスイッチが指定されています。 'スイッチ'
2 結果ファイルが指定されていません。
3 PDFファイルが指定されていません。
4 指定されたPDFファイルは存在しません。 'PDFファイル名'
5 テキスト抽出ページは1以上の整数を指定してください。 'テキスト抽出ページ'
6 指定されたテキスト抽出モードは使用できません。 'テキスト抽出モード'
7 テキスト抽出範囲は4つの数値(単位はmm)で指定してください。(4つの数値を1セットとして複数セット指定可能) 'テキスト抽出範囲'
8 ページ分割ページは1以上の整数を指定してください。 'ページ分割ページ'
9 読み込みリトライ回数を超えました。指定されたPDFファイルは読み込めませんでした。 'PDFファイル名'
10 PDFファイルの保存に失敗しました。 'PDFファイル名'
11 ページ分割テキストの正規表現でエラーが発生しました。 'ページ分割テキスト'
12 指定された束ね位置は使用できません。 '束ね位置'
99 例外が発生しました。 'エラーメッセージ'

ライセンスについて

pdfCommandUtilityは、eDocArrangementの購入者にライセンスされます。試用については、eDocArrangementと同じ期間、試用できます。

動作に必要なライブラリー

.NET Framework 4.6.2 以降

使用しているオープンソースライブラリー

PDF Clown 0.1.2.1 を使用しています。

Fix ToUnicode CMap in PDF を使用しています。

更新履歴

2023/12/19 Version 1.1.2

  • 可変引数のスイッチの引数に対象外のスイッチが含まれていた時はエラーにしないように修正。

2023/02/10 Version 1.1.1

  • PDFファイルの束ねを追加。束ね位置は先頭、末尾を指定可能。
  • テキストマッチングによるページ分割を追加。指定した正規表現にマッチしたページが先頭ページとなるページ分割を行う。正規表現でキャプチャーした文字列をページ分割したPDFファイル名に使用する事も可能。
  • 一部のPDFプリンターなどで出力したPDFファイルをテキスト抽出すると発生する文字化けに対して、可能な範囲で対応するように修正。

2022/11/01 Version 1.1.0

  • PDFファイルのページ分割を追加。分割した時に先頭ページとなるページを複数指定可能。分割ファイル名は、分割ベースファイル名の拡張子の直前に「_分割ページNo」を追加したファイル名となる。
  • カスタムプロパティとテキスト抽出データをeDocArrangement2のユーザーデータファイルに出力する機能を追加。
  • 一部のPDFファイルでテキスト抽出を行うとエラーが発生する問題を修正。
  • 対象外のスイッチを指定した時にエラーとなるように修正。

2022/09/28 Version 1.0.0

  • 新規リリース。