# PDF メモレイヤー追加ツール iText7を使用してPDFファイルに2つのメモ用レイヤー(OCG: Optional Content Group)を追加するJavaアプリケーションです。 ## 機能 - 既存PDFに「メモ1」「メモ2」レイヤーを追加 - レイヤーの初期表示状態(ON/OFF)の設定 - レイヤーにテキストや図形を描画 - Adobe Acrobat等でレイヤーの表示・非表示切り替えが可能 ## 必要な環境 - Java 17以上 - Gradle 7.0以上(オプション) - PowerShell 7.0以上(一括変換スクリプト使用時) ## ビルド方法 ### Gradle Wrapper使用時(推奨) ```bash # プロジェクトのクローンまたはダウンロード後 ./gradlew build # 実行可能JARファイルの作成 ./gradlew fatJar ``` ### 手動ビルド(Gradle未使用) ```bash # 1. 必要なライブラリをダウンロード(lib/README.mdを参照) mkdir lib # iText7ライブラリなどを lib/ ディレクトリに配置 # 2. コンパイル mkdir build/classes javac -cp "lib/*" -d build/classes src/main/java/co/jp/techsor/pdf/*.java src/main/java/co/jp/techsor/pdf/util/*.java ``` ## 使用方法 ### 基本的な使用方法 ```bash # JARファイルを使用(推奨) java -jar build/libs/pdf-memo-layers.jar --in samples/input.pdf --out samples/output.pdf # 直接クラスパスから実行(開発時) java -cp "build/classes;lib/*" co.jp.techsor.pdf.App --in samples/input.pdf --out samples/output.pdf # カスタムレイヤー名で追加 java -jar build/libs/pdf-memo-layers.jar \ --in samples/input.pdf \ --out samples/output.pdf \ --layer1 "注釈レイヤー" \ --layer2 "校正レイヤー" ``` ### 描画オプション付きの使用方法 ```bash # テキストと図形を描画 java -jar build/libs/pdf-memo-layers.jar \ --in samples/input.pdf \ --out samples/output.pdf \ --layer1 "メモ1" \ --layer2 "メモ2" \ --draw "text:1,100,700,これはメモ1のテキストです" \ --draw "rect:2,50,50,200,60" \ --l2on false ``` ### コマンドラインオプション | オプション | 説明 | 必須 | デフォルト値 | |-----------|------|------|------------| | `--in`, `--input` | 入力PDFファイルのパス | ✓ | - | | `--out`, `--output` | 出力PDFファイルのパス | ✓ | - | | `--layer1` | レイヤー1の名前 | | メモ1 | | `--layer2` | レイヤー2の名前 | | メモ2 | | `--l1on` | レイヤー1の初期表示状態 (true/false) | | true | | `--l2on` | レイヤー2の初期表示状態 (true/false) | | true | | `--draw` | 描画オプション(複数指定可能) | | なし | | `-h`, `--help` | ヘルプの表示 | | - | ### 描画オプションの書式 #### テキスト描画 ``` text:<レイヤー番号>,,,<テキスト内容> ``` 例:`text:1,100,700,サンプルテキスト` #### 四角形描画 ``` rect:<レイヤー番号>,,,<幅>,<高さ> ``` 例:`rect:2,50,50,200,60` ## プロジェクト構成 ``` pdf-memo-layers/ ├─ README.md ├─ build.gradle ├─ Convert-Pdf.ps1 // 一括変換用PowerShellスクリプト ├─ lib/ │ ├─ README.md // ライブラリダウンロード手順 │ └─ *.jar // iText7等のライブラリ(手動配置) ├─ src/ │ └─ main/java/ │ └─ co/jp/techsor/pdf/ │ ├─ App.java // CLIエントリポイント │ ├─ PdfMemoLayerService.java // レイヤー作成・描画の中核 │ ├─ LayerDrawingOptions.java // 描画オプション管理 │ └─ util/ │ └─ PdfUtils.java // 共通ユーティリティ ├─ samples/ │ ├─ input.pdf // サンプル入力ファイル(要準備) │ └─ output.pdf // 生成される出力ファイル ├─ pdfs/ // 一括変換用入力ディレクトリ ├─ converted/ // 一括変換結果出力ディレクトリ └─ convert.log // 変換ログファイル ``` ## 使用例 ### 1. シンプルなレイヤー追加 ```bash java -jar build/libs/pdf-memo-layers.jar \ --in samples/input.pdf \ --out samples/output.pdf ``` ### 2. カスタム設定でのレイヤー追加 ```bash java -jar build/libs/pdf-memo-layers.jar \ --in samples/input.pdf \ --out samples/output.pdf \ --layer1 "校正用メモ" \ --layer2 "レビューコメント" \ --l1on true \ --l2on false ``` ### 3. 描画要素付きでのレイヤー追加 ```bash java -jar build/libs/pdf-memo-layers.jar \ --in samples/input.pdf \ --out samples/output.pdf \ --draw "text:1,100,750,重要:この部分を確認してください" \ --draw "text:1,100,720,作成者:田中太郎" \ --draw "rect:2,50,600,300,100" \ --draw "text:2,60,650,注意事項エリア" ``` ## 結果の確認方法 1. 生成されたPDFをAdobe Acrobat、PDF-XChange Editor等で開く 2. レイヤーパネル(ナビゲーションパネル)を表示 3. 「メモ1」「メモ2」レイヤーが表示されることを確認 4. レイヤーのON/OFFで描画内容が表示・非表示されることを確認 ## 注意事項 ### 暗号化PDF パスワード保護されたPDFの場合、現在のバージョンでは対応していません。事前にパスワードを解除してから処理してください。 ### 座標系 PDFの座標系は左下が原点(0,0)です。テキストや図形の配置時にご注意ください。 ### ライセンス このプロジェクトはiText 7を使用しています。iText 7はAGPLまたは商用ライセンスです。 商用利用の場合は適切なライセンスを取得してください。 ## トラブルシューティング ### よくあるエラー 1. **ファイルが見つからない** - 入力ファイルのパスが正しいか確認してください - 相対パスではなく絶対パスを使用してみてください 2. **出力ディレクトリが存在しない** - 出力先のディレクトリが存在することを確認してください 3. **日本語ファイル名の問題** - Windows環境で日本語ファイル名を使用する場合、文字エンコーディングの問題が発生することがあります - **推奨解決策**: `Convert-Pdf.ps1`スクリプトを使用してください(日本語ファイル名に完全対応) ```powershell .\Convert-Pdf.ps1 -RootDir ".\pdfs" -Converter 'java -cp "build\classes;lib\*" co.jp.techsor.pdf.App --in "{input}" --out "{output}"' -OutputRoot ".\converted" ``` - 手動実行の場合:ファイル名を英語に変更するか、samplesディレクトリで実行してください ```bash cd samples java -cp "../build/classes;../lib/*" co.jp.techsor.pdf.App --in "input.pdf" --out "output.pdf" ``` 4. **メモリ不足エラー** - 大きなPDFファイルの場合、JVMのヒープサイズを増やしてください: ```bash java -Xmx2g -jar build/libs/pdf-memo-layers.jar ... ``` ## 開発者向け情報 ### ビルドとテスト ```bash # 手動でのビルド(Gradle Wrapperが利用できない場合) # 1. 必要なライブラリをダウンロード mkdir lib # iText7ライブラリなどを lib/ ディレクトリに配置 # 2. コンパイル mkdir build/classes javac -cp "lib/*" -d build/classes src/main/java/co/jp/techsor/pdf/*.java src/main/java/co/jp/techsor/pdf/util/*.java # 3. 実行 java -cp "build/classes;lib/*" co.jp.techsor.pdf.App --in samples/input.pdf --out samples/output.pdf # Gradle Wrapperが利用可能な場合 ./gradlew build ./gradlew fatJar ./gradlew run --args="--in samples/input.pdf --out samples/output.pdf" ``` ### APIの使用例 ```java import co.jp.techsor.pdf.PdfMemoLayerService; import co.jp.techsor.pdf.LayerDrawingOptions; // サービスのインスタンス作成 PdfMemoLayerService service = new PdfMemoLayerService(); // 描画オプションの作成 List options = Arrays.asList( LayerDrawingOptions.text(1, 100, 700, "サンプルテキスト"), LayerDrawingOptions.rectangle(2, 50, 50, 200, 60) ); // レイヤーの追加と描画 service.addMemoLayers("input.pdf", "output.pdf", "メモ1", "メモ2", true, false, options); ``` ## 一括変換用PowerShellスクリプト 日本語ファイル名を含む複数のPDFファイルを一括で処理するためのPowerShellスクリプト `Convert-Pdf.ps1` が用意されています。 ### 特徴 - **日本語ファイル名対応**: 変換ツールが日本語/マルチバイト名に対応していなくても安全に処理 - **一時ファイル管理**: ASCII名の一時ファイルを作成し、処理後に自動削除 - **並列処理**: 複数ファイルを同時に処理して効率化 - **堅牢なエラーハンドリング**: 失敗したファイルがあっても処理を継続 - **詳細ログ**: 処理状況をコンソールとファイルに記録 ### 基本的な使用方法 ```powershell # 基本的な一括変換(クラスパス指定方式) .\Convert-Pdf.ps1 ` -RootDir ".\pdfs" ` -Converter 'java -cp "build\classes;lib\*" co.jp.techsor.pdf.App --in "{input}" --out "{output}"' # 出力先指定と並列処理 .\Convert-Pdf.ps1 ` -RootDir ".\pdfs" ` -Converter 'java -cp "build\classes;lib\*" co.jp.techsor.pdf.App --in "{input}" --out "{output}"' ` -OutputRoot ".\converted" ` -Concurrency 2 ` -Log "convert.log" # DryRun(実行計画の確認) .\Convert-Pdf.ps1 ` -RootDir ".\pdfs" ` -Converter 'java -cp "build\classes;lib\*" co.jp.techsor.pdf.App --in "{input}" --out "{output}"' ` -DryRun ``` ### パラメータ | パラメータ | 説明 | 必須 | デフォルト | |-----------|------|------|-----------| | `-RootDir` | 変換対象のルートフォルダ | ✓ | - | | `-Converter` | 変換コマンドテンプレート | ✓ | - | | `-OutputRoot` | 出力先ルートフォルダ | | 元ファイルと同じディレクトリ | | `-Recurse` | サブフォルダも再帰処理 | | true | | `-Concurrency` | 同時実行数 | | 1 | | `-Log` | ログファイルパス | | コンソールのみ | | `-DryRun` | 実行せず計画のみ表示 | | false | | `-Force` | 既存出力ファイルを上書き | | false | ### 実行例 ```powershell # 実際の動作確認済みコマンド .\Convert-Pdf.ps1 ` -RootDir ".\pdfs" ` -Converter 'java -cp "build\classes;lib\*" co.jp.techsor.pdf.App --in "{input}" --out "{output}"' ` -OutputRoot ".\converted" ` -Concurrency 2 ` -Log "convert.log" ``` **実行結果例**: ``` [2025-09-12 14:28:53] [INFO] === PDF一括変換開始 === [2025-09-12 14:28:53] [INFO] 対象ファイル数: 2 [2025-09-12 14:28:54] [SUCCESS] 成功: テラル_ステンレス製立形多段ポンプSVM・SVMN型.pdf [2025-09-12 14:28:55] [SUCCESS] 成功: 杉乃井ホテル_電力監視制御装置.pdf [2025-09-12 14:28:55] [INFO] 処理済み: 2, 成功: 2, 失敗: 0 ``` ### 注意事項 - **JARファイルが利用できない場合**: `java -cp "build\classes;lib\*"`形式を使用してください - **ログファイル**: `-Log`パラメータでファイルパスを指定すると詳細ログが保存されます - **出力先**: `-OutputRoot`を指定すると、すべてのファイルが指定ディレクトリに直接出力されます(サブフォルダは作成されません) ## PDF解析ツール PDFファイルの詳細な解析を行うツール `PdfProbeApp` が追加されました。 ### 機能 1. **メタデータ解析** - Producer/Creator情報の取得 - XMPメタデータの解析 - Adobe Illustratorの検出 2. **OCG(レイヤー)解析** - レイヤー一覧の取得 - 初期表示設定(ON/OFF)の確認 3. **ページ内容解析** - レイヤー使用状況の確認 - BDC/EMCマーカーの検出 4. **注釈解析** - 注釈のレイヤー紐付け状況 - 手書き注釈を含む全注釈の分析 5. **Illustrator固有痕跡** - PieceInfo の検出 - AIPrivateData の痕跡確認 ### 使用方法 ```bash # 基本的な解析 java -jar build/libs/pdf-probe.jar -i input.pdf # 詳細解析 java -jar build/libs/pdf-probe.jar -i input.pdf -v # 結果をファイルに出力 java -jar build/libs/pdf-probe.jar -i input.pdf -v -o result.txt # JSON形式で出力(今後実装予定) java -jar build/libs/pdf-probe.jar -i input.pdf -j -o result.json ``` ### ビルド方法 ```bash # PDF解析ツールのJARファイルを作成 ./gradlew probeJar # 両方のツール(メモレイヤー追加+解析)を作成 ./gradlew allJars ``` ### テスト実行 ```powershell # PDF解析ツールのテスト .\test-probe.ps1 ```