Python 处理PDF表格:抓出PDF中的内容保存到本地Excel中

第一步安装第三方库
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+'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值