读pdf
#coding=utf-8
import PyPDF2
'''
读pdf保存至列表
'''
result=[]
with open('old.pdf','rb') as f:
#pdf读文件对象
pdfreader=PyPDF2.PdfFileReader(f)
#由pdf读文件对象获取pdf文件的所有页数
pages=pdfreader.getNumPages()
#循环所有页数(从0开始)
for page in range(pages):
#获取pdf每页的对象
pageobj=pdfreader.getPage(page)
#pdf每页对象转成字符串追加至列表result中维护
result.append(pageobj.extractText())
'''
拷贝pdf
'''
with open('old.pdf','rb') as f:
# pdf读文件对象
pdfreader=PyPDF2.PdfFileReader(f)
# 由pdf读文件对象获取pdf文件的所有页数
pages=pdfreader.getNumPages()
#定义写pdf文件对象
pdfwriter=PyPDF2.PdfFileWriter()
'''
注:写pdf或读pdf文件必须定义模式二进制:b,否则报错
如果报错:PyPDF2.utils.PdfReaderError:Multiple definitions in dictionary at bytes ox30a for key/Type
是因为读pdf文件对象校验了严格模式,解决:
pdfreader=PyPDF2.PdfFileReader(f,strict=False)
'''
with open('new.pdf','wb') as f:
#循环所有页数(从0开始)
for page in range(pages):
#获取pdf每页的对象
pageobj=pdfreader.getPage(page)
#写pdf文件对象添加每页读pdf文件的对象
pdfwriter.addPage(pageobj)
#最后写入文件流
pdfwriter.write(f)
读DBF
#coding=utf-8
from dbfread import DBF
result=[]
#直接读数据库文件对象
table=DBF('new.dbf')
#获取表的列名
fieldname=table.field_names
result.append(fieldname)
#循环表每行,将每行转成字符串追加至列表保存
for record in table:
result.append(record.values())
'''
如果提示编码问题,如下解决
'''
result2=[]
table=DBF('new.dbf')
try:
fieldname=table.field_names
result2.append(fieldname)
for record in table:
result2.append(record.values())
except UnicodeDecodeError as e:
table.encoding='gbk'
fieldname = table.field_names
result2.append(fieldname)
for record in table:
result2.append(record.values())
使用pdfminer读取pdf文件
#解析pdf保存在txt文件中
#注:使用pdfminer模块,前提是python版本要大于等于3.6
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager,PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams
from io import StringIO
'''
PDFParser:用来解析pdf文件
PDFDocument:用来保存PDFParser解析后的对象
PDFPageInterpreter:Interpreter(解释器)用来处理解析后的文档页面内容
PDFResourceManager:pdf共享资源管理器,用于存储共享资源,如字体或图像
PDFPageAggregator:Aggregator(聚合器)
'''
class PDFUtils:
def __init__(self):
pass
def pdf2txt(self,path):
output=StringIO()
with open(path,'rb') as f:
parser=PDFParser(f) #解析读取的pdf文件二进制流
pdfdocument=PDFDocument(parser) #解析pdfparser对象生成文档对象
if not pdfdocument.is_extractable: #判断pdf文档对象是否提供txt转换,不提供就忽略
raise PDFTextExtractionNotAllowed
pdfrm=PDFResourceManager() #创建pdf资源管理器,来管理共享资源
laparams=LAParams() #创建一个pdf设备对象
device=PDFPageAggregator(pdfrm,laparams=laparams) #创建一个pdf设备对象
interpreter=PDFPageInterpreter(pdfrm,device) #创建一个pdf解释器对象
for page in PDFPage.create_pages(pdfdocument): #循环遍历列表生成器,PDFPage.create_pages(pdfdocument)返回一个列表生成器,即获取该pdf文档对象一共多少页
interpreter.process_page(page) #再用解释器解释每一页
layout=device.get_result() #再用pdf设备获取每一页的对象
for x in layout:
if hasattr(x,"get_text"): #判断是否有get_text()方法,如果有则获取文本值
content=x.get_text()
output.write(content) #将获取的文本值写入StringIO的输出流中
content=output.getvalue() #从StringIO的输出流中再获取文本值
output.close()
return content
if __name__ == '__main__':
path='test-dchu.pdf'
pdfutils=PDFUtils()
content=pdfutils.pdf2txt(path)
print(content)
with open('pdf2txt.txt','w',encoding='utf-8') as f:
f.write(content)
结果:
第一节
测试pdf读取
1
2
3

源pdf.png
网友评论