为了实现档案培训考试准考证的自动化生成与打印,我们将采用 Python 作为核心开发语言,结合 pdfkit 和 wkhtmltopdf 完成HTML到PDF的高保真转换。这套方案的优势在于能够利用 CSS 精准控制排版,完美还原准考证的表格、边框及字体要求,且支持批量处理数据。
pdfkit 依赖于 wkhtmltopdf 这一轻量级命令行工具。请根据你的操作系统直接下载对应的稳定版安装包。不要去官网寻找复杂的路径,直接使用以下链接:
Windows 64位下载地址:https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox-0.12.6.1-2.msvc2015-win64.exe
Linux (CentOS) 安装命令:
sudo yum install -y wkhtmltopdf
注意:Windows 用户安装时必须勾选 "Add directory to PATH" 环境变量配置项,否则后续脚本无法调用。如果忘记勾选,请手动将安装路径(通常为 C:\Program Files\wkhtmltopdf\bin)添加到系统环境变量 Path 中。
在命令行终端中执行以下命令,安装所需的 Python 库。我们使用 jinja2 进行模板渲染,使用 pdfkit 进行文件转换。
pip install pdfkit jinja2
实操的第一步是准备数据。通常考生的信息存储在 Excel 中,为了代码的通用性,我们构建一个 JSON 格式的数据源。在你的项目根目录下创建一个名为 data.json 的文件,并填入以下测试数据。这模拟了从数据库导出的考生列表。
```json
[
{
"name": "张伟",
"id_card": "110101199001011234",
"exam_id": "DA20231001",
"subject": "档案管理基础实务",
"exam_date": "2023-11-15",
"exam_time": "09:00-11:30",
"location": "北京市第一职业技术学校",
"room": "教学楼302室",
"seat": "05"
},
{
"name": "李娜",
"id_card": "320501199205206789",
"exam_id": "DA20231002",
"subject": "档案信息化建设",
"exam_date": "2023-11-15",
"exam_time": "14:00-16:30",
"location": "北京市第一职业技术学校",
"room": "实验楼205室",
"seat": "12"
}
]
```
准考证的排版至关重要。我们将创建一个 HTML 模板文件 template.html,利用 CSS 确保打印出来的效果规范、整齐。该模板使用了 Jinja2 的语法 {{ variable }} 来标记动态插入的数据位置。
在项目根目录下创建 template.html,代码如下:
```html
body {
font-family: "SimSun", "Songti SC", serif; / 使用宋体,确保公文风格 /
margin: 0;
padding: 20px;
background-color: f0f0f0;
}
.ticket {
width: 700px;
margin: 0 auto;
background-color: fff;
padding: 40px;
border: 2px solid 000; / 准考证外边框 /
box-sizing: border-box;
}
.header {
text-align: center;
font-size: 24px;
font-weight: bold;
margin-bottom: 30px;
border-bottom: 2px solid 000;
padding-bottom: 10px;
}
.info-table {
width: 100%;
border-collapse: collapse;
font-size: 16px;
margin-bottom: 20px;
}
.info-table td {
border: 1px solid 000;
padding: 10px;
height: 40px;
}
.label {
background-color: e0e0e0;
font-weight: bold;
width: 120px;
text-align: center;
}
.notice {
margin-top: 30px;
font-size: 14px;
line-height: 1.6;
}
.footer {
margin-top: 40px;
text-align: right;
font-size: 14px;
}
| 姓名 | {{ name }} | 准考证号 | {{ exam_id }} |
| 身份证号 | {{ id_card }} | ||
| 考试科目 | {{ subject }} | ||
| 考试时间 | {{ exam_date }} {{ exam_time }} | ||
| 考试地点 | {{ location }} | ||
| 考场教室 | {{ room }} | 座位号 | {{ seat }} |
考生须知:

1. 考生须携带准考证和有效身份证件提前30分钟入场。
2. 考试开始15分钟后禁止入场。
3. 请将手机等通讯工具关闭后放在指定位置。
4. 保持考场安静,独立完成答卷。
```
这是整个流程的核心部分。我们将编写一个 Python 脚本,它负责读取 JSON 数据,加载 HTML 模板,将数据注入模板,调用 wkhtmltopdf 生成 PDF,并最后调用系统默认打印机进行打印。
在项目根目录下创建 auto_print.py:
```python
import os
import json
import pdfkit
from jinja2 import Template
import subprocess
import platform
配置路径
DATA_FILE = 'data.json'
TEMPLATE_FILE = 'template.html'
OUTPUT_DIR = 'tickets'
确保输出目录存在
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
Windows下配置wkhtmltopdf路径,如果是Linux且已加入PATH则可省略
SYSTEM = platform.system()
if SYSTEM == 'Windows':
请根据实际安装路径修改,或者确保已配置环境变量
如果配置了环境变量,config可以留空,但显式指定更稳健
config = pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')
else:
config = pdfkit.configuration()
def render_template(data):
"""加载HTML模板并注入数据"""
with open(TEMPLATE_FILE, 'r', encoding='utf-8') as f:
template_content = f.read()
template = Template(template_content)
return template.render(data)
def generate_pdf(html_content, filename):
"""将HTML内容转换为PDF文件"""
output_path = os.path.join(OUTPUT_DIR, filename)
options 中的参数是为了优化PDF显示效果
options = {
'encoding': 'UTF-8',
'margin-top': '0',
'margin-bottom': '0',
'margin-left': '0',
'margin-right': '0',
'enable-local-file-access': None 允许访问本地文件(如图片)
}
try:
pdfkit.from_string(html_content, output_path, configuration=config, options=options)
print(f"成功生成: {output_path}")
return output_path
except Exception as e:
print(f"生成PDF失败: {e}")
return None
def print_file(filepath):
"""调用系统默认打印机打印文件"""
if not filepath:
return
abs_path = os.path.abspath(filepath)
if SYSTEM == 'Windows':
Windows下使用默认命令打开并打印
os.startfile(abs_path, "print")
print(f"已发送至打印机: {abs_path}")
elif SYSTEM == 'Linux':
Linux下使用lp命令打印
try:
subprocess.run(['lp', abs_path], check=True)
print(f"已发送至打印机: {abs_path}")
except subprocess.CalledProcessError:
print("打印命令执行失败,请检查 cups 服务")
else:
print("macOS 系统暂未实现自动打印脚本,请手动打开文件打印")
def main():
1. 读取数据
try:
with open(DATA_FILE, 'r', encoding='utf-8') as f:
students = json.load(f)
except FileNotFoundError:
print(f"错误:找不到数据文件 {DATA_FILE}")
return
except json.JSONDecodeError:
print(f"错误:{DATA_FILE} 格式不正确")
return
2. 循环处理每个考生
for student in students:
print(f"正在处理考生: {student['name']}...")
渲染 HTML
html_content = render_template(student)
生成 PDF 文件名
pdf_name = f"{student['name']}_{student['exam_id']}.pdf"
生成 PDF
pdf_path = generate_pdf(html_content, pdf_name)
自动打印 (如果需要自动打印,取消下面这行的注释)
print_file(pdf_path)
print("所有任务处理完毕。")
if __name__ == '__main__':
main()
```
代码编写完成后,直接在终端运行脚本:
python auto_print.py
脚本运行后,你会在项目根目录下看到一个名为 tickets 的新文件夹。打开该文件夹,你应该能看到名为“张伟_DA20231001.pdf”和“李娜_DA20231002.pdf”的文件。
验证步骤:
1. 打开任意生成的 PDF 文件,检查边框是否完整,文字是否居中。
2. 确认身份证号、姓名等动态信息是否正确替换。
3. 确认字体是否为宋体(如果系统无宋体,可能会回退到默认字体,可在 HTML 中调整 font-family)。
如果需要直接连接打印机进行批量打印,请编辑 auto_print.py,找到 print_file(pdf_path) 这一行,删除前面的 符号,保存并再次运行脚本即可。
在实操过程中,可能会遇到以下两个常见问题,请按对应方案解决:
1. OSError: No wkhtmltopdfx executable found
这代表 Python 找不到 wkhtmltopdf 的可执行文件。
C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe 是否与你实际安装位置一致。如果你安装到了 D 盘,必须修改代码中的路径。which wkhtmltopdf 检查是否安装成功,如果未安装,请重新执行安装命令。2. 生成的 PDF 中文显示为乱码或方块
这是典型的字体缺失问题。wkhtmltopdf 在 Linux 服务器上运行时,如果没有安装中文字体,就无法渲染。
sudo yum install -y wqy-zenhei-fonts。安装完成后,在 HTML 模板的 font-family 中优先指定该字体。