python pdf转word的两种方法

第一种方法:多线程处理
优点:可以同时处理多个文件,速度非常快。
缺点:只能识别文字信息,对于图片等非文本内容无法识别;另外,pdf文档中避免出现 ‘\n’ 等转义字符,否则可能会出现一些识别歧义。
使用情景:文件量大,且只对文本信息有要求的情况

import os
from configparser import ConfigParser
from io import StringIO
from io import open
from concurrent.futures import ProcessPoolExecutor
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Pt


# 将pdf解析成文本文件
def read_from_pdf(file_path):
    with open(file_path, 'rb') as file:
        resource_manager = PDFResourceManager()    # pdf资源管理器 管理共享资源
        return_str = StringIO()  # 类文本文件对象
        lap_params = LAParams()  # 参数分析器

        device = TextConverter(resource_manager, return_str, laparams=lap_params)
        process_pdf(resource_manager, device, file)
        device.close() 
        content = return_str.getvalue()
        return_str.close()
        return content


# 过滤掉控制字符
def remove_control_characters(content):
    mpa = dict.fromkeys(range(13))
    return content.translate(mpa)


# 将文本保存到word文档中
def save_text_to_word(content, file_path):
    doc = Document()
    for line in content.split('\n'):
        paragraph = doc.add_paragraph()
        text = paragraph.add_run(remove_control_characters(line))
        text.font.size = Pt(15)
        text.font.name = 'Times New Roman'  # 控制是西文时的字体
        text.element.rPr.rFonts.set(qn('w:eastAsia'), u'楷体')
    doc.save(file_path)


# pdf转word的整个过程打包
def pdf_to_word(pdf_file_path, word_file_path):
    content = read_from_pdf(pdf_file_path)
    save_text_to_word(content, word_file_path)


def main():
    config_parser = ConfigParser()
    config_parser.read('config.cfg', encoding='utf-8')
    config = config_parser['default']

    tasks = []
    with ProcessPoolExecutor(max_workers=int(config['max_worker'])) as executor:    # 为了多任务同时进行
        for file in os.listdir(config['pdf_folder']):
            extension_name = os.path.splitext(file)[1]
            if extension_name != '.pdf':
                continue
            file_name = os.path.splitext(file)[0]
            pdf_file = config['pdf_folder'] + '/' + file
            word_file = config['word_folder'] + '/' + file_name + '.docx'
            print('正在处理:', file)
            result = executor.submit(pdf_to_word, pdf_file, word_file)   #  转到pdf_to_word函数
            tasks.append(result)
    while True:
        exit_flag = True
        for task in tasks:
            if not task.done():
                exit_flag = False
        if exit_flag:
            print('完成')
            exit(0)


if __name__ == '__main__':
    if __name__ == '__main__':
        main()

这里用到config.cfg(配置文件)。在当前目录建立一个config.cfg文件,将一些重要的参数信息放在这个文件里面。如果觉得麻烦其实也可以直接写在代码中。
config.cfg

[default]
pdf_folder=/Python_ALL/Python_File/3_Interest/testfile 
word_folder=/Python_ALL/Python_File/3_Interest/testfile
max_worker=3

第二种方法:使用pdf2docx库来完成
优点:使用包装好的库来进行处理,可以较完美地处理文本和图片等不同内容的信息,还原度较高。
缺点:处理速度较慢,对pdf文档中一页一页进行识别。
适用场景:文件量少,对pdf文档整体信息都有需求的情况。

from pdf2docx import Converter
from configparser import ConfigParser
import os


def main():
    config_parser = ConfigParser()
    config_parser.read('config.cfg', encoding='utf-8')
    config = config_parser['default']

    for file in os.listdir(config['pdf_folder']):
        extension_name = os.path.splitext(file)[1]
        if extension_name != '.pdf':
            continue
        file_name = os.path.splitext(file)[0]
        pdf_file = config['pdf_folder'] + '/' + file
        word_file = config['word_folder'] + '/' + file_name + '.docx'

        cv = Converter(pdf_file)
        cv.convert(word_file)
        cv.close()


if __name__=='__main__':
    main()

你可能感兴趣的:(python)