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.
 
 
review512jwy@163.com afaa54caf7 pdf图层完善 1 month ago
gradle/wrapper 初始化 1 month ago
samples 初始化 1 month ago
src/main/java/co/jp/techsor/pdf pdf图层完善 1 month ago
.gitignore 初始化 1 month ago
Convert-Pdf.ps1 初始化 1 month ago
Project.md 初始化 1 month ago
README.md 初始化 1 month ago
build.gradle pdf图层完善 1 month ago
gradlew.bat 初始化 1 month ago

README.md

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使用時(推奨)

# プロジェクトのクローンまたはダウンロード後
./gradlew build

# 実行可能JARファイルの作成
./gradlew fatJar

手動ビルド(Gradle未使用)

# 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

使用方法

基本的な使用方法

# 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 "校正レイヤー"

描画オプション付きの使用方法

# テキストと図形を描画
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. シンプルなレイヤー追加

java -jar build/libs/pdf-memo-layers.jar \
  --in samples/input.pdf \
  --out samples/output.pdf

2. カスタム設定でのレイヤー追加

java -jar build/libs/pdf-memo-layers.jar \
  --in samples/input.pdf \
  --out samples/output.pdf \
  --layer1 "校正用メモ" \
  --layer2 "レビューコメント" \
  --l1on true \
  --l2on false

3. 描画要素付きでのレイヤー追加

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スクリプトを使用してください(日本語ファイル名に完全対応)
    .\Convert-Pdf.ps1 -RootDir ".\pdfs" -Converter 'java -cp "build\classes;lib\*" co.jp.techsor.pdf.App --in "{input}" --out "{output}"' -OutputRoot ".\converted"
    
    • 手動実行の場合:ファイル名を英語に変更するか、samplesディレクトリで実行してください
    cd samples
    java -cp "../build/classes;../lib/*" co.jp.techsor.pdf.App --in "input.pdf" --out "output.pdf"
    
  4. メモリ不足エラー

    • 大きなPDFファイルの場合、JVMのヒープサイズを増やしてください:
      java -Xmx2g -jar build/libs/pdf-memo-layers.jar ...
      

開発者向け情報

ビルドとテスト

# 手動でのビルド(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の使用例

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名の一時ファイルを作成し、処理後に自動削除
  • 並列処理: 複数ファイルを同時に処理して効率化
  • 堅牢なエラーハンドリング: 失敗したファイルがあっても処理を継続
  • 詳細ログ: 処理状況をコンソールとファイルに記録

基本的な使用方法

# 基本的な一括変換(クラスパス指定方式)
.\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

実行例

# 実際の動作確認済みコマンド
.\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 の痕跡確認

使用方法

# 基本的な解析
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

ビルド方法

# PDF解析ツールのJARファイルを作成
./gradlew probeJar

# 両方のツール(メモレイヤー追加+解析)を作成
./gradlew allJars

テスト実行

# PDF解析ツールのテスト
.\test-probe.ps1