上一篇文章自己研究了一下如何批量将word或者ppt文件转换为PDF文件,但是有时候我们也想要将pdf文件转换为word或者txt文件,方便复制和处理。本文主要通过调用pdfminer3k模块进行处理。
说明:本文是在Windows10下使用python最新的3.6版本虚拟环境
1. pdfminer3k相关链接:
GitHub:https://github.com/jaepil/pdfminer3k
PyPI:https://pypi.org/project/pdfminer3k/
2. 解析pdf文件用到的类:
PDFParser:PDF文档分析器:从一个文件中获取数据
PDFDocument:PDF文档对象:保存获取的数据,和PDFParser是相互关联的
PDFResourceManager:PDF资源管理器:用于存储共享资源,如字体或图像。
LAParams:PDF参数分析器:分析pdf文件参数
PDFPageAggregator:PDF聚合器:读取获取的文档对象
PDFPageInterpreter:PDF文档解析器:处理页面内容变成Python可以解析
3.分析思路:
整体思路为:构造文档对象,解析文档对象,提取所需内容
4. 具体的代码:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#作者:cacho_37967865
#文件:pdfConvertor.py
#日期:2018-04-29
#备注:通过调用PDF解析器:pdfminer3k,批量将PDF文件转换为word或者txt文件,先要在python环境安装pdfminer3k
在python运行环境通过命令行方式运行:pip3 install pdfminer3k
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
# F:\python_env\PaChong_env
# -*- coding: utf-8 -*-
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams
import os
def pdf_to_word(folder,password):
# 获取指定目录下面的所有文件
files = os.listdir(folder)
# 获取pdf类型的文件放到一个列表里面
pdfFiles = [f for f in files if f.endswith(".pdf")]
for pdfFile in pdfFiles:
# 将pdf文件放到指定的路径下面
pdfPath = os.path.join(folder, pdfFile)
# 设置将要转换后存放word文件的路径
wdPath = pdfPath
# 判断是否已经存在对应的word文件,如果不存在就加入到存放word的路径内
if wdPath[-3:] != 'doc':
wdPath = wdPath + ".doc"
fn = open(pdfPath, 'rb')
# 创建一个PDF文档分析器:PDFParser
parser = PDFParser(fn)
# 创建一个PDF文档:PDFDocument
doc = PDFDocument()
# 连接分析器与文档
parser.set_document(doc)
doc.set_parser(parser)
# 提供初始化密码,如果无密码,输入空字符串
doc.initialize("")
# 检测文档是否提供txt转换,不提供就忽略
if not doc.is_extractable:
print("PDFTextExtractionNotAllowed")
else:
# 创建PDF资源管理器:PDFResourceManager
resource = PDFResourceManager()
# 创建一个PDF参数分析器:LAParams
laparams = LAParams()
# 创建聚合器,用于读取文档的对象:PDFPageAggregator
device = PDFPageAggregator(resource, laparams=laparams)
# 创建解释器,对文档编码,解释成Python能够识别的格式:PDFPageInterpreter
interpreter = PDFPageInterpreter(resource, device)
# doc.get_pages() 获取page列表
for page in doc.get_pages():
# 利用解释器的process_page()方法解析读取单独页数
interpreter.process_page(page)
# 这里layout是一个LTPage对象,里面存放着这个page解析出的各种对象,
# 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal等等,想要获取文本就获得对象的text属性,
# 使用聚合器get_result()方法获取页面内容
layout = device.get_result()
for out in layout:
if (isinstance(out, LTTextBoxHorizontal)):
print(out.get_text())
with open(wdPath, 'a',encoding='utf-8') as f:
f.write(out.get_text() + '\n')
if __name__ == '__main__':
pdf_to_word("F:\PythonProject\Pacong\docs","")