如何使用Python实现PDF与docx、文本、JPG格式的互相转换
Python多格式转换功能模块实现方案
核心依赖库选型
按不同转换场景选择成熟稳定的第三方库即可实现需求,不需要从零开发解析逻辑:
- 文档类转换依赖
- PDF转TXT:优先选
pdfplumber,比传统的PyPDF2文本提取准确率更高,能保留基本的段落排版,不会出现文字乱序问题 - PDF转DOCX:直接用
pdf2docx,专门针对PDF转Word场景开发,支持保留原文件的表格、图片、段落格式、字体样式 - DOCX转PDF:跨平台场景用
python-docx搭配reportlab实现,Windows本地部署可以直接用docx2pdf封装库,调用系统Word组件转换,格式还原度更高 - TXT转PDF:用轻量的
fpdf2或者功能更全的reportlab,支持自定义字体、行间距、页边距等排版参数
- PDF转TXT:优先选
- 图片类转换依赖
- PDF转JPG:用
PyMuPDF(别名fitz),PDF渲染效率高,支持自定义导出DPI调整清晰度,单页转换速度远高于其他同类库 - JPG转PDF:用
Pillow即可实现,支持单张或者多张图片合并导出为单个PDF文件
- PDF转JPG:用
核心功能代码示例
所有功能都可以封装为独立函数调用,以下是最简实现逻辑:
PDF转DOCX
from pdf2docx import Converter def pdf_to_docx(input_pdf: str, output_docx: str, page_range: tuple = (0, None)) -> None: # page_range 传入(起始页码, 结束页码),默认转换全部页,页码从0开始计数 cv = Converter(input_pdf) cv.convert(output_docx, start=page_range[0], end=page_range[1]) cv.close()
PDF转TXT
import pdfplumber def pdf_to_txt(input_pdf: str, output_txt: str) -> None: with pdfplumber.open(input_pdf) as pdf, open(output_txt, "w", encoding="utf-8") as f: for page in pdf.pages: page_text = page.extract_text() if page_text: f.write(page_text + "\f") # 用换页符分隔不同页面内容
DOCX转PDF
# 该实现仅Windows环境可用,需提前安装Office from docx2pdf import convert def docx_to_pdf(input_docx: str, output_pdf: str) -> None: convert(input_docx, output_pdf)
TXT转PDF
from fpdf import FPDF def txt_to_pdf(input_txt: str, output_pdf: str) -> None: pdf = FPDF() pdf.add_page() # 需提前放置对应字体文件解决中文显示问题 pdf.add_font("SimSun", "", "simsun.ttc", uni=True) pdf.set_font("SimSun", size=12) with open(input_txt, "r", encoding="utf-8") as f: for line in f: pdf.cell(200, 10, txt=line.strip(), ln=True, align='L') pdf.output(output_pdf)
PDF转JPG
import fitz def pdf_to_jpg(input_pdf: str, output_dir: str, dpi: int = 300) -> None: doc = fitz.open(input_pdf) zoom = dpi / 72 matrix = fitz.Matrix(zoom, zoom) for page_num in range(len(doc)): page = doc.load_page(page_num) pix = page.get_pixmap(matrix=matrix) pix.save(f"{output_dir}/page_{page_num + 1}.jpg")
JPG转PDF
from PIL import Image def jpg_to_pdf(input_jpg_list: list, output_pdf: str) -> None: # input_jpg_list 传入待转换的jpg文件路径列表,按顺序合并为PDF img_list = [] first_img = Image.open(input_jpg_list[0]).convert("RGB") for jpg_path in input_jpg_list[1:]: img = Image.open(jpg_path).convert("RGB") img_list.append(img) first_img.save(output_pdf, save_all=True, append_images=img_list)
注意事项
- 处理加密PDF时,所有涉及读取PDF的库都支持传入password参数打开加密文件,可提前加解密判断逻辑
- 如果需要处理扫描版PDF的转文本/转Word需求,需要额外接入OCR能力,可以搭配
pytesseract实现文字识别 - 大文件转换时建议添加进度回调和异常捕获,避免单文件转换失败中断整个任务
- 跨平台部署时避免依赖系统组件的方案,比如DOCX转PDF优先用
python-docx+reportlab的纯Python实现方案,不要用win32com相关依赖
内容的提问来源于stack exchange,提问作者Ziead Shab Kalieh
相关产品推荐
相关产品推荐

