2025/04/15 TechnoStyle

pdfCommandUtility2 仕様

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

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

pdfCommandUtility Version1はPDFライブラリーにPDF Clownを使用していましたが、一部のPDFでテキスト抽出を行うとエラーが発生しまうケースがありました。そのため、pdfCommandUtility Version2では、PDFライブラリーをPDF Lexerに変更して同様のコンソールアプリケーションを作成しました。

pdfCommandUtility2はpdfCommandUtilityと同様の機能がありますが、出力されるテキストの形式などは互換性がありません。また、コマンドスイッチの仕様も一部変更しています。

PDF正規化機能を実装 Version2.0.6以降

PDFファイルはフォーマットが公開されていて、企業や個人がPDFを作成するソフトウエアを開発しています。多くはフォーマットに準拠した仕様でPDFを作成していますが、中には厳密に準拠していないフォーマットも存在します。

そのようなPDFを処理した場合に、PDFの分割や束ねでエラーとなってしまうケースがあります。

そのため、処理前にPDFを正規化する機能を追加しました。

PDFの正規化にはQPDFというオープンソースのユーティリティを使用しています。

PDFを正規化するには「-nmlz」オプションを指定します。

注意事項・制限

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

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

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

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

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

使用方法

書式

pdfCommandUtility2.exe -pf PDFファイル名 [-nmlz] [-acp \"項目名\" \"値\" ...] [-rcp \"項目名\" ...] [-ocp \"カスタムプロパティファイル名\"] [-tef "テキスト抽出ファイル名" ...] [-tep "テキスト抽出ページ" ...] [-tem "テキスト抽出モード" ...] [-tea "テキスト抽出範囲" ...] [-teat "テキスト抽出範囲" ...] [-ouf "出力ユーザーデータファイル名"] [-ai "追加画像ファイル名" "ページNo" "X座標" "Y座標" ...] [-pntm "ページ分割テキスト"] [-pncb "ページ分割のコントロールブレイクに使用するキャプチャー番号" ...] [-pnp "ページ分割ページ" ...] [-pnap ["分割ページ数"]] [-pnf "ページ分割ベースファイル名"] [-bpf "束ねPDFファイル名"] [-bp "束ね位置"] [-rp "削除ページ" ...] [-kangxitocjk "康熙部首からCJK統合漢字への変換"] [-z "結果ファイル名"] [-ec]

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

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

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

-pf PDFファイル名 PDFファイル名を指定します。
-nmlz

PDFファイルを処理前に正規化します。

処理でエラーが発生する場合に -nmlz を指定すると、正常に処理できる事があります。

読み取り系の処理では入力ファイル(オリジナルファイル)は読み取りだけを行い、更新は行いません。

処理
対象ファイル
正規化
テキスト読み取り
オリジナルファイル
行わない。
オリジナルのコピー
処理前に行う。オプション(-nmlz)で可変。
ページ分割
オリジナルファイル
行わない。
出力ファイル
処理前に行う。オプション(-nmlz)で可変。
束ね
オリジナルファイル
行わない。
オリジナルのコピー
処理前に行う。オプション(-nmlz)で可変。
出力ファイル(束ね先)
処理前に行う。オプション(-nmlz)で可変。
ページ削除
カスタムプロパティ
オリジナルファイル
処理前に行う。オプション(-nmlz)で可変。
処理後に無条件で行う。サイズを最適化するため。
画像ファイル追加
オリジナルファイル
処理前に行う。オプション(-nmlz)で可変。
-acp "項目名" "値" ...

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

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

-rcp "項目名" ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

text

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

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

省略した時は text です。

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

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

-pntm を指定した時
1つのみ指定可能です。全てのページに対して1つのテキスト抽出モードが適用されます。

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

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

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

テキスト抽出範囲は4つの数値 x座標 y座標 幅 高さ (単位はmm)を指定します。4つの数値を1セットとして複数セット指定できます。(1つのページに対して複数の矩形を指定する事になります)

例)
-tea "109 30 58 24"

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

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

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

-pntm を指定した時
1つのみ指定可能です。全てのページに対して1つのテキスト抽出範囲が適用されます。

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

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

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

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

テキスト抽出範囲は3つの数値 x座標 y座標 +/-値 (単位はmm)を指定します。3つの数値を1セットとして複数セット指定できます。(1つのページに対して複数の矩形を指定する事になります)

例)
-teat "109 30 2"

指定した座標を中心として、上下左右に+/-値を広げた矩形の範囲となります。省略した時はページ全体です。

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

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

-pntm を指定した時
1つのみ指定可能です。全てのページに対して1つのテキスト抽出範囲が適用されます。

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

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

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

PDFファイルのページ毎のテキスト抽出結果などを纏めて出力します。

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

-ai "追加画像ファイル名" "ページNo" "X座標" "Y座標" ...

追加する画像ファイルの情報を指定します。

画像ファイルの情報は、画像ファイル名、ページ、X座標、Y座標、の4つです。

指定できる画像ファイルのフォーマットは png です。

例)
-ai "image.png" "1" "10" "20"
-pntm "ページ分割テキスト"

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

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

-pncb "ページ分割のコントロールブレイクに使用するキャプチャー番号" ...

-pntm で指定された正規表現のキャプチャーの括弧に対応する番号を指定します。

-pntm で指定された正規表現にマッチする、かつ、指定したキャプチャー番号の値が変わったタイミングでページ分割します。(いわゆるコントロールブレイクのような振る舞い)

ページ分割のコントロールブレイクに使用するキャプチャー番号は複数指定できます。

-pntm で指定された正規表現にキャプチャーの括弧が使用されている時に適用されます。

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

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

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

