python实现pdf转word和excel的示例代码

2025-01-22 16:50

本文主要是介绍python实现pdf转word和excel的示例代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价...

一、引言

在办公中,我们经常遇收到pdf文件格式,因为pdf格式文件不易修改,当我们需要编辑这些pdf文件时,经常需要开通会员或收费功能才能使用编辑功能。今天,我要和大家分享的,是如何使用python编程实现,将PDF文件轻松转换成Word和Excel格式,让编辑变得轻而易举。

二、python编程

要将PDF转换为Word,我们需要解析PDF的布局和内容,并将其重新格式化为Word文档。这涉及到复杂的文本识别和格式转换技术。

使用过如下几个库:最好的还是pdf2docx。

(一)、使用 pdf2docx 库
(二)、使用 PyMuPDF 库
(三)、使用 pdfplumber 库
(四)、使用 PyPDF2 和 python-docx 库

重点:pdf2docx 是一个将 PDF 文件转换为 DOCX 文件的 Python 库。

pip install pdf2docx -i https://mirrors.aliyun.com/pypi/simple

更换PIP源
  PIP源在国外,速度慢,可以更换为国内源,以下是国内一些常用的PIP源。

豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

1,PDF转Word

from pdf2docx import Converter

# pdf转word方法
def pdf_to_word(pdf_path, word_path=None, page_nums=None):
    '''
    @方法名称: pdf转word
    @中文注释: pdf转word
    @入参:
        @param pdf_path str pdf文件路径
        @param page_nums str 页码序号
    @出参:
        @返回状态:
            @return 0 失败或异常
            @return 1 成功
        @返回错误码
        @返回错误信息
        @param doc_file str word文件名
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2024-12-17
    @使用范例: pdf_to_word('test.pdf')
    '''
    global cv
    result_dict = {}
    try:
        if not type(pdf_path) is str:
            result_dict["error_code"] = "111111"
            result_dict["error_msg"] = "pdf文件路径参数类型错误,不为字符串"
            return result_dict
        # 检查PDF文件是否存在
        if not os.path.isfile(pdf_path):
            result_dict["error_code"] = "999999"
            result_dict["error_msg"] = f"PDF文件未找到: {pdf_path}"
            return result_dict

        start_time = time.time()

        if not word_path:
            # 使用os.path.basename()获取文件名
            file_path = os.path.dirname(pdf_path)
            # 使用os.path.basename()获取文件名
            file_name = os.path.basename(pdf_path)
            # 提取文件名,去除文件后缀
            file_name = file_name.split('.')[0]
            # print(file_name)
            # word文件名+路径
            word_path = os.path.join(file_path, f'{file_name}.docx')
            # print(word_path)

        # 初始化转换器
        cv = Converter(pdf_path)
        # 转换整本PDF或指定页码
        if page_nums:
            # 解析页码参数
            pages = []
            for part in page_nums.split(','):
                if '-' in part:
                    start, end = part.split('-')
                    pages.extend(range(int(start) - 1, int(end)))
                else:
                    pages.append(int(part) - 1)
            # 转换指定页码
            cv.convert(docx_filename=word_path, pages=pages)
        else:
            # 转换整本PDF
            cv.convert(docx_filename=word_path, start=0)

        # 保存为Word文档
        cv.close()

        # 识别时间
        end_time = time.time()
        # 计算耗时差,单位毫秒
        recognize_time = (end_time - start_time) * 1000
        # 保留2位小数
        recognize_time = round(recognize_time, 2)
        # print('处理时间:' + str(recognize_time) + '毫秒')
        result_dict["recognize_time"] = recognize_time
        result_dict["error_code"] = "000000"
        result_dict["error_msg"] = "pdf转word成功"
        # 使用os.path.basename()获取文件名
        word_file_name = os.path.basename(word_path)
        # 打印结果
        # print("文件名:", word_file_name)
        result_dict["filename"] = word_file_name

        result_dict["file_size_mb"] = file_size_mb

        return result_dict

    except Exception as e:
        cv.close()
        print("pdf转word异常," + str(e))
        result_dict["error_code"] = "999999"
        result_dicdchQct["error_msg"] = "PDF到Word转换过程中发生错误," + str(e)
        return result_dict

2,PDF转Excel

要将PDF转换为Excel,目前没有现成的转换库,需要稍加处理下。

使用过如下几个库:

(一)、使用 pdf2docx 库 和 docx 库 和 pandas 库

先将pdf转成word文档,然后读取word文档中的表格内容,然后再转成excel文档。 

pip install python-docx -i https://mirrors.aliyun.com/pypi/simple

pip install pandas -i https://mirrors.aliyun.com/pypi/simple

