用python语言的pyautogui库实现伪批量将xdf文件打印为pdf文件

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

  1. 准备工具
    • 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")。
  1. 核心逻辑步骤
    • 脚本启动目标阅读器(或已提前打开)。
    • 遍历指定文件夹中的所有 .xdf 文件。
    • 对每个文件,模拟按下 Ctrl + O 打开文件,或通过菜单定位。
    • 模拟按下 Ctrl + P 打开打印对话框。
    • 在打印对话框中,选择"Microsoft Print to PDF"打印机,并点击"打印"或"保存"按钮。
    • 在弹出的保存对话框中,指定PDF输出路径和文件名(通常可以自动生成),并确认保存。
    • 关闭当前文档,循环处理下一个。
  2. 脚本示例与关键代码

这是一个高度简化的示例代码框架,你需要根据自己电脑的屏幕分辨率、软件界面和语言进行调整:

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("批量转换任务全部完成。")
  1. 关键配置与调试建议
    • 这个方案的成功极度依赖界面元素的准确定位,调试是关键:

可以通过windows自带截图工具截取全屏再通过画图工具打开:

再从画图工具的左下角坐标位置信息处获取打印按钮详细位置信息(其他位置信息也以同样方式进行获取):

将获取到的坐标信息替换到我们的代码中。就可以实现xdf文件自动打印为pdfwen文件功能了!

相关推荐
iReachers4 小时前
PDF一机一码加密大师1.1.0更新至2026最新版, 强力加密PDF, 无需额外安装阅读器, 附CSDN下载地址
pdf
七夜zippoe4 小时前
Kubernetes与Python微服务编排实战:从基础部署到自动扩缩容
python·微服务·kubernetes·service·hpa
cyforkk4 小时前
10、Java 基础硬核复习:多线程(并发核心)的核心逻辑与面试考点
java·开发语言·面试
roamingcode4 小时前
Cursor-memory-cli 自动化记忆提取的完整实现
运维·自动化·agent·memory·cursor·持久化记忆
2301_822382764 小时前
嵌入式C++实时内核
开发语言·c++·算法
Max_uuc4 小时前
【C++ 硬核】拒绝单位混淆:利用 Phantom Types (幻影类型) 实现零开销的物理量安全计算
开发语言·c++
idwangzhen4 小时前
GEO优化系统哪家好
python·信息可视化
Remember_9934 小时前
Java 工厂方法模式:解耦对象创建的优雅方案
java·开发语言·python·算法·工厂方法模式
2301_790300964 小时前
C++与物联网开发
开发语言·c++·算法