You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

386 lines
13 KiB

1 month ago
# 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:<レイヤー番号>,<X座標>,<Y座標>,<テキスト内容>
```
例:`text:1,100,700,サンプルテキスト`
#### 四角形描画
```
rect:<レイヤー番号>,<X座標>,<Y座標>,<>,<高さ>
```
例:`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<LayerDrawingOptions> 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
```