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 '未保存任何文件'}")

更多推荐