from docx import Document
import pandas as pd
'''
不擅长编程的用户,可以选择我的免费工具箱,开箱即用,方便快捷。
print("搜/索/wei/xin/小/程/序:  全能科技工具箱")
'''
# pdf转excel方法
def pdf_to_excel(pdf_path, xlsx_path=None, page_nums=None):
    '''
    @方法名称: pdf转excel
    @中文注释: pdf转excel
    @入参:
        @param pdf_path str pdf文件路径
        @param page_nums str 页码序号
    @出参:
        @返回状态:
            @return 0 失败或异常
            @return 1 成功
        @返回错误码
        @返回错误信息
        @param xlsx_file str excel文件名
    @作  php  者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2025-01-06
    @使用范例: pdf_to_excel('test.pdf')
    '''
    global cv
    result_dict = {}
    try:
        if not type(pdf_path) is str:
            result_dict["error_code"] = "111111"
            result_dict["error_msg"] = "pdf文件路径参数类型错误,不为字符串"
            return result_dict
        # 检查PDF文件是否存在
        if not os.path.isfile(pdf_path):
            result_dict["error_code"] = "999999"
            result_dict["error_msg"] = f"PDF文件未找到: {pdf_path}"
            return result_dict

        start_time = time.time()

        # 使用os.path.basename()获取文件名
        file_path = os.path.dirname(pdf_path)
        # 使用os.path.basename()获取文件名
        file_name = os.path.basename(pdf_path)
        # 提取文件名,去除文件后缀
        file_name = file_name.split('.')[0]
        # print(file_name)
        # word文件名+路径
        word_path = os.path.join(file_path, f'{file_name}.docx')
        # print(word_path)
        if not xlsx_path:
            # xlsx文件名+路径
            xlsx_path = os.path.join(file_path, f'{file_name}.xlsx')
            # print(xlsx_path)

        # 第一步,先将pdf转成doc文档
        rsp_dict = pdf_to_word(pdf_path, page_nums=page_nums)
        if rsp_dict["error_code"] == "000000":
            # 第二步,再读取doc文档,转成xlsx文档
            # 打开Word文档
            doc = Document(word_path)

            if len(doc.tables) < 1:
                result_dict["error_code"] = "999999"
                result_dict["error_msg"] = "PDF文件未找到表格内容,无法转成xlsx文档."
                return result_dict

            # 创建一个Excel writer对象
            with pd.ExcelWriter(xlsx_path, engine='openpyxl') as writer:

                # 遍历文档中的所有表格
                for i, table in eandroidnumerate(doc.tables, start=1):
                    # 创建一个空的DataFrame来存储表格数据
                    data = []

                    # 遍历表格中的所有行
                    for row in table.rows:
                        # 遍历行中的所有单元格
                        row_data = []
                        for cell in row.cells:
                            row_data.append(cell.text)
                        data.append(row_data)

                    # 将数据转换为DataFrame
                    df = pd.DataFrame(data)

                    # 将DataFrame保存到Excel的不同工作表中
                    sheet_name = f"Table_{i}"
                    df.to_excel(writer, sheet_name=sheet_name, index=False, header=False)

            # print(f"转换完成,结果保存在{xlsx_path}中。")
        else:
            result_dict["error_code"] = rsp_dict["error_code"]
            result_dict["error_msg"] = rsp_dict["error_msg"]
            return result_dict

        # 识别时间
        end_time = time.time()
        # 计算耗时差,单位毫秒
        recognize_time = (end_time - start_time) * 1000
        # 保留2位小数
        recognize_time = round(recognize_time, 2)
        # print('处理时间:' + str(recognize_time) + '毫秒')
        result_dict["recognize_time"] = recognize_time
        result_dict["error_code"] = "000000"
        result_dict["error_msg"] = "pdf转excel成功"
        # 使用os.path.basename()获取文件名
        xlsx_file_name = os.path.basename(xlsx_path)
        result_dict["filename"] = xlsx_file_name

        return result_dict

    except Exception as e:
        print("pdf转excel异常," + str(e))
        result_dict["error_code"] = "999999"
        result_dict["error_msg"] = "PDF到excel转换过程中发生错误," + str(e)
        return result_dict

(二)、使用 pdfplumber 和 python-pandas 库

使用pdfplumber库读取pdf表格内容,然后写入excel表格文档中。

pip install pdfplumber -i https://mirrors.aliyun.com/pypi/simple

import pandas as pd
import pdfplumber

'''
不擅长编程的用户,可以选择我的免费工具箱,开箱即用,方便快捷。
print("搜/索/pythonwei/xin/小/程/序:  全能科技工具箱")
'''

