用 PyMuPDF 将 PDF 每页转成 PNG(300 DPI,保证识别精度):
import fitz
import os
pdf_path = r"C:/path/to/textbook.pdf"
output_dir = "pdf_images"
os.makedirs(output_dir, exist_ok=True)
doc = fitz.open(pdf_path)
zoom = 300 / 72
mat = fitz.Matrix(zoom, zoom)
for page_num in range(len(doc)):
page = doc[page_num]
pix = page.get_pixmap(matrix=mat)
out = os.path.join(output_dir, f"page_{page_num+1:03d}.png")
pix.save(out)
print(f"已生成:{out}")
> 输出:pdf_images/page_001.png, page_002.png ...
使用多模态模型(Hy3 等)识别图片中的英文文本。
识别 prompt 中必须包含以下要求(直接复制给模型):
请识别这张图片中的英文课文内容。
严格要求:
1. 【最重要】必须准确识别并保留原文的段落结构!每个段落之间用空行分隔。
2. 不要把多个段落合并成一个段落。
3. 段落内的换行可以保留,但段落之间必须有明确分隔(空一行)。
4. 识别章节标题(如有)。
5. 不要识别页眉、页脚、页码、页码旁边的注释。
输出格式:每个段落之间用空行分隔,便于后续程序处理。
如果识别结果段落仍丢失,需手动根据原文 PDF 视觉分页位置,在文本中插入空行分隔段落,再进行下一步。
从识别文本中剔除:
只保留课文正文(每个章节的标题 + 段落文本)。
分析正文,筛选出对初中生是生词的英文单词:
生词列表去重。
对每个生词,生成以下内容(可用 AI 辅助):
| 字段 | 说明 |
|---|---|
| ------ | ------ |
| 音标 | IPA 国际音标,英式优先 |
| 词性 | 动词必须区分 vi. / vt.;多词性分别列出 |
| 释义 | 中文释义,贴合课文语境 |
| 同源词 | 同根词 + 词性 + 释义(无则省略) |
| 近义词 | 1-3 个 |
HTML 中每行格式(合并在一行,节省空间):
embark /ɪmˈbɑːk/ vi. & vt. 上船;开始做
同源词:embarkation n. 上船;disembark v. 下船
近义词:board, commence, begin
每个 vocab-block = 一小段课文 + 该段对应的生词
vocab-block::before),否则打印时不显示!┌─────────────────┬───┬─────────────────┐
│ 课文正文 │ │ 生词详情 │
│ (text-col) │ 竖线│ (vocab-col) │
│ 每段一个block │ │ 与左侧水平对齐 │
└─────────────────┴───┴─────────────────┘
<div class="main-wrapper">
<div class="vline-div"></div> <!-- 竖线:真实DOM元素,打印可靠 -->
<h2>章节标题</h2>
<!-- 每个 vocab-block = 一段课文 + 对应生词 -->
<div class="vocab-block">
<div class="text-col">
<p>课文段落(生词用 <b> 加粗黑色)</p>
</div>
<div class="vocab-col">
<div class="vline"><span class="vw">word</span> /IPA/ pos. 释义</div>
<div class="vline"><span class="vlabel">同源词:</span>...</div>
<div class="vline"><span class="vlabel">近义词:</span>...</div>
</div>
</div>
</div>
body {
font-family: 'Times New Roman', 'SimSun', serif;
max-width: 800px;
margin:0 auto;
padding: 10px 5px; /* 左右边距缩小 */
line-height:1.6;
}
.main-wrapper {
position: relative;
margin-top: 15pt;
}
.vline-div {
/* 竖线:真实DOM元素,打印时确保显示 */
position: absolute;
left: 50%; top:0; bottom:0;
width:1px; background: #999;
transform: translateX(-50%); z-index:0;
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
.vocab-block {
display: flex; gap: 20px;
margin-bottom: 12pt;
align-items: flex-start;
page-break-inside: avoid; /* 打印时不被分页截断 */
position: relative; z-index:1;
}
.text-col {
flex:1; font-size: 11pt; line-height:1.7;
text-align: left; /* 左对齐(非两端对齐) */
padding-right: 5px; /* 左边距缩小 */
}
.text-col p { margin:0 0 8pt 0; }
.text-col p + p { text-indent: 2em; }
.vocab-col {
flex:1; font-size:9pt; line-height:1.5;
padding-left: 5px; /* 右边距缩小 */
}
.vw { color: #8B0000; font-weight: bold; } /* 生词暗红色加粗 */
.vlabel { color: #666; } /* 标签深灰色 */
@media print {
body { margin:0; padding: 15mm 10mm 20mm 15mm; max-width:100%; }
@page {
size: A4;
margin: 15mm 10mm 20mm 15mm;
@bottom-right {
content: "第 " counter(page) " 页";
font-size: 9pt; color: #666;
}
}
.vline-div { top:0; bottom:0; } /* 打印时竖线全高显示 */
h2 { page-break-after: avoid; }
.vocab-block { page-break-inside: avoid; }
.text-col p { orphans:2; widows:2; }
}
黑色加粗#8B0000 加粗9pt#666#003366,15pt1px 灰色竖线(真实DOM元素,非伪元素)"第 X 页" 是否显示在右下角text-align: left)body { padding: 10px 5px; })Q:图片识别后段落全连在一起?
A:重新识别,在 prompt 中加强调段落结构。若模型不支持,需手动参照 PDF 图片在文本中插入空行。
Q:左右两栏不对齐?
A:确保每个 Q:打印时生词被分页截断? A:CSS 中 Q:打印时中间的竖线不见了? A:必须用真实 DOM 元素画竖线( Q:要不要生成 Word? A:不需要。HTML 直接用浏览器打印,排版更精准,也支持 A4 页码。.vocab-block { page-break-inside: avoid; } 可防止块内分页。.vline-div),不能用伪元素 .main-wrapper::before。浏览器打印时经常忽略伪元素。文件输出
文件 说明 ------ ------ vocab.html最终交付文件,用浏览器打开/打印 pdf_images/*.png中间文件,转完可删除
共 2 个版本