Python如何读取无元数据的二进制内容 实现相同内容PDF文件比对
排除元数据干扰的PDF一致性比对方法
差异来源说明
你遇到的两处差异均属于PDF标准定义的元数据字段,和实际展示/内容无关:
- 第一处带UUID格式的二进制内容是PDF的
/ID字段,是生成PDF时工具自动生成的唯一标识符,相同内容多次生成也可能出现不同值 - 第二处
D:开头的内容是PDF的/ModDate(修改时间)或/CreationDate(创建时间)字段,属于时间类元数据
现有代码的问题
你当前使用的二进制分割后求集合差的方案存在缺陷:
- 按空白符分割会把PDF内容内部的空白符作为分割依据,容易出现误判
- 集合会自动去重,无法检测到重复内容片段的数量差异
- 无法自动区分差异属于元数据还是实际内容
可行的实现方案
方案1:仅提取页面渲染内容比对(推荐)
使用PyMuPDF(fitz)库只读取PDF所有页面的实际渲染内容,完全排除文档层面的元数据干扰,代码示例:
import fitz def get_pure_pdf_content(file_path: str) -> bytes: doc = fitz.open(file_path) pure_content = b"" for page in doc: pure_content += page.read_contents() return pure_content if __name__ == "__main__": content1 = get_pure_pdf_content("file1.pdf") content2 = get_pure_pdf_content("file2.pdf") print(content1 == content2)
使用前需先安装依赖:pip install pymupdf
方案2:剥离元数据后比对完整二进制
如果需要保留PDF完整结构仅排除元数据,可以用PyPDF2清空元数据后导出二进制再比对,代码示例:
import io from PyPDF2 import PdfReader, PdfWriter def strip_pdf_metadata(file_path: str) -> bytes: reader = PdfReader(file_path) writer = PdfWriter() for page in reader.pages: writer.add_page(page) # 清空所有元数据字段 writer.add_metadata({}) buffer = io.BytesIO() writer.write(buffer) return buffer.getvalue() if __name__ == "__main__": content1 = strip_pdf_metadata("file1.pdf") content2 = strip_pdf_metadata("file2.pdf") print(content1 == content2)
使用前需先安装依赖:pip install pypdf2
内容的提问来源于stack exchange,提问作者Nobel
相关产品推荐
相关产品推荐