例)
-pnp 1 3 7
-pnp "1" "3" "7"

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

-pntm を指定した時は無視されます。

-pnap ["分割ページ数"]

全てのページをページ分割します。

分割するページ数を指定できます。

分割ページ数を省略すると、分割ページ数は 1 となります。(全てのページを1ページずつページ分割)

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

-pntm または -pnp を指定した時は無視されます。

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

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

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

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

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

-bpf "束ねPDFファイル名"

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

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

-bp "束ね位置"

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

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

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

省略した時は tail です。

-rp "削除ページ" ...

削除するページを指定します。

削除ページは複数指定できます。

削除ページは 1-5 や 2- のような範囲を指定する事もできます。

ページ範囲は以下のように指定します。

1-5 1~5ページ
2- 2ページ目以降全てのページ

"で囲う場合はページ毎に""で囲ってください。

例)
-rp 1 3 5
-rp "1" "3" "5"
-kangxitocjk "康熙部首からCJK統合漢字への変換"

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

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

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

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

省略した時は on です。

-z "結果ファイル名"

処理結果を出力します。

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

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

使用例

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

PDFファイルからテキスト情報をテキスト単位で出力します。(PDF内部で保持している文字列データの単位)

pdfCommandUtility2.exe -pf target.pdf -tef textExtraction.txt -tem text

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

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

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

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

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

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

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

pdfCommandUtility2.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の情報をeDocArrangement2のユーザーデータファイル形式で出力する例。

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

pdfCommandUtility2.exe -pf target.pdf -ouf userData.txt -tef dummy

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

pdfCommandUtility2.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 となります。

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

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

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

pdfCommandUtility2.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 となります。

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

PDFファイルの束ねの例。

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

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

リターンコード

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

0 正常終了
1 対象外のスイッチが指定されています。 'スイッチ'
2 結果ファイルが指定されていません。
3 PDFファイルが指定されていません。
4 指定されたPDFファイルは存在しません。 'PDFファイル名'
5 テキスト抽出ファイルが指定されていません。
6 テキスト抽出ページは1以上の整数を指定してください。 'テキスト抽出ページ'
7 指定されたテキスト抽出モードは使用できません。 'テキスト抽出モード'
8 テキスト抽出範囲は4つの数値(単位はmm)で指定してください。(4つの数値を1セットとして複数セット指定可能) 'テキスト抽出範囲'
9 テキスト抽出範囲は3つの数値(単位はmm)で指定してください。(3つの数値を1セットとして複数セット指定可能) 'テキスト抽出範囲'
10 ページ分割ページは1以上の整数を指定してください。 'ページ分割ページ'
11 読み込みリトライ回数を超えました。指定されたPDFファイルは読み込めませんでした。 'PDFファイル名'
12 PDFファイルの保存に失敗しました。 'PDFファイル名'
13 ページ分割テキストの正規表現でエラーが発生しました。 'ページ分割テキスト'
14 指定された束ね位置は使用できません。 '束ね位置'
15 指定された追加画像ファイルは存在しません。 '追加画像ファイル名'
16 画像ファイル追加ページは1以上の整数を指定してください。 '画像ファイル追加ページ'
17 画像ファイル追加位置は整数を指定してください。 '画像ファイル追加位置'
18 削除ページは1以上の数値を指定してください。 '削除ページ'
19 ページ分割のコントロールブレイクに使用するキャプチャー番号は1以上の数値を指定してください。 'キャプチャー番号'
20 全ページ分割の分割ページ数は1以上の数値を指定してください。 '分割ページ数'
21 qpdfモジュールファイルが存在しません。 'qpdfモジュールファイル名'
22 qpdfモジュールによる正規化に失敗しました。 'PDFファイル名'
23 qpdfモジュールによる文書プロパティの取得に失敗しました。 'PDFファイル名'
24 qpdfモジュールによる文書プロパティの設定に失敗しました。 'PDFファイル名'
99 例外が発生しました。 'エラーメッセージ'

ライセンスについて

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

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

.NET 8 以降

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

qpdf 12.1.0 を使用しています。

pdflexer 0.0.24.0 を使用しています。

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

更新履歴

2025/04/15 Version 2.0.7

  • ターゲットフレームワークを .NET 6 から .NET 8 に更新。
  • カスタムプロパティを追加する -acp スイッチを追加。
  • カスタムプロパティを削除する -rcp スイッチを追加。
  • カスタムプロパティを出力する -ocp スイッチを追加。
  • ページを削除する -rp スイッチにて、1-5 や 2- などのページ範囲を指定できるように変更。

2024/12/06 Version 2.0.6

  • PDFファイルを正規化する -nmlz スイッチを追加。
  • 全ページを分割する -pnap スイッチを追加。

2024/06/23 Version 2.0.5

  • -pntm で指定された正規表現のキャプチャーの値が変わったタイミングでページ分割する -pncb スイッチを追加。(いわゆるコントロールブレイクのような振る舞い)

2024/06/20 Version 2.0.4

  • ページを削除する -rp スイッチを追加。

2024/05/16 Version 2.0.3

  • -ouf "出力ユーザーデータファイル名" を指定しつつ -tep "テキスト抽出ページ" を指定しない状態では -tem でテキスト抽出モードを指定しても無視される仕様だったが、全てのページで適用されるように変更。

2024/01/25 Version 2.0.2

  • -ouf "出力ユーザーデータファイル名" を指定しつつ -tem textPosition を指定した時に、抽出テキストにタブがそのまま格納されていた為、抽出テキストがユーザーデータに正しく読み込まれない不具合を修正。

2023/12/19 Version 2.0.1

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

2023/10/25 Version 2.0.0

  • 新規リリース。