60 行 Python代码将 PDF 文档转换为 Word 文档

3,467 阅读2分钟

前言

相信 PDF 文档转 Word 文档在您工作中是非常常见的一个问题,往往都找不到有效的解决办法,可以使用很多工具软件转换,但是大多都需要收费,还不能保证转换后格式、内容的完整性。不愿付费的你,今天教你怎样用64 行 Python 代码实现 PDF 文档转换成 Word 文档。

在 Python 中有很多功能强大的库,能帮助我们解决很多工作中遇到的难题。今天就来讲讲实现 PDF 文档转 Word 文档所用到的 pdfminer 和 python-docx 两个开发库。

pdfminer ,pdfminer 是用于从 PDF 文档提取信息的工具库,通过该该库可以识别 PDF 文档中的图片、文字、表格等信息,具有快速解析且高效提取的特点。

注意:在 Python 3 中使用 pdfminer3k,Python 2 中使用 pdfminer,这两个版本是不能兼容的。

python-docx ,Python 中 Word 文档读取写入等操作工具库。在 PDF 转 Word 过程中将 pdfminer 提取出来的写入 Word 文档中。

安装

pdfminer 在 Python 3 中安装:pip install pdfminer3k。

pdfminer 在 Python 2 中安装:pip install pdfminer。

python-docx 安装:pip install python-docx。

开始 Coding

导入必要的开发包

import sys
import importlib
from docx import Document
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBoxHorizontal
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed, PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfparser import PDFParser, PDFDocument
importlib.reload(sys)
    

这里只是做一个展示,在实际操作过程中,可以根据开发工具 PyCharm 提示选择导入开发包。

新建一个 PDF2Word 类,用于初始化 pdfminer 相关变量。

class PDF2Word:
    def __init__(self, pdf_path):
        # 以二进制读模式打开 PDF
        fp = open(pdf_path, 'rb')
        # 用文件对象来创建一个 PDF 文档分析器
        parser = PDFParser(fp)
        # 创建一个 PDF 文档
        self.doc = PDFDocument()
        # 连接分析器 与文档对象
        parser.set_document(self.doc)
        self.doc.set_parser(parser)

        # 提供初始化密码
        # 如果没有密码 就创建一个空的字符串
        self.doc.initialize()

PDF 转 Word 实现方法

# PDF 转 Word
    def pdf_to_word(self, sve_path):
        # 检测文档是否提供 txt 转换,不提供就忽略
        if not self.doc.is_extractable:
            raise PDFTextExtractionNotAllowed
        else:
            # 创建 PDf 资源管理器 来管理共享资源
            rsrcmgr = PDFResourceManager()
            # 创建一个 PDF 设备对象
            laparams = LAParams()
            device = PDFPageAggregator(rsrcmgr, laparams=laparams)
            # 创建一个 PDF 解释器对象
            interpreter = PDFPageInterpreter(rsrcmgr, device)

            # 用来计数页面,图片,曲线,figure,水平文本框等对象的数量
            num_page, num_image, num_curve, num_figure, num_TextBoxHorizontal = 0, 0, 0, 0, 0

            # 首先创建一个文档对象
            document = Document()
            # 循环遍历列表,每次处理一个page的内容
            for page in self.doc.get_pages():  # doc.get_pages() 获取page列表
                num_page += 1  # 页面增一
                interpreter.process_page(page)
                # 接受该页面的LTPage对象
                layout = device.get_result()
                for x in layout:
                    if isinstance(x, LTTextBoxHorizontal):  # 获取文本内容
                        results = x.get_text()
                        document.add_paragraph(results)
            document.save(sve_path)

调用 PDF 转 Word 方法

if __name__ == '__main__':
    pdf_path = '阿里巴巴Java开发手册1.4.0.pdf'
    covertFile = PDF2Word(pdf_path)
    covertFile.pdf_to_word('阿里巴巴Java开发手册1.4.0.docx')

至此, PDF 文档转 Word 文档就完成了,示例已上传到 GitHub

github.com/Jboob/pdf2w…