Codex 生成的 PDF 能直接交付吗?检查页数、内容、链接和排版

提供可下载的两页 PDF、生成与验收脚本,实际核对页数、标记、尺寸、中英文和链接,并用缺页样本验证检查是否有效。

米白背景和浅色卡纸上的模板纸线稿,下方写有 Codex PDF Checks。

PDF 保存后能打开、页数和内容符合要求、逐页看过排版,才具备交付条件。生成命令成功、导出通知出现,或源文档的截图看起来正常,都不能单独证明最终文件完整。

本文提供两页测试 PDF、生成脚本、验收脚本和故意缺一页的样本。2026 年 10 月 18 日的文件工具测试中,完整 PDF 通过六组检查;单页副本在页数和内容标记检查上失败。我们也渲染并查看了完整文件的两页。本轮没有测试原生应用导出或桌面查看器重开;文中的“重新打开”指从已保存 PDF 重新解析,不是通过界面点击打开。

Computer Use 卡在应用授权时,这个区别尤其重要。OpenAI 的Computer Use 文档建议任务适合时优先使用结构化集成。用户决定不再使用受阻应用后,我们采用了独立的文件验收路线;这不代表修复或绕过了应用权限。

本文由 Ofox 发布,样本不含客户文档,也不需要 Ofox API 账号。

先定义交付要求,再生成文件

导出或生成之前就写清验收条件,否则很容易把“恰好生成了什么”当成合格结果。

属性本样本要求要防止的问题
格式可由解析器读取的 PDF只有 .pdf 后缀,实际内容不对
页数恰好两页导出不完整
每页标记第一页 EXPORT-TEST-001、第二页 EXPORT-TEST-002,各出现一次缺页或内容重复
页面尺寸A4 竖版,允许很小的数值误差页面设置错误
文字每页都有英文及指定中文测试句语言内容缺失
链接两页均有指向 https://ofox.ai/blog/ 的链接注释目标地址错误
外观无截字、缺字或表格重叠文本提取无法发现的排版问题
源稿保留源文件,另写输出便于复核与恢复

真实交付应换成自己的章节标题或必备内容标记。客户要求不是两页 A4,就不能照搬本例标准。这些是测试样本的规格,不是所有 PDF 都必须满足的质量规则。

文件工具和应用导出都需要明确的验收要求

下面的提示词可作为任务约束。选择实际使用的生成路线,不要把文件生成器与应用导出当作同一种实测:

通过 <已授权的文件工具或应用>,创建或导出指定文档到 <新的输出路径>。
保留输入,不覆盖已有输出,记录实际使用的工具和设置。

结果应为两页 A4 竖版 PDF。第一页包含一次 EXPORT-TEST-001,
第二页包含一次 EXPORT-TEST-002。每页均有要求的中英文、
可读表格,以及指向 https://ofox.ai/blog/ 的链接。

用解析器重新打开已保存 PDF,检查格式、页数、逐页编号、尺寸、
文字和链接注释。渲染两页并检查排版。若另用原生查看器打开,
单独记录这一步,不把解析器检查写成桌面界面测试。
报告失败项和最终输出路径。

操作中断与明确失败也要分开。重试前先检查目标文件是否已经存在、是否完整。已经合格的文件再导出一次,可能只是多出几个难以区分的副本;若只有部分内容,则保留足够的失败证据,再输出到另一个路径。

复现这次文件测试

下载样本和脚本,解压到新目录。包内有 scripts/make_pdf.py、scripts/check_pdf.py,以及 output/pdf/verified-handoff.pdf 的已验收结果。生成器拒绝覆盖已有结果,先检查附带文件即可;需要重新生成时,在自己的解压副本中,把原结果移到备份位置。

本地 Python 环境需要 ReportLab 生成 PDF、pypdf 验收:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install reportlab pypdf
python scripts/check_pdf.py output/pdf/verified-handoff.pdf

Windows 的 PowerShell 激活命令为 .venv\Scripts\Activate.ps1。这些是复现步骤;本次使用本地已有 Python 库,并没有在每种操作系统上重新测试安装流程。无需模型 API Key,但安装依赖需要联网。

在自己的副本里备份移走附带 PDF 后,执行生成与正、负例验收:

