コンテンツにスキップ

PDFLang とはどんな言語か

PDFLang は目的がひとつだけのスクリプト言語です。正しい PDF とはどういうものかを 書き留めて、機械がファイルをそれと照合できるようにすること。

スクリプトの拡張子は .pdfl。実行するのは pdfl という、Rust で書かれたコマンド ラインツールです。

その PDF を印刷に回してよいか、提出してよいか、顧客に送ってよいか。誰かが判断 しなければなりません。

判断の基準は具体的です。インキ総量は 300% 未満。フォントはすべて埋め込み。全ページ にトリムボックス。バーコードが隣に印字された番号と一致すること。誤って回転した ページがないこと。

こうした基準はたいてい三か所に同時に存在します。その仕事を一番長くやってきた人の 頭の中、誰も開かないチェックリスト、そして作者以外は手を入れられないスクリプト。 やがてその人は辞め、チェックリストは古くなり、スクリプトは触れないものになります。

PDFLang は、基準をひとつのファイルにまとめ、それを知っている人自身が読めるように するために存在します。

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 は、あなたが書いたメッセージとともに指摘を記録します。

クラスも継承も型宣言もセミコロンもありません。これは欠落ではなく決定です。想定 している読み手は、プログラミングではなく印刷の現場を知っている人だからです。

同じ意図は細かいところにも表れています。ページは 1 から数えます。コンパイラの外に いる人がみなそう数えるからです。寸法は 3mm や 1in をそのまま書けます。百分率は 300% と書きます。

仕事の種類ごとに 7 つの名前空間があります。

  • text:: — 抽出、正規化、検索、各種検証、個人情報
  • struct:: — オブジェクト、メタデータ、XMP、セキュリティ、ハッシュ
  • visual:: — 解像度、視覚的比較、知覚ハッシュ、品質
  • prepress:: — インキ量、分版、特色、フォント、各種ボックス
  • codes:: — バーコードと QR の検出、デコード、検証
  • fix:: — ボックス、ページ、透かし、結合と分割、最適化
  • data:: — ファイルの外にある用語集、データセット、参照表

レポートです。省略した形ですが、失敗した 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 も 選べます。

Terminal window
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%) と表示します。

スクリプトの中に書くメッセージはあなたのものです。レポートを読む人の言語で書いて ください。

言語マニュアルは最初から最後まで通して読む価値のある唯一の 章です。その後はすべて参照用です。名前空間ごとの章、CLI コマンド、そして印刷会社・法律出版社・試験所・CI パイプラインという 完全な事例で構成された実践レシピ。

文章より先にコードを読みたい場合は、サンプルがコメントごと残された 実行可能なプロファイルです。

DigitalOceanこのサイトのホスティングを提供してくださる DigitalOcean に感謝します。