批量截取pdf文件

任务

现在我们有大量的pdf文件,我们想要截取每个文件中感兴趣的一部分,比如,我们下载了3500份上市公司的年度报告,我们想要找到包含“关键审计事项”部分内容,将pdf相关页保存为新的pdf文件。
python环境:

anaconda3
pdfminer3k
pypdf2

解析pdf文件

PDFMiner

PDFMiner是一个从PDF文档中提取信息的工具。与其他PDF相关的工具不同,它只用于获取和分析文本数据。PDFMiner能获取页面中文本的准确位置,以及字体或行等其他信息。它还有一个PDF转换器,可以将PDF文件转换成其他文本格式(如HTML)。还有一个可扩展的解析器PDF,可以用于文本分析以外的其他用途。

  1. 安装pdfminer3k
pip install pdfminder3k
  1. 解析pdf,匹配关键字,返回其所在页码

参考

from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed

path =  r'./report/603999读者传媒2017年年度报告.pdf'

def  parse(path):
    """
    #解析pdf文件,并将文字内容更保存在文本中
    返回“关键字”所在的页码
    """
    fp =  open(path, 'rb') # 以二进制读模式打开
    # 用文件对象来创建一个pdf文档分析器
    praser = PDFParser(fp)
    # 创建一个PDF文档
    doc = PDFDocument()
    # 连接分析器 与文档对象
    praser.set_document(doc)
    doc.set_parser(praser)
    # 提供初始化密码
    # 如果没有密码 就创建一个空的字符串
    doc.initialize()
    # 检测文档是否提供txt转换,不提供就忽略
    if  not doc.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        # 创建PDf 资源管理器 来管理共享资源
        rsrcmgr = PDFResourceManager()
        # 创建一个PDF设备对象
        laparams = LAParams()
        device = PDFPageAggregator(rsrcmgr, laparams=laparams)
        # 创建一个PDF解释器对象
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        # 循环遍历列表,每次处理一个page的内容
        page_num=0
        key_flag=False
        for page in doc.get_pages(): # doc.get_pages() 获取page列表
            if key_flag: #如果找到第一个关键字,则退出解析
                break
            page_num=page_num+1
            interpreter.process_page(page)
            # 接受该页面的LTPage对象
            layout = device.get_result()
            # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,
            for x in layout:
                if (isinstance(x, LTTextBoxHorizontal)):
                    results = x.get_text()
                    if  "关键审计事项"  in results: # 匹配到关键字,则退出该页的循环
                        key_flag=True
                        break
        return page_num

裁剪pdf文件

PyPDF2

PyPDF2是一个python PDF库,能够分割、合并、裁剪和转换PDF文件的页面。它还可以向PDF文件中添加自定义数据、查看选项和密码。它可以从PDF检索文本和元数据,还可以将整个文件合并在一起。

  1. 安装pypdf2:
pip install pypdf2
  1. 修改pypdf2的源码

利用pypdf2截取pdf中的某几页,如果pdf的中文字编码为ANSI编码,则无法解析。对于pypdf2对于gbk不支持的现象,需要对以下两处进行修改。参考

tips:
ANSI是一种字符代码,为使计算机支持更多语言。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码。
GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准。

其一:
在文件*Miniconda3libsite-packagesPyPDF2generic.py"中第488行,改为
此处是为了适应含有‘gbk’的编码的中文字符,提供对其的解码能力。

try:
    return NameObject(name.decode('utf-8'))
except (UnicodeEncodeError, UnicodeDecodeError) as e:
    # Name objects should represent irregular     characters
    # with a '#' followed by the symbol's hex number
    ret=name.decode('gbk')
    return NameObject(ret)

其二:
在文件*Miniconda3libsite-packagesPyPDF2utils.py中,第238-241行,改为:
此处是为了适应‘utf-8’的编码情况;

try:
    r = s.encode('latin-1')
    if len(s) < 2:
        bc[s] = r
    return r
except Exception as e:
    print(s)
    r = s.encode('utf-8')
    if len(s) < 2:
        bc[s] = r
    return r
  1. 截取pdf特定页
from PyPDF2 import PdfFileWriter, PdfFileReader
def  pdfCrap(path,start_page,save_path):
    """
    从pdf文件中截取几页,并保存在对应pdf文件中
    """
    # 开始页
    start_page = start_page - 1
    # 截止页
    end_page = start_page +  5  # 这里设定截取5页
    output = PdfFileWriter()
    pdf_file = PdfFileReader(open(path, "rb"), strict=False)
    pdf_pages_len = pdf_file.getNumPages()
    for i  in  range(start_page, end_page):
        output.addPage(pdf_file.getPage(i)) # 在输出流中添加页
    outputStream =  open(save_path, "wb")
    output.write(outputStream)

遍历文件夹内所有文件

以上已经可以实现对单一pdf文件的解析以及提取特定页了,剩下的就是将整个流程串联起来,实现批量pdf文件的截取。

import os
def  file_name(file_dir):
    """
    获取某文件夹下,特定扩展名的文件名,
    返回特定扩展名文件列表
    """
    L=[]
    for root, dirs, files in os.walk(file_dir):
        for  file  in files:
            if os.path.splitext(file)[1] ==  '.pdf': #os.path.splitext()函数将路径拆分为文件名+扩展名
            L.append(file)
    return L

出错怎么办

现在,我们已经能够进行批量pdf文件的裁剪了,但在实际操作中,会发生许多意外,使得程序被中断,为了避免中断影响批处理的进程,现在添加异常处理功能。

