Python如何实现删除pdf空白页

 更新时间:2025年05月14日 09:07:39   作者:去追风,去看海  
这篇文章主要为大家详细介绍了如何使用Python实现删除pdf空白页以及批量删除扫描PDF中的空白页,文中的示例代码简洁易懂,需要的小伙伴可以了解下

python 删除pdf 空白页

环境

python == 3.10

PyPDF2 ==3.0.1

安装

pip install PyPDF2

流程

将空白页和内容页读取出来,看看内部结构有什么不同

以此为依据,遍历整个PDF 文件,标记处有内容的页面,写入到另外一个PDF文件。

python 代码

# 每一个页都是一个字典对象,看第一层没区别
# 参考文章中 第一层 keys 一样, 但是 /Resources下结构有所不同,空白页没有"/XObject"键
# 我的第一层keys 不一样,  但是 /Resources下结构一样
# 另外 PyPDF2 版本不一样,各个模块有更新,自己看源码进行更新,或者根据报错提示进行更新

from PyPDF2 import PdfReader, PdfWriter

def remove_pdf_blank_pages(path):
    pdfReader = PdfReader(open(path, 'rb'))
    writer = PdfWriter()
    pages = len(pdfReader.pages)
    # blank = pdfReader.pages[1]
    # full = pdfReader.pages[2]
    #print('*'*10)
    #print(blank.keys())# dict_keys(['/Type', '/Parent', '/Resources', '/MediaBox', '/Contents'])
    #print(full.keys())# dict_keys(['/Type', '/Parent', '/Resources', '/MediaBox', '/Annots', '/Tabs', '/StructParents', '/Contents'])
    #print(blank['/Resources'])
    #{'/Font': IndirectObject(600, 0, 139632281578944), '/XObject': {'/Im553': IndirectObject(553, 0, 139632281578944), '/Im7': IndirectObject(7, 0, 139632281578944)}, '/ProcSet': ['/PDF', '/Text', '/ImageC', '/ImageI', '/ImageB']}
    #print(full['/Resources'])
    #{'/Font': IndirectObject(600, 0, 139632281578944), '/XObject': {'/Im553': IndirectObject(553, 0, 139632281578944), '/Im7': IndirectObject(7, 0, 139632281578944)}, '/ProcSet': ['/PDF', '/Text', '/ImageC', '/ImageI', '/ImageB']}
    #print('*' * 10)
    for i in range(pages):
        page = pdfReader.pages[i]
        # if "/XObject" in page["/Resources"].keys() or "/Font" in page["/Resources"].keys():
        #     writer.add_page(page)
        if "/StructParents" in page.keys() or "/Tabs" in page.keys() or "/Annots" in page.keys():
            writer.add_page(page)

    writer.write(open(path, 'wb'))

使用Python批量删除扫描PDF中的空白页

对于经常看扫描PDF资料的人来说,经常会碰到如下问题:

PDF缩略图

因为一些格式转换的原因,一些空白页时不时的出现,而且规律不定,一会是偶数页码一会是奇数页码,逐个选中删除的话,对于几百页的文档,非常费时。

百度搜索删除PDF空白页,得到的是一个要收费的工具,有了Python就可以利用免费开源库轻松解决。

先安装 PyPDF2库,在Powershell 或CMD命令行模式安装PyPDF2

Install PyPDF2

流程

将空白页和内容页读取出来,看看内部结构有什么不同,以此为依据,遍历整个PDF 文件,标记处有内容的页面,写入到另外一个PDF文件。

该文件中17页为空白页,18页为内容页:

from PyPDF2 import PdfFileReader, PdfFileWriter

path=r"D:\ebook\PDF\test.pdf"

reader = PdfFileReader(open(path, 'rb'))
"""
注意PyPDF2中页码从0开始
"""
blank= reader.getPage(16)
full = reader.getPage(17)

每一个页都是一个字典对象,看第一层没区别

blank.keys()
Out[24]: dict_keys(['/Type', '/Contents', '/Parent', '/Resources', '/MediaBox'])

full.keys()
Out[25]: dict_keys(['/Type', '/Contents', '/Parent', '/Resources', '/MediaBox'])

经查发现/Resources下结构有所不同,空白页没有"/XObject"键:

