欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 媳妇儿让我给她找一个PDF转word免费工具,找了半天我决定给她写一个出来^-^

程序员文章站 2022-03-30 09:36:33
之前我媳妇儿让我给她找一个PDF转WORD的免费工具,在网上找了半天发现要不就是收费,要不就是转化的格式混乱。既然网上不能找到好用的免费工具那就直接来写一个吧。人生苦短,我用python。万能的python肯定应该有关于这个第三方库,百度了一下果不其然——PDFminer3k(如果你用的是python2的话那你应该使用的是pdfminer)。我们先上代码然后再分析吧。# -*- coding:utf-8 -*-#author:菜鸟小白的学习分享from pdfminer.pdfparser imp...

之前我媳妇儿让我给她找一个PDF转WORD的免费工具,在网上找了半天发现要不就是收费,要不就是转化的格式混乱。既然网上不能找到好用的免费工具那就直接来写一个吧。人生苦短,我用python。

万能的python肯定应该有关于这个第三方库,百度了一下果不其然——PDFminer3k(如果你用的是python2的话那你应该使用的是pdfminer)。

我们先上代码然后再分析吧。

# -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed

def parse(DataIO, save_path):
    # 用文件对象创建一个PDF文档分析器
    parser = PDFParser(DataIO)
    # 创建一个PDF文档
    doc = PDFDocument()
    # 分析器和文档相互连接
    parser.set_document(doc)
    doc.set_parser(parser)
    # 提供初始化密码,没有默认为空
    doc.initialize()
    # 检查文档是否可以转成TXT,如果不可以就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        # 创建PDF资源管理器,来管理共享资源
        rsrcmagr = PDFResourceManager()
        # 创建一个PDF设备对象
        laparams = LAParams()
        # 将资源管理器和设备对象聚合
        device = PDFPageAggregator(rsrcmagr, laparams=laparams)
        # 创建一个PDF解释器对象
        interpreter = PDFPageInterpreter(rsrcmagr, device)
        # 循环遍历列表,每次处理一个page内容
        # doc.get_pages()获取page列表
        for page in doc.get_pages():
            interpreter.process_page(page)
            # 接收该页面的LTPage对象
            layout = device.get_result()
            # 这里的layout是一个LTPage对象 里面存放着page解析出来的各种对象
            # 一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等一些对像
            # 想要获取文本就得获取对象的text属性
            for x in layout:
                try:
                    if (isinstance(x, LTTextBoxHorizontal)):
                        with open('%s' % (save_path), 'a') as f:
                            result = x.get_text()
                            print(result)
                            f.write(result + "\n")
                except:
                    print("Failed")

if __name__ == '__main__':
    # 解析同一文件夹下的PDF文件,保存到本地doc文件中
    with open(r'菜鸟小白.pdf', 'rb') as pdf_html:
        parse(pdf_html, r'11.doc')

分析过程

PDF没有WORD、Excel这样简单,可以直接去读取内容,读取PDF文件需要用程序以二进制的方式读取,然后转化成文字。而我们通过pdfminer的转化过程就好比是读取出来具体内容后猜测他们的布局,用于重建文字的结构,但是这个也无法保证100%能够工作。

代码中pdfminer调用的每个函数作用分别为:

  1. DFParser(文档分析器)
  2. PDFDocument(文档对象)
  3. PDFResourceManager(资源管理器)
  4. PDFPageInterpreter(解释器)
  5. PDFPageAggregator(聚合器)
  6. LAParams(参数分析器)

首先我们需要新建一个文档分析器和PDF文档,并且将PDF文档对象和文档分析器关联起来。

	# 用文件对象创建一个PDF文档分析器
    parser = PDFParser(DataIO)
    # 创建一个PDF文档
    doc = PDFDocument()
    # 分析器和文档相互连接
    parser.set_document(doc)
    doc.set_parser(parser)

然后我们新建一个资源管理器和新建一个PDF参数对象

 # 创建PDF资源管理器,来管理共享资源
    rsrcmagr = PDFResourceManager()
    # 创建一个PDF设备对象
    laparams = LAParams()

然后我们新建一个聚合器,用于接收资源管理器和参数对象;创建一个解释器,接收资源管理器和聚合器。

 	# 将资源管理器和设备对象聚合
    device = PDFPageAggregator(rsrcmagr, laparams=laparams)
    # 创建一个PDF解释器对象
    interpreter = PDFPageInterpreter(rsrcmagr, device)

然后使用get_pages()去获取所有的页面,用一个for循环遍历每一个页面,使用interperter页面解释器对页面进行逐一聚合,然后调用聚合器的get_result()获取到layout,layout中的每一个内容,只有文本内容才会被提取出来。

	# 循环遍历列表,每次处理一个page内容
    # doc.get_pages()获取page列表
    for page in doc.get_pages():
        interpreter.process_page(page)
        # 接收该页面的LTPage对象
        layout = device.get_result()
        # 这里的layout是一个LTPage对象 里面存放着page解析出来的各种对象
        # 一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等一些对像
        # 想要获取文本就得获取对象的text属性
        for x in layout:
            try:
                if (isinstance(x, LTTextBoxHorizontal)):
                    with open('%s' % (save_path), 'a') as f:
                        result = x.get_text()
                        print(result)
                        f.write(result + "\n")
            except:
                print("Failed")

最新实现效果

原始的PDF文档
荐
                                                        媳妇儿让我给她找一个PDF转word免费工具,找了半天我决定给她写一个出来^-^

转化后的word文档
荐
                                                        媳妇儿让我给她找一个PDF转word免费工具,找了半天我决定给她写一个出来^-^

缺陷

当前的代码仅能实现文字的提取,无法提取图片。后面我们再看看能否将图片也一起提取出来,有厉害的小伙伴也可以私信我。

最后我把这个从程序打包成了一个exe文件,只需要将你想要转化的PDF文档和exe文件放在同一个文件夹内就可以双击执行转化了。有需要的小伙伴可以关注公众号“菜鸟小白的学习分享”私信菜鸟小白"PDFtoWORD"获取下载链接

推荐阅读:

教你搭建微信公众号自动答复机器人

媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。

python使用cx_Oracle库连接oracle服务器

用python批量处理Excel表格,处理结果又快又好,做办公室最靓的那个仔

关注微信公众号——菜鸟小白的学习分享

妈妈再也不用担心我找不到路了

荐
                                                        媳妇儿让我给她找一个PDF转word免费工具,找了半天我决定给她写一个出来^-^

一个人的学习——孤单

一群人的学习——幸福

本文地址:https://blog.csdn.net/qq_25535969/article/details/107123036