file_path =  './report/'  # 输入文件所在的文件夹
result_path =  './result/'  # 输出文件所在文件夹
def  getAll():
    """
    批量裁剪pdf文件,添加程序log,记录文件名,关键字起始页码,并且对异常情况进行记录;
    """
    files=file_name(file_path)
    for  file  in  files:
        try:
            path = file_path +  file
            page=parse(path)
            save_path=result_path+file
            pdfCrap(path,page,save_path)
            if page==0: #如果识别出起始页码为0,说明关键字未被找到,需要记录。
                raise  Exception("page_num=0")
            with  open(r'./log.txt', 'a', encoding='utf-8') as f:
            f.write(file+' start_page: '+str(page)+"\n")
        except  Exception  as  e: # 捕获错误
            print('error: ', e)
            with  open(r'./error_log.txt', 'a', encoding='utf-8') as f:
            f.write(file+' start_page: '+str(page)+"\n")
            continue
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
图片批量裁剪器(精华版)是 一款功能丰富、实用、应有尽有的图片/视频批量裁剪、水印、转换、更名,以及其他处理的专业工具!批量处理时不低于5万个文件。 以管理员身份和兼容xp3模式下运行,可支持win7,win8,win10,64位。 图片批量裁剪器(精华版)功能 1. 支持常见图片类型如bmp,jpg,tif,gif,png,支持部分非常见图片类型,如PSD,PCX,ICO,Pdf,动态Gif等等;支持对大多数常见的音频/视频文件格式的裁剪、转换、水印、分割、合并等; 2.提供对图片文件的丰富多彩实用的各种批量裁剪模式,如相对、绝对、固定、大小、等分/非等分分切、分隔、同比/非同比缩放、拼接/无缝拼合、贴边等等几百种裁剪处理功能; 支持圆角矩形/椭圆形/圆形/任意角度裁剪,支持自定义圆角矩形半径裁剪; 3.其他更丰富的裁剪功能,请参见主页说明或程序,比如:提取图片上的文字并保存先裁剪后加水印一步到位忽略处理过的文件夹手动指定裁剪区域多裁剪区域裁剪打印二维码图片转Pdf 过滤小图或缩略图 AB文件夹配对拼合 …… 内置其他功能列表: 1.图片烙制水印(文字水印,图片水印,淘宝卖家专用水印,以及其他上百种水印功能模式供选择,特别如以拍摄日期作为文字水印,递增数字水印等等,批量制卡证等) 2.图片旋转及格式转换(特别功能如智能扳正) 3.图片亮度/对比度调整 4.图片压缩(特色功能如保留Exif信息的压缩) 5.定制图片大小/尺寸(特色功能如能按指定的文件大小压缩,比如压缩到120kb左右,仅压缩大图,小图忽略压缩等) 6.图片像素筛查(从海量图片中筛查出满足条件的图片供删除、移动、复制、更名等) 7.(图片)文件时间属性修改(比如更改拍摄日期,没有做不到只有想不到) 8.图像综合处理 9.(图片)文件批量更名(强大丰富的多种文件批量更名功能) 10.文件随机/顺序/定时抽取分发(将海量文件复制或移动到指定的文件夹中) 11.证件照批量更换背景颜色 12.色块/色条魔术棒裁剪,颜色替换 13.音视频裁剪/分割/合并/转换/加水印/录音/录像 14.批量替换图片中的图片或文字 15.图像批量组合排版 16.证件制作排版(广告公司实用) 17.Jpg图片Exif信息编辑器 18.重复或相似图片批量查找 19.相对/绝对/固定裁剪简易兼容备用版 20.Jpg转视频avi或其他(影楼后期制作DV工具) 21.图片批量浏览挑拣器(影楼客户自选照片实用) 22.图片批量叠加/混合 23.视频批量加密(特色功能如用户可自行在线找回播放密码,一机一码,一视频一码) 24.账号、密码批量管理小秘书(管理你各种账号密码,完全安全加密) 25.动态Gif图片裁剪、水印;图片压制成动态Gif(按时间轴裁剪,裁剪后的gif仍然是动画模式) 26.音频片段截取助手 27.广告喷绘大图专用分切器(喷绘行业专用) 图片批量水印裁剪器 v6.0.20161008精华版更新内容: 1.新增动态Gif水印区域批量涂抹模糊,或者图片水印区域批量涂抹功能; 2.修正水印添加模块中,还原或重设DPI功能时失效异常的问题; 3.在水印批量添加模块中,新增还原原图DPI以及转为CMYK印刷颜色模式的新功能; 4.新增批量生成二维码图片的功能; 5.新增图片裁剪/缩放/格式转换/添加水印等单张综合处理功能模块; 6.修正先选择后裁剪功能实现的问题; 7.新增批量对动态Gif文件指定水印区域模糊化处理功能; 8.新增定时对指定的目录中的图片挂机无人值守自动裁剪功能,忽略已处理过的图片文件; 9.新增纯文字水印添加功能模块; 10.新增学生证件照排版和学生胸卡排版制作打印功能模块; 11.改进修正Jpg系列图片转视频功能,并新增同时给转换后的视频叠加音频的功能; 12.修正改进动态Gif裁剪、水印功能模块; 13.改进跟图片OCR文字识别的有关问题和功能; 14.新增备用下载服务器和网络登录版; 15.修正精确去片头片尾功能; 16.修正某些音频视频文件播放时间不足一秒时无法加载入文件列表的异常; 17.修正媒体批量合并功能模块全部失效的问题; 18.新增以文件夹名作为动态文字水印的功能。 图片批量裁剪器(精华版)截图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值