python scripts/make_pdf.py
python scripts/check_pdf.py output/pdf/verified-handoff.pdf
python scripts/check_pdf.py evidence/negative-one-page.pdf

最后一条应打印 passed: false,退出码为 1。这是预期的负例拒绝,不是依赖安装失败。要在本地渲染,安装 PyMuPDF 后将每页保存为图片:

python -m pip install pymupdf
python -c "import fitz; d=fitz.open('output/pdf/verified-handoff.pdf'); [p.get_pixmap(matrix=fitz.Matrix(1.2,1.2)).save('page-%s.png' % (i+1)) for i,p in enumerate(d)]"

以可读尺寸打开生成的两张 PNG。也可以逐页用 PDF 查看器检查,但记录里要写清实际采用的查看器与路径。

验收脚本只有六组检查全部通过才返回零退出码。应读取 JSON 结果,不只是看目录里出现了文件。下面是一个较小的独立检查片段:

from pypdf import PdfReader

reader = PdfReader("output/pdf/verified-handoff.pdf")
assert len(reader.pages) == 2
for number, page in enumerate(reader.pages, start=1):
    text = page.extract_text() or ""
    assert text.count(f"EXPORT-TEST-00{number}") == 1

下载版额外检查跨页编号总数、PDF 文件头、A4 尺寸误差、中文句子和链接。它仍只是样本验收器,不是 PDF 安全扫描器、无障碍审计或通用字体测试工具。

查看真正生成出来的页面

本次用 ReportLab 生成 PDF,pypdf 从落盘文件重新读取,PyMuPDF 渲染页面。下图来自真实 PDF,不是 Codex、浏览器或桌面导出窗口的截图。图中的中文行是有意加入的测试内容,不是产品界面本地化。

实际 PDF 第一页渲染,包含独立编号、中英文测试内容和表格

第一页是活动事实,第二页是交付检查清单。两页各有编号、表格、页脚和链接。源材料与生成脚本都与输出文件分开保存,渲染不会修改输入。

实际 PDF 第二页渲染,包含第二页编号和交付检查清单

逐页查看时要用能读清的尺寸。可提取文字仍可能落在页面外,或被别的对象盖住;只有图片的 PDF 则可能显示正常,却无法提取文字。提取失败不自动等于空白页,应检查渲染结果,并确认这次交付是否允许图片型文档。没有可搜索文字,就不要声称已满足文字搜索要求。

链接注释能证明文件里存储的目标地址,不能证明目标网站可访问或可信。重要交付应另行检查目标;本样本的 Ofox 博客链接只是参考地址。

故意做一个不合格样本

我们将完整文件复制为只含第一页的 PDF,运行同一个验收器。结果为 passed: false,页数与逐页标记两项失败。其他检查仍可能通过,因为保留下来的第一页确实有指定尺寸、文字和链接。

这个负例能检验验收方法有没有漏掉最基本的不完整交付。如果只检查“能否打开”,保存正常的单页截断文件也会被放行;只检查某些文字在全文中出现过,也可能漏掉重复页。

本地测试结果可以支持的结论
完整两页样本六组检查通过这个已保存文件符合对应结构条件
只有一页的副本被拒绝验收器发现了这次缺页情况
完整两页均渲染并查看未见明显截字、重叠在本次渲染器中排版正常
原生应用导出与查看器打开未测试不构成桌面自动化成功证据

一个负例失败,不代表所有损坏都能被发现。字体缺失、链接错误、加密文件或 PDF 结构损坏可能表现不同。应围绕自己的交付风险继续增加样本,而不是把这六组检查当作万能认证。

把“完成”写成接收方能核对的记录

交付时说明最终路径、文件大小或哈希、实际生成方式、页数、内容核验、渲染结果和剩余限制。哈希能识别验收的是哪个文件,不能证明内容含义或视觉质量正确。

如果用户明确要求测试某个原生应用的导出功能,文件工具通过不能替代那项要求,应分别写“文件验收已完成”和“应用测试未完成”。如果目标本身是获得合格 PDF,且文件路线已获授权,就可以完成这一部分,不必假装点击过“导出”按钮。

源材料怎么准备,可看用 Codex 把消息整理成计划;如果卡住的是截图能力而不是 PDF 结构,可看Windows Computer Use 截图失败的阶段排查。