背景:当前一些pdf转化为word文档的工具大多数都存在收费的情况。在线免费的也是只能转换pdf文档限制的页数。最常见是WPS工具,虽有免费转换5页的试用资格,但是在遇见PDF文档页数较多的时候,局限性还是比较大的。
内容:python代码转换为Word文档时也存在着文本格式上的局限,导致不能1:1的转换pdf文档。
-
PDF和Word是两种不同格式的文档,其内部结构和表现方式也不同。PDF是一种固定格式的文档,包含了页面布局、字体、图像等信息,而Word是一种可编辑的文档,包含了文字、段落、样式等信息。因此,将PDF转换为与原始PDF完全相同的Word文档是一项非常复杂的任务,可能无法完全保留原始PDF的所有细节和格式。
-
PDF文件中的内容可能具有复杂的结构和布局,例如多列文本、表格、图像等。将这些元素准确地转换到Word中是一项挑战性的任务,特别是对于包含大量格式化和复杂排版的PDF文件。
下面是批量转换PDF文档为Word文档的python代码:
!注意在运行代码之前需要安装python的第三方库
pip install pdf2docx # 将PDF文件转换为Word文档(.docx)格式
pip install PyMuPDF # 用于处理PDF文件的库
pip install python-docx # 创建和操作Microsoft Word文档(.docx格式)
# coding:utf-8
import os
import fitz
from pdf2docx import Converter # 将PDF文件转换为Word文档(.docx)格式
from docx.shared import Pt # 设置字体大小
from docx import Document # 创建和操作Word文档
# pip install pdf2docx
def pdf_docx():
# 获取当前工作目录
file_path = r'E:\ceshi\pdf转word' # 存放你需要转换pdf的文件夹.
# 遍历所有文件
for file in os.listdir(file_path):
# 获取文件后缀
suff_name = os.path.splitext(file)[1]
# 过滤非pdf格式文件
if suff_name != '.pdf':
continue
# 获取文件名称
file_name = os.path.splitext(file)[0]
# pdf文件名称
pdf_name = os.path.join(file_path, file)
# 要转换的docx文件名称
docx_name = os.path.join(file_path, file_name + '.docx')
# 创建一个转换器对象
cv = Converter(pdf_name)
# 将pdf转换为docx并保存
cv.convert(docx_name, start=0, end=None) # start=0表示从第一页开始转换,end=None表示转换所有页
# 关闭转换器对象
cv.close()
# 打开转换后的docx文件
document = Document(docx_name)
# 获取PDF中的字体和大小信息
font_name = get_pdf_font_name(pdf_name) # 替换为获取实际PDF字体名称的函数
font_size = get_pdf_font_size(pdf_name) # 替换为获取实际PDF字体大小的函数
# 修改Word文档中的字体和大小
for paragraph in document.paragraphs:
for run in paragraph.runs:
run.font.name = font_name
run.font.size = Pt(font_size)
# 保存修改后的docx文件
document.save(docx_name)
# 获取PDF字体名称
def get_pdf_font_name(pdf_name):
doc = fitz.open(pdf_name)
page = doc[0]
font_name = page.get_text("fontname") # 使用 get_text 方法来获取页面中的文本
doc.close()
return font_name
# 获取PDF字体大小
def get_pdf_font_size(pdf_name):
doc = fitz.open(pdf_name)
page = doc[0]
text_blocks = page.get_text_blocks()
font_size = None
default_font_size = 18 # 默认字体大小
if len(text_blocks) > 0: # 检查文本块列表的长度是否大于0,以确保至少有一个文本块。
first_block = text_blocks[0]
if len(first_block) > 7:
font_size = first_block[7]
doc.close()
return font_size if font_size is not None else default_font_size # 返回获取到的字体大小,如果没有获取到,则返回默认的字体大小
if __name__ == '__main__':
pdf_docx()
示例图:
源PDF文档截图:
转换后Word文档截图:
说明:虽然此代码能使pdf文档转换为word文档,但pdf中的某些格式和字体样式,可能不能完全相同的转换到word文档,可经过调节Word文档中字体来达到相同的样式