docx、excel、word转pdf文件
1、docx、doc文件转成pdf
将Word文档转换为PDF格式的Python脚本。使用了comtypes.client库来调用Microsoft Word应用程序进行转换。
主要功能如下:
1. 定义了一个名为get_path的函数,该函数接受一个路径作为参数,并返回该路径下所有以.doc或.docx结尾的文件名列表。
2. 在主程序中,首先创建了一个Word应用程序对象,并将其可见性设置为不可见。
3. 然后指定了要转换的Word文档所在的目录路径。
4. 使用get_path函数获取该目录下的所有Word文档文件名和对应的PDF文件名。
5. 对于每个Word文档,通过调用Word应用程序对象的Documents.Open方法打开文档,然后使用`SaveAS`方法将其保存为PDF格式,最后关闭文档。
6. 如果在转换过程中出现异常,会打印出异常信息。
需要注意的是,运行此代码需要安装comtypes库,并且计算机上必须安装了Microsoft Word应用程序。
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# @File : doc2pdf.py
# @Software: PyCharm
import os
import comtypes.client
def get_path(path):
filename_list = os.listdir(path)
wordname_list = [filename for filename in filename_list if filename.endswith((".doc", ".docx"))]
for wordname in wordname_list:
# 分离word文件名称和后缀,转化为pdf名称
pdfname = os.path.splitext(wordname)[0] + '.pdf'
# 如果当前word文件对应的pdf文件存在,则不转化
if pdfname in filename_list:
continue
wordpath = os.path.join(path, wordname) # word所在目录
pdfpath = os.path.join(path, pdfname) # 存放生成的pdf目录
# 生成器
yield wordpath, pdfpath
if __name__ == '__main__':
word = comtypes.client.CreateObject("Word.Application")
word.Visiable = 0 # 设置可见性,不可见
path = "E:\\docx"
for w, p in get_path(path):
print(w)
try:
newpdf = word.Documents.Open(w)
newpdf.SaveAS(p, FileFormat=17) # 17表示PDF格式
newpdf.Close()
except Exception as e:
print(e)
2、excel文件转pdf
将Excel和Word文档转换为PDF格式的Python脚本。它使用了win32com.client库来调用Microsoft Excel和Word应用程序进行转换。
代码的主要功能如下:
1. 定义了两个函数pdf_xls和pdf_doc,分别用于将Excel文件(.xls和.xlsx)和Word文件(.doc和.docx)转换为PDF格式。
2. pdf_xls函数通过打开Excel应用程序,设置页面参数,然后将Excel文件导出为PDF格式。
3. pdf_doc函数通过打开Word应用程序,设置页面参数,然后将Word文件保存为PDF格式。
4. 在主程序中,指定了要转换的文件路径,并遍历该路径下的所有文件。
5. 对于每个文件,根据文件类型调用相应的转换函数进行处理。
6. 如果转换过程中出现异常,会将错误信息写入名为error_data.txt的文件中。
需要注意的是,运行此代码需要安装pywin32包,并且计算机上必须安装了Microsoft Excel和Word应用程序。
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# @File : excel2pdf.py
# @Software: PyCharm
# -*- coding:utf-8 -*-
import os
import win32api # 需要下载pywin32的包
import win32com.client
def pdf_xls(root, filename, name): # 转换xls和xlsx为pdf的函数
if (filename.find('.xlsx') >= 0): # 文件名有xlsx
pdfname = root + os.sep + filename.replace(".xlsx", ".pdf") # 将文件名变为pdf后缀
else:
pdfname = root + os.sep + filename.replace(".xls", ".pdf") # 将xls文件名转换为pdf后缀
xlApp = win32com.client.Dispatch('Excel.Application') # pywin32包打卡excel
xlApp.Visible = 0 # xls文件不可见
xlApp.DisplayAlerts = 0
books = xlApp.Workbooks.Open(name, False)
for sh in books.Sheets: # 每个表格中设置pagesetup的参数
sh.PageSetup.Orientation = 1 # 设置横向以及纵向
sh.PageSetup.Zoom = False # 设置缩放大小,false说明不以此缩放依据
sh.PageSetup.FitToPagesWide = 1 # 以适应宽度的方式缩放
books.ExportAsFixedFormat(0, pdfname) # 导出pdf文件
books.Close() # 关闭表格
print('保存 PDF 文件:', pdfname)
xlApp.Quit() # 关闭打开excel的进程
def pdf_doc(root, filename, name): # doc以及docx打开pdf文件
if (name.find('.docx') >= 0):
pdfname = root + os.sep + filename.replace(".docx", ".pdf")
else:
pdfname = root + os.sep + filename.replace(".doc", ".pdf")
print(pdfname)
exec_tool = 'kwps.application'
word = win32com.client.DispatchEx(exec_tool)
word.Visible = 0
word.DisplayAlerts = 0
password = '666666' # 文档的打开密码,即使没有密码也可以打开
doc = word.Documents.Open(name, True, False, False, password, password, Visible=False) # 以有文档密码的方式打开doc文档,参数不可以缺省
doc.SaveAs(pdfname, FileFormat=17) # 转换为pdf文件
# doc.ExportAsFixedFormat(0,pdfname)
doc.Close()
word.Quit()
if __name__ == "__main__":
# 输入excel文件的路径
path = "E:\\xlsx"
for root, directories, files in os.walk(path): # 遍历文件目录下的所有文件
n = 0
for fileList in files:
name = root + os.sep + fileList # 文件名
if (name.find('.doc') >= 0):
print(name + "开始执行")
try:
pdf_doc(root, fileList, name)
print(name + "已完成执行")
except Exception as re:
f = open("error_data.txt", "a", encoding='UTF-8')
f.write(str(name) + str(re) + "\n")
f.close()
if name.find('.xls') >= 0:
print(name + "开始执行")
try:
pdf_xls(root, fileList, name)
# root 目录 fileList 文档名称 name 文件加文档名
except Exception as re:
f = open("error_data.txt", "a", encoding='UTF-8')
f.write(name + str(re) + "\n")
f.close()
3、pdf2img:将pdf文件转换成图片
from PIL import Image
import fitz
import os
def fitz_doc_to_image(doc, target_dpi=200, origin_dpi=None) -> dict:
"""Convert fitz.Document to image, Then convert the image to numpy array.
Args:
doc (_type_): pymudoc page
dpi (int, optional): reset the dpi of dpi. Defaults to 200.
Returns:
dict: {'img': numpy array, 'width': width, 'height': height }
"""
from PIL import Image
mat = fitz.Matrix(target_dpi / 72, target_dpi / 72)
pm = doc.get_pixmap(matrix=mat, alpha=False)
if pm.width > 4500 or pm.height > 4500:
mat = fitz.Matrix(72 / 72, 72 / 72) # use fitz default dpi
pm = doc.get_pixmap(matrix=mat, alpha=False)
image = Image.frombytes('RGB', (pm.width, pm.height), pm.samples)
return image
def load_images_from_pdf(pdf_file, dpi=200, start_page_id=0, end_page_id=None) -> list:
images = []
with fitz.open(pdf_file) as doc:
pdf_page_num = doc.page_count
end_page_id = (
end_page_id
if end_page_id is not None and end_page_id >= 0
else pdf_page_num - 1
)
if end_page_id > pdf_page_num - 1:
print('end_page_id is out of range, use images length')
end_page_id = pdf_page_num - 1
for index in range(0, doc.page_count):
if start_page_id <= index <= end_page_id:
page = doc[index]
img = fitz_doc_to_image(page, target_dpi=dpi)
images.append(img)
return images
def save_pdf_to_images(pdf_file, output_dir=None, dpi=200, image_format='jpg', start_page_id=0, end_page_id=None):
"""将PDF文件的每页保存为图像文件
Args:
pdf_file (str): PDF文件路径
output_dir (str, optional): 输出图像的目录,如果为None则在PDF文件同目录创建同名文件夹
dpi (int, optional): 图像DPI,默认为200
image_format (str, optional): 图像格式,默认为'jpg'
start_page_id (int, optional): 开始页码,默认为0
end_page_id (int, optional): 结束页码,默认为None(处理到最后一页)
Returns:
list: 保存的图像文件路径列表
"""
# 确定输出目录
if output_dir is None:
pdf_dir = os.path.dirname(pdf_file)
pdf_name = os.path.splitext(os.path.basename(pdf_file))[0]
output_dir = os.path.join(pdf_dir, f"{pdf_name}")
# 创建输出目录(如果不存在)
os.makedirs(output_dir, exist_ok=True)
# 加载PDF图像
images = load_images_from_pdf(pdf_file, dpi, start_page_id, end_page_id)
# 保存图像
saved_paths = []
for i, img in enumerate(images):
# 计算实际页码(从1开始)
actual_page_num = start_page_id + i + 1
# 保存图像文件
img_path = os.path.join(output_dir, f"page_{actual_page_num}.{image_format.lower()}")
img.save(img_path)
saved_paths.append(img_path)
print(f"已保存第{actual_page_num}页到 {img_path}")
return saved_paths
if __name__ == "__main__":
# 用户可以修改这里的PDF文件路径
pdf_file = r"D:\\4.文档\\paper\\Dianjin-OCR-R1.pdf"
# 调用函数将PDF每页保存为图像
# 可选参数: output_dir=None, dpi=200, image_format='jpg', start_page_id=0, end_page_id=None
saved_files = save_pdf_to_images(pdf_file)
print(f"\nPDF转图像完成,共保存了{len(saved_files)}个图像文件")
print(f"图像文件保存在: {os.path.dirname(saved_files[0]) if saved_files else '未保存任何文件'}")
更多推荐


所有评论(0)