在处理 PDF 文件时,常常会遇到一些无用的空白页。这些页面不仅影响阅读体验,还可能导致文件体积增大,甚至在打印时造成纸张浪费。为了提升 PDF 文档的专业性和实用性,查找并删除其中的空白页面是一个十分必要的操作。
本文将介绍如何使用 Python 和 Spire.PDF for Python 高效识别并删除 PDF 中的空白页,包括那些“看起来空白、实则含有不可见内容”的页面。
安装Spire.PDF for Python和Pillow
本教程需依赖Spire.PDF for Python 和 Pillow 两个 Python 库。前者主要用于加载PDF、并执行绝对空白页面识别和删除等操作。后者主要用于图片处理,辅助识别视觉上是空白页,实则并非真正空白的页面。
安装命令:
pip install Spire.PDF Pillow
如果您不清楚如何安装Spire.PDF,请参考此教程:如何在 Windows 中安装 Spire.PDF for Python
Python 查找和删除 PDF 中的空白页面
Spire.PDF 提供了 PdfPageBase.IsBlank() 方法来判断页面是否为完全空白,但部分页面虽然肉眼看似空白,实则可能包含白色文字、水印或背景图。这些情况无法仅靠 PdfPageBase.IsBlank() 方法准确判断。
因此,本文采用双重判断方法:
- 使用 PdfPageBase.IsBlank() 方法初步排查完全空白页。
- 将非完全空白页面转换为图片并通过 Pillow 分析图片像素,判断是否为“视觉空白页”。
⚠️ 注意:PDF 转图片过程中如无有效 License,会在图片上添加评估水印,影响空白判断。如果您没有 License,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取临时 License 以保证功能正常。
具体实现步骤如下:
- 自定义一个 is_blank_image() 方法,借助 Pillow 判断 PDF 页面转换得到的图片是否为空白图片。
- 创建 PdfDocument 类的对象,并使用 PdfDocument.LoadFromFile() 方法加载 PDF 文档。
- 遍历 PDF 文档中的每一页,依次判断页面是否为空白:
- 使用 PdfPageBase.IsBlank() 方法判断页面是否为完全空白。如果是,调用 PdfDocument.Pages.RemoveAt() 方法直接删除该页面;
- 如果页面不是完全空白,使用 PdfDocument.SaveAsImage() 方法将页面转换为图片,再通过 is_blank_image() 方法判断该图片是否为空白。如果判断为是空白图片,使用 PdfDocument.Pages.RemoveAt() 方法删除对应页面。
- 使用 PdfDocument.SaveToFile() 方法保存最终处理后的 PDF 文件。
- Python
import io
from spire.pdf import PdfDocument
from PIL import Image
# 应用License Key
License.SetLicenseKey("License-Key")
# 自定义方法:判断图片是否为空白(所有像素是否都为白色)
def is_blank_image(image):
# 转换为 RGB 模式再获取像素
img = image.convert("RGB")
# 获取所有像素点集合,判断是否全为白色
white_pixel = (255, 255, 255)
return all(pixel == white_pixel for pixel in img.getdata())
# 加载 PDF 文档
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")
# 倒序遍历每页,避免因删除影响索引
for i in range(pdf.Pages.Count - 1, -1, -1):
page = pdf.Pages[i]
# 判断当前页面是否为完全空白
if page.IsBlank():
# 若为完全空白,直接将其从文档中删除
pdf.Pages.RemoveAt(i)
else:
# 将当前页面转换为图片
with pdf.SaveAsImage(i) as image_data:
image_bytes = image_data.ToArray()
pil_image = Image.open(io.BytesIO(image_bytes))
# 判断图片是否为空白
if is_blank_image(pil_image):
# 若为空白图片,从文档中删除图片对应的PDF页面
pdf.Pages.RemoveAt(i)
# 保存结果 PDF
pdf.SaveToFile("删除空白页面.pdf")
pdf.Close()
申请临时 License
如果您需要去除生成文档中的评估提示或解除功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。