ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

30秒用Python实现PDF转Word:TaoToken统一Key接入与PyInstaller打包实测

30秒用Python实现PDF转Word:TaoToken统一Key接入与PyInstaller打包实测 1. 为什么我要自己写一个 PDF 转 Word 脚本PDF 转 Word 这件事看起来简单真到用的时候处处是坑。WPS 的 PDF 转 Word 要开会员在线转换网站要么限制页数要么转完给你加一页广告水印公司内部文档还不敢往陌生站点上传。我平时写技术文档、整理合同、处理论文PDF 转 Word 是高频需求与其每次求人开会员不如自己写个脚本双击就能用。这个脚本的核心思路很直接用 Python 读取 PDF 内容调用大模型接口把内容整理成 Word 能识别的结构化文本再用 python-docx 生成 .docx 文件。难点不在代码本身而在接口调用——你得有一个稳定、便宜、不用折腾账号的 API 通道。我试过好几家最后固定在 TaoToken 上一个 Key 就能调通多个模型不用来回换配置。这篇文章我会带你走完整条链路在 PyCharm 里配好 TaoToken 的统一 Key写一个能跑的 PDF 转 Word 脚本处理几个常见的报错最后用 PyInstaller 打包成 exe发给同事也能直接用。全程代码可复制配置片段可照抄30 秒跑通不是夸张说法——前提是你把环境准备好。适合谁看会一点 Python 基础、用过 PyCharm、想给自己或团队做个内部小工具的人。不需要你懂大模型原理也不需要你研究 PDF 解析算法跟着步骤走就行。先说清楚一件事PDF 转 Word 的准确率取决于 PDF 本身的结构。纯文本 PDF 转出来效果最好扫描件需要先 OCR复杂排版的表格会有错位。这个脚本解决的是「快速拿到可编辑的 Word 初稿」不是「像素级还原排版」。心态摆正用起来会很舒服。2. TaoToken 统一 Key 接入PyCharm 里的前置配置在写代码之前先把 API 通道配好。TaoToken 的定位是统一 Key 接入多个模型你不需要为每个模型单独注册账号、单独充值、单独记 Key。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台生成一个 API Key后面所有调用都用它。PyCharm 这边要做两件事一是装依赖二是把 Key 和 Base URL 配到环境变量或配置文件里。我推荐用.env文件管理方便切换也避免把 Key 硬编码进代码提交到 Git。先建项目。打开 PyCharm新建一个 Pure Python 项目解释器选 3.9 以上。然后在项目根目录建一个requirements.txt内容如下openai1.30.0 pypdf4.2.0 python-docx1.1.0 python-dotenv1.0.1 pyinstaller6.6.0在 PyCharm 底部的 Terminal 里执行pip install -r requirements.txt装完之后在项目根目录建一个.env文件写入你的配置TAOTOKEN_API_KEYsk-你的Key粘贴在这里 TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODELclaude-3-5-sonnet-20241022这里三个变量分别对应Key、API 地址、模型 ID。Base URL 用https://taotoken.net/api不要加多余的路径。模型 ID 按你控制台里可用的填我常用 Claude 系列做文本整理效果稳。注意.env文件不要提交到 Git。在项目根目录建.gitignore加一行.env就行。如果你习惯用 PyCharm 的 Run Configuration 配环境变量也可以Run → Edit Configurations → Environment variables把上面三个键值对填进去。两种方式选一种别重复配否则排查起来容易乱。Key 的获取路径登录后进控制台找到 API Keys 页面新建一个 Key复制出来。这个 Key 只在创建时完整显示一次记得存好。如果你后面要做长期编码或 Agent 类任务可以了解下 Coding Plan按量或包月都有比单次调用划算。配置完成后写个最小验证脚本check_key.pyimport os from dotenv import load_dotenv from openai import OpenAI load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), ) resp client.chat.completions.create( modelos.getenv(TAOTOKEN_MODEL), messages[{role: user, content: 回复两个字通了}], ) print(resp.choices[0].message.content)跑一下输出「通了」就说明 Key 和通道都没问题。这一步别跳过后面所有报错排查都以这个为基准。3. 可复制配置PDF 转 Word 脚本完整代码配置通了开始写主脚本。整个流程分四步读 PDF 文本、调模型整理、生成 Word、保存文件。我把代码拆成函数方便你改。先建main.pyimport os import sys from dotenv import load_dotenv from openai import OpenAI from pypdf import PdfReader from docx import Document load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), ) MODEL os.getenv(TAOTOKEN_MODEL) def extract_pdf_text(pdf_path: str) - str: reader PdfReader(pdf_path) pages [] for i, page in enumerate(reader.pages): text page.extract_text() or pages.append(f【第{i1}页】\n{text}) return \n\n.join(pages) def polish_to_word_text(raw_text: str) - str: prompt ( 下面是从 PDF 提取的原始文本可能有断行、乱序、多余空格。 请整理成结构清晰的正文保留段落和标题层级 不要添加原文没有的内容直接输出整理后的文本。\n\n f{raw_text} ) resp client.chat.completions.create( modelMODEL, messages[{role: user, content: prompt}], temperature0.2, ) return resp.choices[0].message.content def save_docx(text: str, out_path: str): doc Document() for line in text.split(\n): line line.strip() if not line: continue if line.startswith(#): doc.add_heading(line.lstrip(# ).strip(), level1) else: doc.add_paragraph(line) doc.save(out_path) def convert(pdf_path: str): if not os.path.isfile(pdf_path): print(f文件不存在{pdf_path}) return print(正在读取 PDF...) raw extract_pdf_text(pdf_path) print(f提取到 {len(raw)} 个字符正在调用模型整理...) polished polish_to_word_text(raw) out_path os.path.splitext(pdf_path)[0] .docx save_docx(polished, out_path) print(f转换完成{out_path}) if __name__ __main__: if len(sys.argv) 2: print(用法python main.py 你的文件.pdf) sys.exit(1) convert(sys.argv[1])几个关键点说明一下。extract_pdf_text用 pypdf 逐页提取加页码标记是为了让模型知道内容边界整理时不会把两页内容混在一起。polish_to_word_text里 temperature 设 0.2降低随机性保证输出稳定。save_docx简单处理了#开头的标题其余按段落写入。如果你想要图形界面把入口改成 tkinter 文件选择框import tkinter as tk from tkinter import filedialog def pick_and_convert(): root tk.Tk() root.withdraw() path filedialog.askopenfilename(filetypes[(PDF, *.pdf)]) if path: convert(path) if __name__ __main__: pick_and_convert()这样双击运行就弹选择框不用敲命令行。打包 exe 时用这个入口更友好。依赖清单再确认一遍openai、pypdf、python-docx、python-dotenv、pyinstaller。缺哪个补哪个版本别锁太死用就行。4. 验证请求跑通第一个 PDF 转 Word代码写完拿一个真实 PDF 测。我准备了一份 8 页的技术文档纯文本带小标题没有复杂表格。在 PyCharm Terminal 里执行python main.py ./test.pdf预期输出正在读取 PDF... 提取到 12480 个字符正在调用模型整理... 转换完成./test.docx打开生成的 test.docx检查三件事段落是否完整、标题层级是否保留、有没有明显的内容丢失。我实测下来纯文本 PDF 的还原度在 90% 以上个别断行需要手动调但整体可编辑比重新打字快太多。如果你想在代码里加个成功校验可以在convert末尾加from docx import Document d Document(out_path) print(f生成段落数{len(d.paragraphs)})段落数为 0 说明模型返回空或保存失败需要排查。再测一个带表格的 PDF。表格类内容模型整理时容易丢结构建议在 prompt 里加一句「表格内容用 Markdown 表格输出」然后在save_docx里识别|开头的行转成 Word 表格。这部分代码稍复杂先保证纯文本跑通再逐步加。验证阶段还要确认一件事Key 的额度是否够用。8 页文档大概消耗几千 token具体看模型。在控制台能看到用量明细。如果只是偶尔用按量付费足够如果每天批量转考虑 Coding Plan 更省心。跑通之后你可以把脚本改成批量模式遍历一个文件夹里所有 PDFimport glob for f in glob.glob(./docs/*.pdf): convert(f)这样一次处理一批效率翻倍。5. 常见报错排查401、local proxy failed、reading choices这一步是重点我踩过的坑基本都在这。按报错类型对照排查。401 Unauthorized。最常见Key 不对或没读到。先确认.env里TAOTOKEN_API_KEY没有多余空格和引号。再确认load_dotenv()在OpenAI()之前执行。如果用了 PyCharm 的 Run Configuration 环境变量检查有没有和.env冲突。还有一种情况Key 复制时漏了尾部字符重新生成一个再试。local proxy failed / connection error。这类报错通常是网络层问题。先确认TAOTOKEN_BASE_URL写的是https://taotoken.net/api没有多余斜杠或路径。再检查本机有没有设置奇怪的系统代理如果有在代码里显式指定import httpx client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), http_clienthttpx.Client(timeout60.0), )超时设长一点大文档整理需要时间默认超时容易断。reading choices / KeyError: choices。说明返回结构不对通常是模型 ID 写错或者接口返回了错误信息但代码直接取choices。加个防御data resp.model_dump() if choices not in data: print(返回异常, data) return return data[choices][0][message][content]这样能看到真实错误而不是被 KeyError 掩盖。OAuth / authentication 相关报错。如果你之前配过其他工具的认证信息可能和当前环境冲突。检查系统环境变量里有没有残留的OPENAI_API_KEY之类有的话清掉或者在本项目里显式覆盖。PyInstaller 打包后报错找不到模块。打包时加--hidden-importpyinstaller --onefile --hidden-importopenai --hidden-importpypdf --hidden-importdocx main.py打包后 exe 和.env放同一目录否则读不到配置。或者把配置写进代码常量但那样不灵活不推荐。排查顺序建议先跑check_key.py确认通道通再跑main.py确认逻辑通最后打包确认分发通。一层层来别跳步。6. 打包分发与后续接入建议脚本跑通后用 PyInstaller 打包成 exe同事拿到就能用不用装 Python。命令pyinstaller --onefile --windowed --name PDF2Word main.py--windowed去掉黑框适合图形界面版本。打包完成后exe 在dist/目录下。把 exe 和.env放一起双击运行。如果想让 exe 更独立可以把配置写进一个config.json用代码读取避免.env被误删。但 Key 写在文件里有泄露风险内部小工具问题不大对外分发要谨慎。后续想扩展几个方向加 OCR 处理扫描件、加批量队列、加转换进度条。接口层面如果你要做更复杂的 Agent 任务比如自动整理一批文档并生成摘要可以看看 Coding Plan按任务量选套餐更划算。模型对话页面也能直接测试不同模型对同一份 PDF 的整理效果找到最适合你文档类型的那一个。接入文档里有各语言的调用示例遇到参数不确定的时候翻一下。API Keys 页面管理你的 Key定期轮换更安全。最后说个实用技巧转换前先用 pypdf 检查 PDF 是否加密加密的先解密再转否则提取出来是空文本。加一行判断if reader.is_encrypted: reader.decrypt()空密码能解的就解解不了的手动处理。这个坑我踩过排查半天以为是接口问题结果是 PDF 本身加密。工具做出来是给自己省时间的别追求一步到位。先跑通纯文本再逐步加表格、加 OCR、加界面。每加一个功能测一次稳扎稳打。
返回列表