v0.6.0 · .pdfl 语言 + pdfl 命令行

把 PDF 检查清单,写成能跑的代码。

PDFLang 用一份纳入版本管理的脚本,取代靠人盯着屏幕逐条核对的清单。总墨量、字体嵌入、必备条款、条码、个人信息——声明一次,每个文件都会被检查,无论在终端还是在 CI 里。

profiles/offset.pdfl — 一份胶印印前检查配置
profile "offset-magazine" {

  const TAC_LIMIT = 300%
  const MIN_DPI   = 300

  check "Ink coverage" tags: ["prepress"] {
    doc.pages.each { |page|
      tac = prepress::calculate_exact_tac(page.number)
      assert tac <= TAC_LIMIT,
        "page #{page.number}: #{tac}% ink"
    }
  }

  check "Fonts" tags: ["fonts"] {
    loose = prepress::detect_text_substitution()
    assert loose.length == 0,
      "fonts not embedded: #{loose.join(", ")}"
  }
}
134
个函数
7
个命名空间
12
条命令
8
种文档语言

七个命名空间,一门语言

每个命名空间对应一类问题,你只用得着的那部分:从不调用 codes:: 的脚本,就不会为页面扫描付出代价。

prepress:: 30 个函数

印前

精确总墨量、分色、专色、四色黑、细线、字体替换、最小字号、各类页面框与出血。上版之前,就看到上版才会暴露的问题。

text:: 25 个函数

文本

提取、规范化、正则检索,以及对文件中实际内容的校验,包括个人信息识别。

struct:: 23 个函数

结构

文件本身:元数据、XMP、内部对象、加密与权限、哈希。回答一个问题——这份 PDF 是否名副其实。

fix:: 19 项操作

规范化

页面框、页面旋转与顺序、水印、合并与拆分、优化。写出新的 PDF,原文件绝不改动。

visual:: 16 个函数

图像

有效分辨率、质量、感知哈希,以及两个版本之间的 SSIM 比对。抓出那个在 100% 视图下肉眼放行的低分辨率标志。

codes:: 13 个函数

条码

检测并解码 EAN、UPC、Code 128/39、ITF、QR 码、Data Matrix、Aztec 和 PDF417,再把读到的内容与应有的值核对。

data:: 8 个函数

外部数据

把文档内容与你自己的术语表、数据集和查找表交叉核对:批号、料号、审定过的术语。

用退出码,不是截图

所有校验类命令遵循同一约定:0 全部通过,1 仅有警告,2 校验失败,3 脚本语法错误。报告可输出为 JSON、CSV、HTML 或审计用 PDF——一份给流水线,一份给客户。

同一份配置,现在用来拦下一次合并
# .github/workflows/preflight.yml
- run: pdfl run profiles/offset.pdfl artwork.pdf \
         --output html --output-file report.html \
         --fail-on warning

# 0 ok · 1 warnings · 2 validation errors · 3 syntax error
$ pdfl run profiles/offset.pdfl artwork.pdf
$ echo $?
2

为生产环境而写

印刷厂

客户文件送来后,得有人在上版前核对墨量、字体、图像和出血。事后才发现的问题,赔进去的是整批印量。

每种纸张一份配置。pdfl watch 校验落入热文件夹的文件,并生成可以直接转发的 HTML 报告。

法律出版

合同和政策文本必须包含必备条款,不能泄露个人信息,并且每次修订都要保持元数据一致。

条款直接变成断言,失败信息由你自己撰写。pdfl compare 展示同一文档两个修订版之间的差异。

受监管的制造业

说明书必须载有监管机构要求的文字,以及与实际生产批次相符的批号。

text:: 核对必备表述,codes:: 解码印刷的 Data Matrix,并与生产数据集比对。

订阅 PDFLang

授权按设备计:pdfl fingerprint 识别机器,pdfl license 完成激活。操作员的工位和构建代理上,跑的是同一个二进制。

查看套餐