blank['/Resources']
Out[26]: {'/ExtGState': {'/Opa0': {'/Type': '/ExtGState', '/CA': 1}}}

full['/Resources']
Out[27]: 
{'/ExtGState': {'/Opa0': {'/Type': '/ExtGState', '/CA': 1},
  '/Opa1': {'/Type': '/ExtGState', '/ca': 1}},
 '/XObject': {'/Image0': {'/BitsPerComponent': 8,
   '/Height': 1130,
   '/Filter': ['/DCTDecode'],
   '/ColorSpace': '/DeviceRGB',
   '/Type': '/XObject',
   '/Subtype': '/Image',
   '/DL': 434222,
   '/Width': 792}}}

所以对于有”/XObject“键的,就是有图像的页面。同时发现一些只有文字没图像的页面,还有"/Font" 键,于是将有这两个键的页面标记,然后写入第二个PDF文件即可:

from PyPDF2 import PdfFileReader, PdfFileWriter

path = r"D:\ebook\PDF\test.pdf"
path_output = r"D:\ebook\PDF\output.pdf"

reader = PdfFileReader(open(path, 'rb'))
writer = PdfFileWriter()
pages = pdfReader.getNumPages()

for i in range(pages):
    page = reader.getPage(i)
    if "/XObject" in page["/Resources"].keys() or "/Font" in page["/Resources"].keys():
        writer.addPage(page)
    
writer.write(open(path_output, 'wb'))

到此这篇关于Python如何实现删除pdf空白页的文章就介绍到这了,更多相关Python删除pdf空白页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python Pandas删除替换并提取其中的缺失值NaN(dropna,fillna,isnull)

    Python Pandas删除替换并提取其中的缺失值NaN(dropna,fillna,isnull)

    这篇文章主要给大家介绍了关于Python Pandas删除替换并提取其中的缺失值NaN(dropna,fillna,isnull)的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用Pandas具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • python的Crypto模块实现AES加密实例代码

    python的Crypto模块实现AES加密实例代码

    这篇文章主要介绍了python的Crypto模块实现AES加密实例代码,简单介绍了实现步骤,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • python监控linux内存并写入mongodb(推荐)

    python监控linux内存并写入mongodb(推荐)

    这篇文章主要介绍了python监控linux内存并写入mongodb的相关资料,需要的朋友可以参考下
    2017-09-09
  • 不到20行代码用Python做一个智能聊天机器人

    不到20行代码用Python做一个智能聊天机器人

    小编先向大家介绍一下本次运用到的python库,本次项目主要运用到的库有wxpy和chatterbot。对Python做一个智能聊天机器人的相关知识感兴趣的朋友跟随小编一起看看吧
    2019-04-04
  • Python多线程同步Lock、RLock、Semaphore、Event实例

    Python多线程同步Lock、RLock、Semaphore、Event实例

    这篇文章主要介绍了Python多线程同步Lock、RLock、Semaphore、Event实例,Lock & RLock 用来确保多线程多共享资源的访问,Semaphore用来确保一定资源多线程访问时的上限,Event是最简单的线程间通信的方式,需要的朋友可以参考下
    2014-11-11
  • Python实现批量执行同目录下的py文件方法

    Python实现批量执行同目录下的py文件方法

    今天小编就为大家分享一篇Python实现批量执行同目录下的py文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python中pd.cut()与pd.qcut()的对比及示例

    python中pd.cut()与pd.qcut()的对比及示例

    本文主要介绍了python中pd.cut()与pd.qcut()的对比及示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Queue 实现生产者消费者模型(实例讲解)

    Queue 实现生产者消费者模型(实例讲解)

    下面小编就为大家带来一篇Queue 实现生产者消费者模型(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 使用Django实现文章与多个标签关联的示例详解

    使用Django实现文章与多个标签关联的示例详解

    在构建一个博客或内容管理系统时,经常需要实现文章与标签的关联,在 Django 中,我们可以利用 ManyToManyField 来实现文章与标签的多对多关系,在本文中,我们将详细探讨如何使用 Django 模型实现文章与多个标签的关联,需要的朋友可以参考下
    2023-11-11
  • 对python中的高效迭代器函数详解

    对python中的高效迭代器函数详解

    今天小编就为大家分享一篇对python中的高效迭代器函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10

最新评论