def pdf_to_excel_new(pdf_path, xlsx_path=None, page_nums=None):
    '''
    @方法名称: pdf转excel
    @中文注释: pdf转excel
    @入参:
        @param pdf_path str pdf文件路径
        @param page_nums str 页码序号
    @出参:
        @返回状态:
            @return 0 失败或异常
            @return 1 成功
        @返回错误码
        @返回错误信息
        @param xlsx_file str excel文件名
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2025-01-06
    @使用范例: pdf_to_excel('test.pdf')
    '''
    result_dict = {}
    try:
        if not type(pdf_path) is str:
            result_dict["error_code"] = "111111"
            result_dict["error_msg"] = "pdf文件路径参数类型错误,不为字符串"
            return result_dict
        # 检查PDF文件是否存在
        if not os.path.isfile(pdf_path):
            result_dict["error_code"] = "999999"
            result_dict["error_msg"] = f"PDF文件未找到: {pdf_path}"
            return result_dict

        start_time = time.time()

        # 使用os.path.basename()获取文件名
        file_path = os.path.dirname(pdf_path)
        # 使用os.path.basename()获取文件名
        file_name = os.path.basename(pdf_path)
        # 提取文件名,去除文件后缀
        file_name = file_name.split('.')[0]
        # print(file_name)

        if not xlsx_path:
            # xlsx文件名+路径
            xlsx_path = os.path.join(file_path, f'{file_name}.xlsx')
            # print(xlsx_path)

        # 提取 PDF 中的文本数据
        with pdfplumber.open(pdf_path) as pdf:
            if len(pdf.pages) < 1:
                result_dict["error_code"] = "999999"
                result_dict["error_msg"] = "PDF文件未找到表格内容,无法转成xlsx文档."
                return result_dict

            # 创建一个 Excel 的写入器
            with pd.ExcelWriter(xlsx_path) as writer:
                # 转换整本PDF或指定页码
                if page_nums:
                    # 解析页码参数
                    pages = []
                    for part in page_nums.split(','):
                        if '-' in part:
                            start, end = part.split('-')
                            pages.extend(range(int(start) - 1, int(end)))
                        else:
                            pages.append(int(part) - 1)
                    # 转换指定页码
                    for i in pages:
                        page = pdf.pages[i]
                        # 提取当前页的表格数据
                        table = page.extract_table()
                        if table:
                            # 将表格数据转换为 DataFrame
                            df = pd.DataFrame(table)
                            # 将 DataFrame 写入 Excel 的不同工作表
                            df.to_excel(writer, sheet_name=f'Page {i}', index=False)
                else:
                    # 转换整本PDF
                    for i, page in enumerate(pdf.pages, start=1):
                        # 提取当前页的表格数据
                        table = page.extract_table()
                        if table:
                            # 将表格数据转换为 DataFrame
                            df = pd.DataFrame(table)
                            # 将 DataFrame 写入 Excel 的不同工作表
                            df.to_excel(writer, sheet_name=f'Page {i}', index=False)

        # 识别时间
        end_time = time.time()
        # 计算耗时差,单位毫秒
        recognize_time = (end_time - start_time) * 1000
        # 保留2位小数
        recognize_time = round(recognize_time, 2)
        # print('处理时间:' + str(recognize_time) + '毫python秒')
        result_dict["recognize_time"] = recognize_time
        result_dict["error_code"] = "000000"
        result_dict["error_msg"] = "pdf转excel成功"
        # 使用os.path.basename()获取文件名
        xlsx_file_name = os.path.basename(xlsx_path)
        # 打印结果
        # print("文件名:", xlsx_file_name)
        result_dict["filename"] = xlsx_file_name

        # 获取文件大小(字节)
        file_size_bytes = os.path.getsize(xlsx_path)
        # 将字节转换为兆字节
        file_size_mb = file_size_bytes / (1024 * 1024)
        # 打印结果
        # print("文件大小(兆字节):", file_size_mb)
        result_dict["file_size_mb"] = file_size_mb
        return result_dict

    except Exception as e:
        print("pdf转excel异常," + str(e))
        result_dict["error_code"] = "999999"
        result_dict["error_msg"] = "PDF到excel转换过程中发生错误," + str(e)
        return result_dict

三、前端页面效果展示

1,选择PDF文件

2,选择转换类型:PDF转Word 和 PDF转Excel

3,页面范围:可选参数,不选则全部转换 

python实现pdf转word和excel的示例代码

总结

  • pdf2docx 和 PyMuPDF 是pdf转word更直接的选择,因为它们专门用于转换 PDF 到 DOCX,并且通常在版面还原方面做得更好。
  • pdfplumber 更适合于文本和表格的提取,而不是直接的格式转换。
  • PyPDF2 和 python-docx 的组合提供了更多的灵活性,但可能需要更多的自定义代码来处理复杂的布局和格式。

根据你的需求,选择最适合你的库。如果你需要高度保真的版面还原,pdf2docx 或 PyMuPDF 可能是更好的选择。如果你需要从 PDF 中提取文本和表格数据,pdfplumber 可能更适合。

到此这篇关于python实现pdf转word和excel的文章就介绍到这了,更多相关python实现pdf转word和excel内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)! 

这篇关于python实现pdf转word和excel的示例代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153185

相关文章

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理