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
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
|
||
|
|
```
|