题目图片/文档转试卷 PDF
0. 视觉能力预检(图片输入必做)
- 判断当前会话是否实际支持图像输入与理解,不能只根据模型名称猜测。DeepSeek V4 Flash Vision 可作为经济型视觉模型;任何确认支持图像输入的模型均使用同一视觉流程。
- 支持图像时:以原图为准,高分辨率逐图读取;复杂扫描页先按题块/图块处理,不把整页当作一张配图。
- 不支持图像时,先向用户明确提示:“当前模型无法直接识图,已切换 OCR 兜底;文字、公式和图像边界需人工核对。” 然后才可运行系统 OCR。OCR 得出的文字、公式、图形边界均标注为「待核对」;看不清的字符仍写「?」。
- 识别每个题块时先建立可复核记录:
题干、选项、公式、示意图区域(原图坐标 x,y,w,h)、置信度/待核对项。不要根据该记录猜测或补全原图未出现的信息。 - 对 DeepSeek V4 Flash Vision,先要求它返回上述识别清单和可验证区域坐标,确认区域只含示意图后才裁剪;不得把模型输出直接视为已核对结果。其他多模态模型复用完全相同的输入和输出约定。
工作流程
1. 输入类型判断
- 输入是图片或图片文件夹 → 直接进入第 4 步「图片处理」。
- 输入是文档(.pdf / .docx / .md / .txt)→ 运行
scripts/extract_document.py <文档> -o <输出目录>,然后读取输出的content.txt(全文+占位符)和pages.txt(轻量索引)。 - 遇到旧版 .doc 或其他不支持格式 → 告知用户另存为 .docx,或说明不支持。
2. 简单判断,确定题目部分
- 只做快速判断,不逐字精读:
- 图片输入:快速浏览/抽样识别每张图,区分题目图与无关图(封面、答案页、说明图),确定处理范围与顺序。
- 文档输入:先读
pages.txt,根据页首行、题号/题型标记、图片分布,判断题目所在的页/段落范围。
- 排除封面、目录、考试说明、答案页、水印等非题目内容,只保留题目部分。
- 判断不明确时,标记疑问并询问用户,不擅自猜测。
3. 内容分流
- 情况① 图文混合文档:
content.txt的文本可直接使用(无需 OCR),但公式要校正为 LaTeX 数学模式;用视觉筛选images/中真正的题目配图(丢弃装饰图),需要时裁剪/清理(规则见第 4 步)→ 进入第 5 步。 - 情况② 纯文字文档:直接用文本识别题干、公式、选项(公式转 LaTeX 数学模式)→ 进入第 5 步(无配图)。
- 情况③ 纯图片文档(扫描版 PDF / 图片型文档):
extract_document.py已拆分为页图片(PDF 渲染到 pages/,DOCX 提取到 images/)→ 进入第 4 步按图片流程处理。 - 输入本身是图片/文件夹 → 直接进入第 4 步。
4. 图片处理(图片输入 / 情况③ / 情况① 的配图)
- 清点图片顺序与数量;内容相同的重复图片合并为一道题。原图优先,不能用缩略图或聊天预览图替代。
- 逐题块识别并完成「视觉能力预检」规定的记录。默认只保留几何图、坐标图、表格、实验装置等示意图;题干、选项和可识别公式转为 LaTeX,不作为配图保存。
- 先用视觉模型给出的
x,y,w,h定位单独示意图,再运行:scripts/tighten_crop.py <原图> -o <配图> --region x,y,w,h --manifest <配图>.crop.json- 脚本会收紧边界、保护细线/箭头/坐标轴,并默认清理内容保护区外的中性灰底;需要保留原背景时加
--no-clean-background,暗角影响边界时调低--threshold(如 200)。禁止手工截图。 - 每张裁剪图与
.crop.json必须目视复核:四周留白接近默认 8px、不含题干文字、不裁掉图形内容。初始review_status必须是pending;复核合格才重跑脚本并写--review-status approved。不合格时调整区域重裁,无法安全裁剪则保留原图并标「待核对」。
- 脚本会收紧边界、保护细线/箭头/坐标轴,并默认清理内容保护区外的中性灰底;需要保留原背景时加
- 将已复核的题目文字与配图一一对应;OCR 或未批准裁剪不得作为无条件可信的依据。
5. 排版(所有情况通用)
- 复制
assets/gaokao-template.tex作为排版模板,按需微调\questionitemfig中配图的宽度和高度(默认:宽 85% 行宽、高不超过页面 30%),替换其中的内容;仿照高考版式,相同题型放在一起,选择/填空题之间空一行;解答题之间用\workarea{5}留出 5 行作答区。
6. 编译
- 用
which xelatex检测系统环境;有则用 xelatex 编译两遍(页脚"共 N 页"需要两遍才正确),或使用latexmk -pdf;没有 xelatex 则用 Tectonic;两者都没有时按「无本地 LaTeX 的替代方案」处理(优先在线编译,HTML 兜底须人工核对)。
7. 渲染检查(交付前必做)
- 运行
scripts/render_check.py把 PDF 逐页渲染成图片,检查溢出、重叠、公式错误、配图裁剪是否准确,并检查编译日志没有Missing character警告;同时检查页首没有孤立分隔线、题号不孤悬在页尾、每题尽量不跨页;发现问题则修改后重新编译并再次检查。
8. 交付
- 交付 .tex 源文件和 PDF(同名、同一目录,如
试卷.tex与试卷.pdf)。 - 若目标用户没有本地 LaTeX,交付时附上在线编译说明:把
试卷.tex与figures/(如有)一起打包,上传到 Overleaf 或 TeXPage 新建项目即可编译。
无本地 LaTeX 的替代方案
- 在线编译/编辑(推荐,零安装):把
试卷.tex与figures/配图目录打包,上传到 Overleaf(overleaf.com)或 TeXPage(texpage.com,中文友好、支持 ctex)新建项目编译。模板自包含(宏定义都在 .tex 内),无需修改即可出 PDF,也可直接在浏览器里编辑题目。 - 仅查看/打印:直接把已生成的 PDF 发给用户即可,不需要任何 LaTeX 环境。
- 需要 Word 编辑:若环境装有 pandoc,可执行
pandoc 试卷.tex -o 试卷.docx --resource-path=.生成可编辑 Word(公式转为 OMML,需人工核对);没有 pandoc 时建议用在线编辑器修改 LaTeX 后重新导出。 - 本机无 LaTeX 的兜底:可生成含 MathJax 的 HTML 用浏览器打开并打印为 PDF,但复杂 ctex 模板与自定义宏可能无法完整还原,必须人工核对后才能交付。
试卷版式规范(九科通用)
- A4 单栏;正文小四宋体(12pt)、约 1.18 倍行距(紧凑排版)、数字/字母 Times New Roman——模板已内置,不要改动这些设置。
- 试卷标题用二号黑体、学科/时间/分值行用三号黑体(通过模板的
\examtitle实现)。 - 层级序数按"一、 → 1. →(1)→ ①"逐级使用;① 只用于正文,禁止出现在标题或加粗文字中(会缺字形)。
- 选择题选项序号用大写英文字母(A. B. C. D.)。
科目特例
- 语文:阅读材料用楷体(
{\kaishu ...});作文题用\workarea{20}留足作答空间。 - 英语:题干与选项中的英文走 Times New Roman(模板已设置);写作题用
\workarea留足作答空间。 - 化学:化学方程式/离子式用
\ce{}(需在导言区加\usepackage{mhchem}),如\ce{2H2 + O2 -> 2H2O}。 - 政治/历史/地理:材料题引文用楷体(
{\kaishu ...})。 - 数学/物理/化学/生物:公式一律用数学模式;物理量斜体、单位正体(见排版规则)。
排版与规则
- 题干用 LaTeX 排版,公式、分数、上下标、希腊字母一律用数学模式。
- 有配图的题目:题干在上、配图在下(配图居中,宽 85% 行宽、高不超过页面 30%);无配图则单栏排版。
- 相同题型(选择、填空、解答)连续排列,不要打乱。
- 选择题和填空题之间留一行空格,解答题之间用
\workarea{5}留 5 行供作答。 - 填空题统一用
\underline{\qquad}(或\underline{\hspace{2cm}}指定宽度),禁止使用裸下划线____(会编译报错)。 - 物理量、向量用加粗斜体(
\boldsymbol{});单位用正体\mathrm{}(如 $\mathrm{kg}$、$\mathrm{m/s^{2}}$)。 - 正文中的
% _ & # $等特殊字符必须转义(\% \_ \& \# \$);从文档提取的文本要逐项检查转义。 - 长公式用
aligned/split换行,不允许超出页边。 - 数据表用 booktabs 风格(
\toprule/\midrule/\bottomrule)。
防幻觉红线
- 看不清的字标「?」或「来源未知」,严禁推测、补全或编造内容。
- 只识别图片中真实存在的内容,不自行添加原题没有的信息。
- 题目范围判断不明确时询问用户,不擅自猜测。
资源
assets/gaokao-template.tex:九科规范 LaTeX 模板(A4 单栏、小四宋体、紧凑行距、二号黑体标题、页脚页码、booktabs 表格、Times New Roman 数字字母)。排版时复制它,替换\begin{document}与\end{document}之间的内容。scripts/extract_document.py:文档提取脚本。把 PDF/Word/Markdown/文本 提取为content.txt(全文+[图N]占位符)、pages.txt(轻量索引:页首行、题号/题型标记、类型判断)和images/(嵌入图片)。scripts/render_check.py:把 PDF 每页渲染成 PNG,用于交付前的逐页核对(渲染工具自动回退:pdftoppm → pdf2image → PyMuPDF → sips)。scripts/tighten_crop.py:紧贴内容边界的配图裁剪脚本。视觉模型先给出只含示意图的--region x,y,w,h(支持像素或归一化坐标);脚本保护细线并输出可追溯的--manifestJSON,默认待人工复核。