第一步安装第三方库 pip install pdfminer.six#这个是Python3要用到的pdf转化TXT pip install pdfminer3k#这个是Python2要用到的pdf转化TXT pip install pdfplumber#这个是Python2要用到的pdf转化excel #!/usr/bin/env python # -*- coding:utf-8 -*- import sys import re from openpyxl import load_workbook import wmi import openpyxl import win32api,win32con #将PDF转化成TXT所需要的 from pdfminer.pdfpage import PDFPage from pdfminer.pdfparser import PDFParser from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LAParams from pdfminer.pdfdocument import PDFDocument, PDFTextExtractionNotAllowed #将PDF中的Excel提取出来所需要的 import pandas as pd import pdfplumber import os.path import traceback #exepath压成EXE后EXE所放的位置的 exepath=os.path.dirname(sys.executable) os.chdir(exepath) #找到PDF的名字和路径 for i in os.listdir(exepath): print(i) if '.pdf' in i: pdfpath=os.path.join(exepath,i) print(pdfpath) #将PDF档转化成txt,这步用不到 def changePdfToText(filePath): """ 解析pdf 文本,保存到同名txt文件中 param: filePath: 需要读取的pdf文档的目录 introduced module: from pdfminer.pdfpage import PDFPage from pdfminer.pdfparser import PDFParser from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LAParams from pdfminer.pdfdocument import PDFDocument, PDFTextExtractionNotAllowed import os.path """ file = open(filePath, 'rb') # 以二进制读模式打开 # 用文件对象来创建一个pdf文档分析器 praser = PDFParser(file) # 创建一个PDF文档 doc = PDFDocument(praser, '') # praser :上面创建的pdf文档分析器 ,第二个参数是密码,设置为空就好了 # 连接分析器 与文档对象 praser.set_document(doc) # 检测文档是否提供txt转换,不提供就忽略 if not doc.is_extractable: raise PDFTextExtractionNotAllowed # 创建PDf 资源管理器 来管理共享资源 rsrcmgr = PDFResourceManager() # 创建一个PDF设备对象 laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 创建一个PDF解释器对象 interpreter = PDFPageInterpreter(rsrcmgr, device) result = [] # 内容列表 # 循环遍历列表,每次处理一个page的内容 for page in PDFPage.create_pages(doc): interpreter.process_page(page) # 接受该页面的LTPage对象 layout = device.get_result() for x in layout: if hasattr(x, "get_text"): result.append(x.get_text()) fileNames = os.path.splitext(filePath) # 分割 # 以追加的方式打开文件 with open(fileNames[0] + '.txt', 'a', encoding="utf-8") as f: results = x.get_text() # print(results) 这个句可以取消注释就可以在控制台将所有内容输出了 f.write(results) # 写入文件 #将PDF档中的表格提取出来保存到gamut_spec.xlsx中 pdf = pdfplumber.open(pdfpath) df = pd.DataFrame() for i in range(3, 32): # 这里3是指表格信息是从第4页开始的(程序计数是从0开始,所以这里第4页对应程序中的3),53是结束位置 page = pdf.pages[i] # 读取pdf中的每一页 table = page.extract_table() # 从页数据中提取表格数据 df = df.append(table) # 将提取的数据转换为DataFrame二维表格形式 df.drop_duplicates(inplace=True) # 删除重复值 # os.chdir(r'C:\Users\613\Desktop\CalculateGamut\\') os.chdir(exepath) df.to_excel("gamut_spec.xlsx", header=False, index=False) # 将提取的数据保存为excel #获取XLSX中的指定sheet中指定元素的位置 #例如getWxposition(1.xlsx,gamut,abc)就是返回1.xlsx表格中gamutsheet中单元格值为abc的位置 def getWxposition(xlsxname,sheetname,cellvalue): Wxarray=[] exepath = os.path.dirname(sys.executable) # exepath=r'C:\Users\613\Desktop\CalculateGamut\\' os.chdir(exepath) # 打开Excel文件 workbook = openpyxl.load_workbook(xlsxname) # 选择第一个工作表 if sheetname==0: worksheet = workbook.worksheets[0] else: worksheet = workbook.get_sheet_by_name(sheetname) # 遍历每一行 for row in worksheet.iter_rows(): # 遍历每一列 for cell in row: # 如果单元格的值为Wx,则输出该单元格的坐标 if cell.value == cellvalue: Wxarray.append(cell.coordinate) print(f'Wx的坐标为:{cell.coordinate}') return Wxarray #获取gamut_spec.xlsx中的sheet[0]的Color Gamut位置 #使用正则表达式将EXCEL中的字母坐标分开 def splitposition(position): # 使用正则表达式匹配字符串中的字母和数字 pattern = r'([a-zA-Z]+)(\d+)' result = re.findall(pattern, position) print(list(result)) return result #获取Spec的值 #根据传入的坐标参数找到亮度的Spec值 def getcolormodeSpec(wxposition): #将坐标系例如A30转化为1,30 if len(positionxy[0][0])==1: aimy=ord(positionxy[0][0])-65+1 if len(positionxy[0][0])==2: x1=positionxy[0][0][0] x2=positionxy[0][0][1] print(x1,x2) aimy =(ord(x1)-65+1)*26+ord(x2)-65 print('aimy=%s'%aimy) print(aimy) aimx=int(positionxy[0][1]) print('aimx=%s' % aimx) print(aimx) colormodeposition=[aimx,aimy] # 打开Excel文件 exepath = os.path.dirname(sys.executable) os.chdir(exepath) workbook = openpyxl.load_workbook('gamut_spec.xlsx') # 选择第一个工作表 # worksheet = workbook.get_sheet_by_name('Gamut') worksheet = workbook.worksheets[0] # 获取单元格的值 #根据给定的坐标参数获取相对位置的spec值 cell_value = worksheet.cell(aimx, aimy).value colormode = worksheet.cell(aimx, aimy+9).value gamutmin = worksheet.cell(aimx, aimy+10).value gamuttypical = worksheet.cell(aimx, aimy+11).value gamutspecArray.append(cell_value) gamutspecArray.append(colormode) gamutspecArray.append(gamutmin) gamutspecArray.append(gamuttypical) for i in range(0,8): typicalspecs=worksheet.cell(aimx-18+i, aimy+16).value gamutspecArray.append(typicalspecs) print(gamutspecArray) #将亮度SPC中所有要获取的值保存在gamutspecArray中 return gamutspecArray #将获取的Spec按照panel的参数:sRGB,NTSC,DCI-P3,AdobeRGB分别填入对应spec表格中。 def writeSpec(): workbook = openpyxl.load_workbook('Gamut.xlsx') # 选择第一个工作表 worksheet = workbook.get_sheet_by_name('Gamut_Spec') print(gamutspecArray[1]) print('gamutSpecPosition:') print(gamutposition) if gamutspecArray[1]=='sRGB': positionxy=gamutposition[0] elif gamutspecArray[1]=='NTSC': positionxy = gamutposition[1] elif 'DCI' in gamutspecArray[1]: positionxy = gamutposition[2] elif 'Adobe'in gamutspecArray[1]: positionxy = gamutposition[3] else: positionxy = gamutSpecPosition[0] print(positionxy) positionxy = splitposition(positionxy) print(positionxy[0][0]) if len(positionxy[0][0]) == 1: aimy = ord(positionxy[0][0]) - 65+1 if len(positionxy[0][0]) == 2: x1 = positionxy[0][0][0] x2 = positionxy[0][0][1] print(x1, x2) aimy = (ord(x1) - 65 + 1) * 26 + ord(x2) - 65 +1 # aimy = ord(positionxy[0][0]) - 65+5 print('aimy:') print(aimy) aimx = int(positionxy[0][1]) print('aimx:') print(aimx) colormodeposition = [aimx, aimy] print(colormodeposition) worksheet.cell(aimx, aimy+1).value = gamutspecArray[1] worksheet.cell(aimx, aimy + 3).value = gamutspecArray[2] worksheet.cell(aimx, aimy + 4).value = gamutspecArray[3] for i in range(0,8): worksheet.cell(aimx-8+i, aimy + 4).value = gamutspecArray[4+i] workbook.save(r'Gamut.xlsx') try: gamutSpecPosition=(getWxposition('gamut_spec.xlsx',0,'Color Gamut')) print(gamutSpecPosition) gamutspecArray=[] getcolormodeSpec(gamutSpecPosition[0]) gamutposition=getWxposition(xlsxname='Gamut.xlsx',sheetname='Gamut_Spec',cellvalue='Gamut') print(gamutposition) writeSpec() win32api.MessageBox(0, "Get Gamut Spec finish!", "Brightness", win32con.MB_OK) except Exception as e: os.chdir(exepath) traceback.print_exc(file=open(r'getPDFspec.txt', 'a+'))
Python 处理PDF表格:抓出PDF中的内容保存到本地Excel中
最新推荐文章于 2024-10-08 12:22:43 发布