python 自动化从入门到实战-word转为 PDF 文件(4)
工作效率提升50%!这款Python工具让Word转PDF变得超简单
在日常办公中,我们经常需要将Word文档转换为PDF格式。PDF格式不仅能保持文档的原始格式和排版,还能防止内容被随意修改,非常适合正式文件的分享和存档。今天,我将为大家分享一个自制的Python工具,可以轻松实现Word到PDF的一键转换!
一、功能介绍
这个工具的主要功能包括:
- 将Word文档(.docx)一键转换为PDF格式
- 自动识别文档中的标题和正文,保持层级关系
- 智能加载系统中文字体,完美解决中文显示问题
- 支持Windows、macOS和Linux系统
- 代码结构清晰,易于扩展和定制
二、核心技术实现
1. 核心依赖库
这个工具主要使用了两个Python库:
from docx import Document # 用于读取Word文档
from fpdf import FPDF # 用于创建PDF文档
import os
import sys
2. 类设计
工具采用面向对象的设计,通过WordToPDFConverter
类封装所有功能:
class WordToPDFConverter:def __init__(self):# 初始化PDF对象,设置页面大小为A4self.pdf = FPDF('P', 'mm', 'A4')self.pdf.add_page()# 设置中文字体支持 - 自动检测系统字体self.setup_chinese_font()
3. 中文字体智能加载(核心技术点)
中文字体显示是PDF转换中的常见痛点,我们通过自动检测操作系统并加载对应中文字体的方式解决:
def setup_chinese_font(self):"""根据操作系统自动设置中文字体"""font_path = ""font_name = "Chinese"# 根据操作系统选择字体if sys.platform.startswith('win'):# Windows系统 - 尝试使用黑体(ttf格式)font_path = r"C:\Windows\Fonts\simhei.ttf"# 如果黑体不存在,尝试其他常见中文字体if not os.path.exists(font_path):font_path = r"C:\Windows\Fonts\simsun.ttc" # 宋体(尝试ttc格式作为备选)elif sys.platform.startswith('darwin'):# macOS系统 - 尝试使用苹方font_path = r"/System/Library/Fonts/PingFang.ttc"elif sys.platform.startswith('linux'):# Linux系统 - 尝试使用文泉驿微米黑font_path = r"/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"# 如果找到字体文件,添加字体if os.path.exists(font_path):try:self.pdf.add_font(family=font_name, style="", fname=font_path, uni=True)self.pdf.set_font(family=font_name, size=12)print(f"已加载中文字体: {font_path}")except Exception as e:# 如果加载字体失败,使用默认字体并给出提示self.pdf.set_font(family="helvetica", size=12)print(f"加载中文字体失败: {str(e)}")print("将使用默认字体,可能无法正确显示中文")else:# 如果找不到中文字体,使用默认字体并显示警告self.pdf.set_font(family="helvetica", size=12)print("警告:未找到中文字体,可能无法正确显示中文")
4. 文本添加与样式处理
工具支持设置不同的字体大小和粗体效果,以便区分标题和正文:
def add_text(self, text, font_size=None, bold=False):"""添加文本到PDF"""if font_size:self.pdf.set_font('Chinese', size=font_size)# 处理换行for line in text.split('\n'):self.pdf.cell(0, 10, line, ln=1)# 恢复默认字体大小if font_size:self.pdf.set_font('Chinese', size=12)
5. Word转PDF主函数
这是整个工具的核心,负责读取Word文档并转换为PDF:
def convert(self, word_path, pdf_path=None):"""转换Word到PDF主函数"""# 检查文件是否存在if not os.path.exists(word_path):print(f"错误:找不到文件 {word_path}")return# 设置默认PDF路径if not pdf_path:file_name = os.path.splitext(os.path.basename(word_path))[0]pdf_path = f"{file_name}.pdf"try:# 读取Word文档doc = Document(word_path)# 遍历文档中的所有段落for para in doc.paragraphs:# 根据段落样式设置字体大小if 'Heading 1' in para.style.name:self.add_text(para.text, font_size=16, bold=True) # 一级标题elif 'Heading 2' in para.style.name:self.add_text(para.text, font_size=14, bold=True) # 二级标题elif 'Heading 3' in para.style.name:self.add_text(para.text, font_size=13, bold=True) # 三级标题else:# 普通文本self.add_text(para.text)# 保存PDF文件self.pdf.output(pdf_path)print(f"转换成功!PDF已保存至:{pdf_path}")except Exception as e:print(f"转换失败:{str(e)}")
三、使用方法
使用这个工具非常简单,只需要几行代码即可完成转换:
if __name__ == "__main__":# 示例:转换test.docx为PDFconverter = WordToPDFConverter()converter.convert("test.docx")
如果需要指定输出PDF的路径,也可以传入第二个参数:
converter.convert("test.docx", "output_document.pdf")
四、安装与配置
在使用之前,需要安装必要的Python库:
pip install python-docx fpdf
五、常见问题与解决方案
1. 中文字体显示问题
如果PDF中中文显示异常,请检查系统是否安装了相应的中文字体(如Windows的黑体、宋体,macOS的苹方等)。工具会自动尝试加载系统中文字体,但如果您的系统中没有这些字体,可能需要手动安装。
2. 文档格式兼容性
目前工具主要支持.docx格式的Word文档,对于旧版的.doc格式文件,建议先在Word中转换为.docx格式再进行处理。
3. 表格和图片处理
当前版本主要处理文档中的文本内容,如果需要转换包含复杂表格和图片的文档,可能需要进一步扩展功能。
4. 大文件处理
处理大型Word文档时,可能会消耗较多内存和时间,请确保电脑有足够的资源。
六、实用场景
这个工具适用于以下办公场景:
- 报告分享:将Word格式的工作报告、学术论文转换为PDF格式,便于分享和打印
- 合同存档:将重要的合同文档转换为不可编辑的PDF格式进行长期保存
- 简历投递:将Word格式的简历转换为PDF,确保在不同设备上保持一致的排版
- 电子书制作:将Word文档转换为PDF,用于制作简单的电子书
- 批量处理:可以进一步扩展脚本,实现批量文档转换,提高工作效率
七、完整代码
from docx import Document
from fpdf import FPDF
import os
import sysclass WordToPDFConverter:def __init__(self):# 初始化PDF对象,设置页面大小为A4self.pdf = FPDF('P', 'mm', 'A4')self.pdf.add_page()# 设置中文字体支持 - 自动检测系统字体self.setup_chinese_font()def setup_chinese_font(self):"""根据操作系统自动设置中文字体"""font_path = ""font_name = "Chinese"# 根据操作系统选择字体if sys.platform.startswith('win'):# Windows系统 - 尝试使用黑体(ttf格式)font_path = r"C:\Windows\Fonts\simhei.ttf"# 如果黑体不存在,尝试其他常见中文字体if not os.path.exists(font_path):font_path = r"C:\Windows\Fonts\simsun.ttc" # 宋体(尝试ttc格式作为备选)elif sys.platform.startswith('darwin'):# macOS系统 - 尝试使用苹方font_path = r"/System/Library/Fonts/PingFang.ttc"elif sys.platform.startswith('linux'):# Linux系统 - 尝试使用文泉驿微米黑font_path = r"/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"# 如果找到字体文件,添加字体(使用uni=True参数确保以Unicode模式处理)if os.path.exists(font_path):try:self.pdf.add_font(family=font_name, style="", fname=font_path, uni=True)self.pdf.set_font(family=font_name, size=12)print(f"已加载中文字体: {font_path}")except Exception as e:# 如果加载字体失败,使用默认字体self.pdf.set_font(family="helvetica", size=12)print(f"加载中文字体失败: {str(e)}")print("将使用默认字体,可能无法正确显示中文")else:# 如果找不到中文字体,使用默认字体并显示警告self.pdf.set_font(family="helvetica", size=12)print("警告:未找到中文字体,可能无法正确显示中文")def add_text(self, text, font_size=None, bold=False):"""添加文本到PDF"""if font_size:self.pdf.set_font('Chinese', size=font_size)# 处理换行for line in text.split('\n'):self.pdf.cell(0, 10, line, ln=1)# 恢复默认字体大小if font_size:self.pdf.set_font('Chinese', size=12)def convert(self, word_path, pdf_path=None):"""转换Word到PDF主函数"""# 检查文件是否存在if not os.path.exists(word_path):print(f"错误:找不到文件 {word_path}")return# 设置默认PDF路径if not pdf_path:file_name = os.path.splitext(os.path.basename(word_path))[0]pdf_path = f"{file_name}.pdf"try:# 读取Word文档doc = Document(word_path)# 遍历文档中的所有段落for para in doc.paragraphs:# 根据段落样式设置字体大小if 'Heading 1' in para.style.name:self.add_text(para.text, font_size=16, bold=True)elif 'Heading 2' in para.style.name:self.add_text(para.text, font_size=14, bold=True)elif 'Heading 3' in para.style.name:self.add_text(para.text, font_size=13, bold=True)else:# 普通文本self.add_text(para.text)# 保存PDF文件self.pdf.output(pdf_path)print(f"转换成功!PDF已保存至:{pdf_path}")except Exception as e:print(f"转换失败:{str(e)}")if __name__ == "__main__":# 示例:转换test.docx为PDFconverter = WordToPDFConverter()converter.convert("test.docx")
小技巧:如果需要批量转换多个Word文档,可以使用以下代码片段进行扩展:
import os# 批量转换文件夹中的所有Word文档
def batch_convert(folder_path):converter = WordToPDFConverter()# 遍历文件夹中的所有文件for file in os.listdir(folder_path):if file.endswith('.docx'):file_path = os.path.join(folder_path, file)converter.convert(file_path)# 使用示例
batch_convert('./documents') # 替换为你的文档文件夹路径
八、总结
这个Word转PDF工具虽然简单,但非常实用,能够解决日常办公中的实际需求。通过巧妙的中文字体处理和文档结构保持,确保转换后的PDF文件质量。
如果您在使用过程中遇到任何问题或有改进建议,欢迎留言讨论!同时,也欢迎您根据自己的需求进一步扩展这个工具的功能。
希望这个小工具能帮助您提高工作效率,让文档处理变得更加轻松!