第一种方法:多线程处理
优点:可以同时处理多个文件,速度非常快。
缺点:只能识别文字信息,对于图片等非文本内容无法识别;另外,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()