8. `fix::` 名前空間 — 正規化
PDF を変更して新しいファイルを保存する19の操作。元のファイルは決して 書き換えられません。
8.1 使い方
Section titled “8.1 使い方”fix:: は書き込みを行う唯一の名前空間なので、専用のコマンドで実行します:
pdfl fix input.pdf script.pdfl --output fixed.pdf| オプション | 動作 |
|---|---|
--output <file> |
出力 PDF(必須) |
--dry-run |
保存せず、操作の一覧だけ表示 |
--report json|csv|html|pdf |
レポート形式 |
--report-file <file> |
レポートをファイルに書き出す |
pdfl run で fix:: を呼ぶと、正しいコマンドを案内するエラーになります。
検証のつもりで修正を適用してしまう事故を防ぐためです。
// このスクリプトに check は不要です:順に実行されるコマンドです。fix::set_trim_box(8.5, 8.5, 586.5, 833.5)fix::add_page_numbers()fix::add_watermark("DRAFT")各呼び出しはその場で検証され(存在しないページ、不正な回転角、無いファイル)、
そのあとで適用されます。レポートには実施内容が fixes として入ります:
"fixes": [ "TrimBox set to [8.5, 8.5, 586.5, 833.5]", "page numbering added", "watermark \"DRAFT\" added"]同じスクリプトで検証と修正を混ぜても構いません:
// 修正の前に検証 — 前提が崩れていればレポートに出ますcheck "Preconditions" { require doc.page_count > 0 assert !struct::check_encryption(), "file is encrypted, cannot fix it"}
fix::add_page_numbers()8.2 ページボックス
Section titled “8.2 ページボックス”| 操作 | 動作 |
|---|---|
fix::set_page_size(width, height) |
全ページの MediaBox を設定 |
fix::set_crop_box(x0, y0, x1, y1) |
全ページの CropBox を設定 |
fix::set_trim_box(x0, y0, x1, y1) |
全ページの TrimBox を設定 |
fix::set_bleed_box(x0, y0, x1, y1) |
全ページの BleedBox を設定 |
座標はポイント、左下から右上の順です。
// A4 をポイントで — 単位を使えば変換は自動ですfix::set_page_size(210mm, 297mm)
// 出版社から制作用ボックス無しで届いた場合:// TrimBox = 仕上がり、BleedBox = 塗り足し 3mm を含む範囲fix::set_trim_box(8.5, 8.5, 586.5, 833.5)fix::set_bleed_box(0, 0, 595, 842)8.3 ページ
Section titled “8.3 ページ”| 操作 | 動作 |
|---|---|
fix::rotate_page([page,] degrees) |
90/180/270 度回転(ページ省略で全ページ) |
fix::delete_page(n) |
ページを削除 |
fix::duplicate_page(n) |
ページを複製(直後に挿入) |
fix::reorder_pages([新しい, 順序]) |
並べ替え(各ページをちょうど一度ずつ) |
fix::split_document(from, to, "out.pdf") |
範囲を別ファイルに保存 |
fix::merge_documents("other.pdf") |
別 PDF のページを末尾に追加 |
唯一のページを削除しようとすると、明確なメッセージで拒否されます。
fix::rotate_page(90) // 全ページfix::rotate_page(3, 180) // 3ページ目だけfix::delete_page(1) // 下書きの表紙を削除fix::reorder_pages([4, 1, 2, 3])
// 表紙と本文を別の業者へ送るために分割fix::split_document(1, 2, "cover.pdf")fix::split_document(3, 50, "body.pdf")
fix::merge_documents("attachments/warranty.pdf")8.4 コンテンツ
Section titled “8.4 コンテンツ”| 操作 | 動作 |
|---|---|
fix::add_watermark("text") |
全ページに斜めのグレーの透かし |
fix::add_stamps("text") |
各ページ右上に赤いスタンプ |
fix::add_page_numbers() |
フッターに n / total |
fix::remove_annotations() |
すべての注釈を削除 |
fix::remove_attachments() |
すべての添付ファイルを削除 |
fix::flatten_layers() |
オプショナルコンテンツ(OCG)を解除 |
fix::add_watermark("DRAFT — DO NOT PRINT")fix::add_stamps("APPROVED 2026-08-02")fix::add_page_numbers()
// 印刷所へ送る前に:校正コメントは出てはいけませんし、// 添付はファイルを重くするだけですfix::remove_annotations()fix::remove_attachments()
// 「英語版」を非表示にしたレイヤーが誤って再表示される事故を防ぎますfix::flatten_layers()8.5 最適化
Section titled “8.5 最適化”この節の操作はファイルが小さくなる場合にのみ書き込みます。書き直しの 結果が大きくなる場合は元のまま保持されます。
| 操作 | 動作 |
|---|---|
fix::remove_unused_resources() |
trailer から到達できないオブジェクトを破棄 |
fix::downsample_images([dpi]) |
目標 DPI(既定 300)超の画像をリサンプル |
fix::compress_images([quality]) |
画像を JPEG で再エンコード(1〜100、既定 85) |
DPI はページ上の実際の印刷サイズから計算されます。
CMYK 画像はそのまま保持されます。 リサンプルには RGB への変換が必要で、 印刷用の分版が失われてしまうためです。印刷所のファイルでは RGB 画像から 削減効果が得られます。
// メール承認用の版に 300 DPI は不要ですfix::downsample_images(96)fix::compress_images(70)fix::remove_unused_resources()利用できない操作
Section titled “利用できない操作”subset_fonts と linearize_document は fix:: の操作として存在せず、
未知の関数としてエラーになります。
- subset_fonts:実装して計測しました。プロ用の生成ツールは既に使用する
グリフだけを埋め込むため、削減効果は最良でも 0.5%、他ではゼロでした。
フォント破損のリスクに見合いません。サブセットかどうかを確認するには
prepress::subset_fonts()を使ってください。 - linearize_document:ヒントテーブル(PDF 仕様 §7.14)の生成が必要です。 これを行う Rust ライブラリは存在せず、部分的な実装ではリーダーが 「Fast Web View」と認識しません。
8.6 完全な例
Section titled “8.6 完全な例”出版社のファイルを印刷所向けに整える
Section titled “出版社のファイルを印刷所向けに整える”// 使い方: pdfl fix publisher.pdf prepare_for_print.pdfl --output print.pdf
check "Preconditions" { require doc.page_count > 0 assert !struct::check_encryption(), "file is encrypted — ask the publisher for the open version"}
// 出版社が設定しなかった制作用ボックスfix::set_trim_box(8.5, 8.5, 586.5, 833.5)fix::set_bleed_box(0, 0, 595, 842)
// 整理:校正コメントと添付は印刷に回しませんfix::remove_annotations()fix::remove_attachments()fix::flatten_layers()fix::remove_unused_resources()メール承認用の軽量版
Section titled “メール承認用の軽量版”// 使い方: pdfl fix final.pdf email_version.pdfl --output approval.pdf
fix::downsample_images(96)fix::compress_images(70)fix::add_watermark("PROOF — NOT THE FINAL VERSION")fix::add_page_numbers()pdfl 自身で結果を確認します:
pdfl fix final.pdf email_version.pdfl --output approval.pdfpdfl inspect approval.pdf # 生成されたファイルのサイズ・DPI・警告← codes:: · 目次 · 次:data:: →