这个方案的原理是:用脚本自动控制一个能打开XDF文件的阅读器(如稻壳阅读器),并模拟人工操作"打印"为PDF的过程。这能实现"伪批量"处理。
- 准备工具 :
- Python环境:确保已安装Python。

-
- 安装库 :
在命令行执行 pip install pyautogui opencv-python pillow 来安装主要依赖。
如果文件有对应的中文汉字还需要执行pip install pyperclip安装剪贴板相关依赖。
- 安装库 :
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| C:\Users\pc>pip install pyautogui opencv-python pillow Collecting pyautogui Downloading PyAutoGUI-0.9.54.tar.gz (61 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Collecting opencv-python Downloading opencv_python-4.13.0.90-cp37-abi3-win_amd64.whl.metadata (20 kB) Requirement already satisfied: pillow in c:\users\pc\appdata\local\programs\python\python313\lib\site-packages (12.0.0) Collecting pymsgbox (from pyautogui) Downloading pymsgbox-2.0.1-py3-none-any.whl.metadata (4.4 kB) Collecting pytweening>=1.0.4 (from pyautogui) Downloading pytweening-1.2.0.tar.gz (171 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Collecting pyscreeze>=0.1.21 (from pyautogui) Downloading pyscreeze-1.0.1.tar.gz (27 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Collecting pygetwindow>=0.0.5 (from pyautogui) Downloading PyGetWindow-0.0.9.tar.gz (9.7 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Collecting mouseinfo (from pyautogui) Downloading MouseInfo-0.1.3.tar.gz (10 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Requirement already satisfied: numpy>=2 in c:\users\pc\appdata\local\programs\python\python313\lib\site-packages (from opencv-python) (2.3.3) Collecting pyrect (from pygetwindow>=0.0.5->pyautogui) Downloading PyRect-0.2.0.tar.gz (17 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Collecting pyperclip (from mouseinfo->pyautogui) Downloading pyperclip-1.11.0-py3-none-any.whl.metadata (2.4 kB) Downloading opencv_python-4.13.0.90-cp37-abi3-win_amd64.whl (40.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.2/40.2 MB 10.4 MB/s 0:00:03 Downloading pymsgbox-2.0.1-py3-none-any.whl (10.0 kB) Downloading pyperclip-1.11.0-py3-none-any.whl (11 kB) Building wheels for collected packages: pyautogui, pygetwindow, pyscreeze, pytweening, mouseinfo, pyrect Building wheel for pyautogui (pyproject.toml) ... done Created wheel for pyautogui: filename=pyautogui-0.9.54-py3-none-any.whl size=37706 sha256=bf490d4fe988c3516a2803506c7e7812e3a559109483bd09fd846790fb80f311 Stored in directory: c:\users\pc\appdata\local\pip\cache\wheels\9c\22\e7\c97f656d0790ef69feae4fcc7bbc1fc648f1b37879f52e7480 Building wheel for pygetwindow (pyproject.toml) ... done Created wheel for pygetwindow: filename=pygetwindow-0.0.9-py3-none-any.whl size=11136 sha256=c3bb059e336065d55c37a0e0c5b2220cf5dbca3e8cc890b901aec1e4066c4122 Stored in directory: c:\users\pc\appdata\local\pip\cache\wheels\87\94\20\4e4ddd07e7276e44a38ac39d5b6c919d38ef27b9ebc5041e0f Building wheel for pyscreeze (pyproject.toml) ... done Created wheel for pyscreeze: filename=pyscreeze-1.0.1-py3-none-any.whl size=14481 sha256=410f54d64e6690d6df7fd4c90ef1891e3d39c6276adff0a06bf49fa8c345c2be Stored in directory: c:\users\pc\appdata\local\pip\cache\wheels\1c\6e\d7\0acfbc5116e11006753649efc7cb40bb9df98990798a21960d Building wheel for pytweening (pyproject.toml) ... done Created wheel for pytweening: filename=pytweening-1.2.0-py3-none-any.whl size=8134 sha256=3654b938e12e8569157e89b3a1e23c621e4f5c15159d86cbb79560af7d243b1b Stored in directory: c:\users\pc\appdata\local\pip\cache\wheels\e7\89\f5\71248cbe0cc120d985c1976f8f2f31675069644c23ff03abfc Building wheel for mouseinfo (pyproject.toml) ... done Created wheel for mouseinfo: filename=mouseinfo-0.1.3-py3-none-any.whl size=10967 sha256=59ac013ca0c12d8bab9cb0b045bc7200bfcaccf18bf21a8737f0971322f14960 Stored in directory: c:\users\pc\appdata\local\pip\cache\wheels\61\5c\24\7d8ed078555f30e8f23fbc97f6361242a2cb4437ddd0384389 Building wheel for pyrect (pyproject.toml) ... done Created wheel for pyrect: filename=pyrect-0.2.0-py2.py3-none-any.whl size=11307 sha256=28dd54219e76dfa95d18614e271b88983c764fa33d08fc08e46fb88d615bbc02 Stored in directory: c:\users\pc\appdata\local\pip\cache\wheels\1e\84\e3\83782b4a92f3d4d5b7fff5c36bf8c31922719e0695ee854cf0 Successfully built pyautogui pygetwindow pyscreeze pytweening mouseinfo pyrect Installing collected packages: pytweening, pyscreeze, pyrect, pyperclip, pymsgbox, pygetwindow, opencv-python, mouseinfo, pyautogui Successfully installed mouseinfo-0.1.3 opencv-python-4.13.0.90 pyautogui-0.9.54 pygetwindow-0.0.9 pymsgbox-2.0.1 pyperclip-1.11.0 pyrect-0.2.0 pyscreeze-1.0.1 pytweening-1.2.0 [notice] A new release of pip is available: 25.2 -> 26.0 [notice] To update, run: python.exe -m pip install --upgrade pip C:\Users\pc> C:\Users\pc> C:\Users\pc>pip install pyperclip Requirement already satisfied: pyperclip in c:\users\pc\appdata\local\programs\python\python313\lib\site-packages (1.11.0) [notice] A new release of pip is available: 25.2 -> 26.0 [notice] To update, run: python.exe -m pip install --upgrade pip C:\Users\pc> |
-
- 目标软件 :安装一个能稳定打开XDF文件的免费软件,例如 稻壳阅读器。请提前打开并熟悉其"打印"对话框的各个按钮位置。
- 虚拟打印机:确保系统已安装虚拟PDF打印机(如"Microsoft Print to PDF")。
- 核心逻辑步骤 :
- 脚本启动目标阅读器(或已提前打开)。
- 遍历指定文件夹中的所有 .xdf 文件。
- 对每个文件,模拟按下 Ctrl + O 打开文件,或通过菜单定位。
- 模拟按下 Ctrl + P 打开打印对话框。
- 在打印对话框中,选择"Microsoft Print to PDF"打印机,并点击"打印"或"保存"按钮。
- 在弹出的保存对话框中,指定PDF输出路径和文件名(通常可以自动生成),并确认保存。
- 关闭当前文档,循环处理下一个。
- 脚本示例与关键代码
这是一个高度简化的示例代码框架,你需要根据自己电脑的屏幕分辨率、软件界面和语言进行调整:
python
# -*- coding: utf-8 -*-
import pyautogui
import pyperclip
import time
import os
import sys
# --- 新增:尝试修复IDLE环境下的标准输出编码,确保打印正常 ---
try:
sys.stdout.reconfigure(encoding='utf-8')
except AttributeError:
# 对于旧版Python,尝试其他方法
pass
# 安全设置:鼠标移动到屏幕左上角会终止脚本
pyautogui.FAILSAFE = True
# 等待时间,根据软件响应速度调整
SHORT_WAIT = 1
LONG_WAIT = 2
def convert_xdf_to_pdf(xdf_file_path, pdffilename):
"""
模拟操作,转换单个XDF文件
"""
print("xdf_file_path:" + xdf_file_path)
try:
# 1. 模拟打开文件 (Ctrl+O)
pyautogui.hotkey('ctrl', 'o')
time.sleep(LONG_WAIT)
# 输入文件路径并回车
# 路径应已是正确字符串,直接写入
# pyautogui.write(xdf_file_path)
# 替换 pyautogui.write(xdf_file_path)
pyperclip.copy(xdf_file_path) # 将完整路径复制到剪贴板
pyautogui.hotkey('ctrl', 'v') # 模拟键盘 Ctrl+V 粘贴
time.sleep(0.5) # 给粘贴操作一点时间
pyautogui.press('enter')
time.sleep(LONG_WAIT) # 等待文件加载
# 2. 模拟打印 (Ctrl+P)
pyautogui.hotkey('ctrl', 'p')
time.sleep(LONG_WAIT)
# 4. 点击"打印"按钮 (坐标需根据你的屏幕调整)
PRINT_BUTTON_POS = (995, 793)
pyautogui.click(PRINT_BUTTON_POS)
time.sleep(LONG_WAIT) # 等待保存对话框弹出
# 5. 在保存对话框中处理
# 先清除默认文件名(全选),再输入新文件名
pyautogui.hotkey('ctrl', 'a')
time.sleep(0.5)
# pyautogui.write(pdffilename)
pyperclip.copy(pdffilename) # 将完整路径复制到剪贴板
pyautogui.hotkey('ctrl', 'v') # 模拟键盘 Ctrl+V 粘贴
time.sleep(0.5) # 给粘贴操作一点时间
# 点击"保存"按钮 (坐标需根据你的屏幕调整)
SAVE_BUTTON_POS = (873, 558)
pyautogui.click(SAVE_BUTTON_POS)
time.sleep(LONG_WAIT) # 等待保存完成
pyautogui.hotkey('ctrl', 'w') # 发送关闭当前文档的快捷键
time.sleep(SHORT_WAIT) # 等待关闭动作完成
print(f"转换成功: {os.path.basename(xdf_file_path)}")
return True
except Exception as e:
print(f"转换失败 {xdf_file_path}: {e}")
return False
# 主程序:遍历文件夹
xdf_folder = r"E:\src\xdf" # 替换为你的XDF文件夹路径
output_folder = r"E:\src\pdf" # 替换为PDF输出文件夹
# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)
# 启动前给用户时间切换窗口
print("5秒后开始,请确保稻壳阅读器窗口在前台...")
time.sleep(5)
# --- 关键修改:正确处理中文文件名 ---
# 方法:使用 listdir 的原始字节模式,然后手动解码
for filename_bytes in os.listdir(xdf_folder.encode('utf-8', 'surrogateescape')):
# 将字节文件名解码为字符串,使用文件系统编码
filename = os.fsdecode(filename_bytes)
if filename.lower().endswith('.xdf'):
# 拼接路径,使用Unicode字符串
full_path = os.path.join(xdf_folder, filename)
# 生成PDF文件名(保持原中文名,仅改后缀)
pdf_basename = os.path.splitext(filename)[0] + '.pdf'
pdffilename = os.path.join(output_folder, pdf_basename)
print(f"准备处理: {filename} -> {pdf_basename}")
convert_xdf_to_pdf(full_path, pdffilename)
# 每个文件处理后稍作停顿
time.sleep(2)
print("批量转换任务全部完成。")
- 关键配置与调试建议
- 这个方案的成功极度依赖界面元素的准确定位,调试是关键:
可以通过windows自带截图工具截取全屏再通过画图工具打开:

再从画图工具的左下角坐标位置信息处获取打印按钮详细位置信息(其他位置信息也以同样方式进行获取):
将获取到的坐标信息替换到我们的代码中。就可以实现xdf文件自动打印为pdfwen文件功能了!