使用PyPDF2移除PDF重复页面代码无报错但无效,求排查问题
问题分析与修复
你的代码没实现去重功能,核心问题有两个:
循环漏掉最后一页:
last_page_n = pdf_reader.getNumPages() - 1后用range(last_page_n)遍历,只会处理到倒数第二页,最后一页根本没被加入列表,等于直接丢失了一页内容。直接比较Page对象无效:PyPDF2的
Page是实例化对象,哪怕两个页面内容完全一致,它们也是不同的对象引用。x not in res判断的是对象是否在列表里,而非内容是否重复,所以所有页面都会被加入res,等于没做去重。
修复后的代码示例
要实现真正的内容去重,得把页面内容转换成可比较的格式,比如提取文本或计算页面哈希值。这里先给出基于文本提取的去重示例:
from PyPDF2 import PdfFileReader, PdfFileWriter pdf_reader = PdfFileReader(filename_path) pdf_writer = PdfFileWriter() seen_content = set() # 遍历所有页面,不再遗漏最后一页 for page_num in range(pdf_reader.getNumPages()): page = pdf_reader.getPage(page_num) # 提取页面文本作为去重判断依据 page_content = page.extract_text() # 文本未出现过则保留页面 if page_content not in seen_content: seen_content.add(page_content) pdf_writer.addPage(page) # 保存去重后的PDF文件 with open("去重后的文件.pdf", "wb") as output_file: pdf_writer.write(output_file)
补充说明
如果你的PDF包含图片或非文本内容,文本提取可能不准确,这时候可以用页面字节流计算哈希值,判断更精准:
import hashlib # 替换上述代码中的内容判断部分 page_bytes = page.extract_bytes() page_hash = hashlib.md5(page_bytes).hexdigest() if page_hash not in seen_content: seen_content.add(page_hash) pdf_writer.addPage(page)
另外原代码最后打印的是原列表长度len(megalist1),如果要验证去重效果,应该打印len(res)(修复后对应len(seen_content))。
内容的提问来源于stack exchange,提问作者KawaiKx
相关产品推荐
相关产品推荐

