PDFLang とはどんな言語か
PDFLang は目的がひとつだけのスクリプト言語です。正しい PDF とはどういうものかを 書き留めて、機械がファイルをそれと照合できるようにすること。
スクリプトの拡張子は .pdfl。実行するのは pdfl という、Rust で書かれたコマンド
ラインツールです。
解こうとしている問題
Section titled “解こうとしている問題”その PDF を印刷に回してよいか、提出してよいか、顧客に送ってよいか。誰かが判断 しなければなりません。
判断の基準は具体的です。インキ総量は 300% 未満。フォントはすべて埋め込み。全ページ にトリムボックス。バーコードが隣に印字された番号と一致すること。誤って回転した ページがないこと。
こうした基準はたいてい三か所に同時に存在します。その仕事を一番長くやってきた人の 頭の中、誰も開かないチェックリスト、そして作者以外は手を入れられないスクリプト。 やがてその人は辞め、チェックリストは古くなり、スクリプトは触れないものになります。
PDFLang は、基準をひとつのファイルにまとめ、それを知っている人自身が読めるように するために存在します。
スクリプトの見た目
Section titled “スクリプトの見た目”profile "press-ready" {
check "インキ量が上限内" tags: ["prepress"] { require prepress::validate_tac_limits(300) }
check "フォントの埋め込み" { doc.fonts.each { |font| assert font.is_embedded, "フォント #{font.name} が埋め込まれていません" } }}言語の大部分は 4 つの語で成り立っています。
profileは check をまとめ、その集合に名前を付けます。checkはひとつの規則であり、レポートのひとつのセクションになります。requireは前提が満たされないときに check を打ち切ります。assertは、あなたが書いたメッセージとともに指摘を記録します。
なぜこう読めるのか
Section titled “なぜこう読めるのか”クラスも継承も型宣言もセミコロンもありません。これは欠落ではなく決定です。想定 している読み手は、プログラミングではなく印刷の現場を知っている人だからです。
同じ意図は細かいところにも表れています。ページは 1 から数えます。コンパイラの外に
いる人がみなそう数えるからです。寸法は 3mm や 1in をそのまま書けます。百分率は
300% と書きます。
何を検査できるか
Section titled “何を検査できるか”仕事の種類ごとに 7 つの名前空間があります。
text::— 抽出、正規化、検索、各種検証、個人情報struct::— オブジェクト、メタデータ、XMP、セキュリティ、ハッシュvisual::— 解像度、視覚的比較、知覚ハッシュ、品質prepress::— インキ量、分版、特色、フォント、各種ボックスcodes::— バーコードと QR の検出、デコード、検証fix::— ボックス、ページ、透かし、結合と分割、最適化data::— ファイルの外にある用語集、データセット、参照表
返ってくるもの
Section titled “返ってくるもの”レポートです。省略した形ですが、失敗した check はこう出ます。
{ "script_name": "prepress.pdfl", "input_file": "magazine.pdf", "status": "FAIL", "error_count": 2, "diagnostics": [ { "id": "PDFL-093751a2", "severity": "error", "check_name": "Ink coverage", "message": "page 7: 324% ink (limit 300%)" } ]}この message に注目してください。スタックトレースではありません。ファイルを送って
きた取引先にそのまま転送できる文章です。だからこそ、この言語では規則のすぐ隣で
自分の手で書かせるようになっています。
既定は JSON です。CSV・HTML・PDF は、解析するのではなく読む必要がある人のために あります。指摘をチームがふだん見ている場所に届けたいときは SARIF と JUnit も 選べます。
パイプラインの中で動かす
Section titled “パイプラインの中で動かす”pdfl run press-ready.pdfl magazine.pdf > report.json終了コードが判定を運ぶので、シェルスクリプトや CI ジョブは何も解析せずに分岐でき ます。
| コード | 意味 |
|---|---|
0 |
すべて合格 |
1 |
警告のみ |
2 |
検証エラー |
3 |
スクリプトの構文エラー |
10 |
文書をそもそも読めなかった |
ツールは英語、あなたのスクリプトはそうでなくてよい
Section titled “ツールは英語、あなたのスクリプトはそうでなくてよい”pdfl 自身が出力するメッセージ — 診断、エラー、コマンドラインヘルプ — は英語です。
コマンドラインツールの慣例に従っています。この文書は 7 言語に翻訳されていますが、
失敗した check は page 7: 324% ink (limit 300%) と表示します。
スクリプトの中に書くメッセージはあなたのものです。レポートを読む人の言語で書いて ください。
どこから読むか
Section titled “どこから読むか”言語マニュアルは最初から最後まで通して読む価値のある唯一の 章です。その後はすべて参照用です。名前空間ごとの章、CLI コマンド、そして印刷会社・法律出版社・試験所・CI パイプラインという 完全な事例で構成された実践レシピ。
文章より先にコードを読みたい場合は、サンプルがコメントごと残された 実行可能なプロファイルです。