资讯专栏INFORMATION COLUMN

批量截取pdf文件

yzzz / 3640人阅读

摘要:能获取页面中文本的准确位置,以及字体或行等其他信息。安装修改的源码利用截取中的某几页,如果的中文字编码为编码,则无法解析。在简体中文操作系统中,编码代表编码。其一在文件中第行,改为此处是为了适应含有的编码的中文字符,提供对其的解码能力。

任务

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

anaconda3
pdfminer3k
pypdf2
解析pdf文件 PDFMiner

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

安装pdfminer3k

pip install pdfminder3k

解析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检索文本和元数据,还可以将整个文件合并在一起。

安装pypdf2:

pip install pypdf2

修改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

截取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)+"
")
        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)+"
")
            continue

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43179.html

相关文章

  • 批量抓取网页pdf文件

    摘要:任务批量抓取网页文件有一个,里面有数千条指向下载链接的网页地址,现在,需要批量抓取这些网页地址中的文件。利用,具体逻辑是正常情况下,按次序下载文件,如果同一文件,下载失败次数超过,则跳过,下载下一个文件,并记录错误信息。 任务:批量抓取网页pdf文件 有一个excel,里面有数千条指向pdf下载链接的网页地址,现在,需要批量抓取这些网页地址中的pdf文件。python环境: anaco...

    pubdreamcc 评论0 收藏0
  • 批量抓取网页pdf文件

    摘要:任务批量抓取网页文件有一个,里面有数千条指向下载链接的网页地址,现在,需要批量抓取这些网页地址中的文件。利用,具体逻辑是正常情况下,按次序下载文件,如果同一文件,下载失败次数超过,则跳过,下载下一个文件,并记录错误信息。 任务:批量抓取网页pdf文件 有一个excel,里面有数千条指向pdf下载链接的网页地址,现在,需要批量抓取这些网页地址中的pdf文件。python环境: anaco...

    icyfire 评论0 收藏0
  • 数据分析遇到PDF文本,怎么用Python批量提取内容

    摘要:复杂系统仿真的微博客虚假信息扩散模型研究面向影子分析的社交媒体竞争情报搜集面向人机协同的移动互联网政务门户探析经验证。微博客的企业竞争情报搜集移动社交媒体用户隐私保护对策研究注意这里的提示,原先的个文件没有被再次抽取,只有个新文件被抽取。 showImg(https://segmentfault.com/img/bVbiU7y?w=1000&h=508); 本文为你展示,如何用Pyth...

    cloud 评论0 收藏0
  • 有没有软件可以将dwg格式的图纸批量转成pdf格式?

    摘要:软件进入转换状态,稍等一下,转就快速转换完成。其实可以将格式的图纸批量转成格式的软件有很多,但是小编教大家了一种最简单的,希望可以对大家有所帮助哦 有没有软件可以将dwg格式的图纸批量转成pdf格式?当然是有的啊,那么我们常用的PC电脑端相关的转换器软件的话,在手机上,我们一样是可以实现相关的操作应用的,那么在手机上又该怎么进行具体的实践操作?其实方法也是很简单的,和电脑上一样,只需要...

    Labradors 评论0 收藏0
  • 如何将一个PDF文件里的图片批量导出

    摘要:假设我有下面这个文件,里面有很多图片,我想把这些图片批量导出,而不是在里一张张手动拷贝本文介绍一种快捷做法。 假设我有下面这个PDF文件,里面有很多图片,我想把这些图片批量导出,而不是在Adobe Acrobat Reader里一张张手动拷贝: showImg(https://segmentfault.com/img/remote/1460000017166430); 本文介绍一种快捷...

    thursday 评论0 收藏0

发表评论

0条评论

yzzz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<