乐于分享
好东西不私藏

二进制文件处理 | pdf 轻量工具

二进制文件处理 | pdf 轻量工具
"""任务:处理二进制文件(PDF、DOCX等)场景:提取PDF中的文本测试需要真实的PDF文件"""# 需要安装: pip install PyPDF2try    import PyPDF2    def extract_text_from_pdf(filepath):        """        从PDF提取文本        返回: {            "text": "全部文本",            "pages": [                {"page": 1, "text": "第一页"},                {"page": 2, "text": "第二页"}            ],            "metadata": {"author": "...", "title": "..."}        }        """        result = {            'text''',            'pages': [],            'metadata': {}        }        with open(filepath, 'rb'as f:  # 以二进制模式打开 PDF            reader = PyPDF2.PdfReader(f)            if reader.metadata:                result['metadata'] = {                    'author': reader.metadata.get('/Author'''),                    'title': reader.metadata.get('/Title''')                }            for i, page in enumerate(reader.pages):                text = page.extract_text()                result['pages'].append({                    'page': i + 1,                    'text': text                })                result['text'] += text + '\n'        return result    print("PDF处理功能可用")except ImportError:    print(" PyPDF2未安装,跳过PDF测试")    def extract_text_from_pdf(filepath: str) -> dict:        return {"text""PyPDF2未安装""pages": [], "metadata": {}}

一、场景

从 PDF 文件里提取每页文本、PDF 元数据(标题、作者),以及进行全部文本合并等。

二、个人理解/最初卡在哪里

reader = PyPDF2.PdfReader(f) 是 PyPDF2 特有的,把文件变成PDF 阅读器对象,还有reader.metadata、reader.pages、page.extract_text()等方法和属性。

PDF 标准元数据(固定英文键,值可中文)有:

/Title,文档标题,儿童偏头痛诊断和治疗进展

/Author,作者,张三 李四

/Subject,主题 / 副标题,神经内科、临床研究

/Keywords,关键词,偏头痛、儿童、诊疗

/Creator,原始文档创建工具,WPS 文字、Word 2019

/Producer,PDF生成工具,WPS PDF 转换器、Adobe Acrobat

/CreationDate,创建时间,D:20240101120000+08'00'

/ModDate,修改时间,同上格式。

键永远是英文,中文 PDF 不会变成 “作者 / 标题”;值可以是中文,用 .get("/Author", "") 直接拿即可。

PyPDF2 常用方法

1. 核心类

from PyPDF2 import PdfReaderPdfWriterPdfMerger

2. 读取与文本提取

# 打开PDF(二进制只读)withopen("xxx.pdf""rb"as f:    reader=PdfReader(f)    # 1. 总页数    print(len(reader.pages))    # 2. 元数据(标准键,值可中文)    meta=reader.metadata    author=meta.get("/Author""")    title=meta.get("/Title""")    # 3. 逐页文本提取(中文可用,排版一般)    for i, page inenumerate(reader.pages):        text=page.extract_text()  # 核心方法

3. 页面操作

# 提取单页page0=reader.pages[0]# 旋转页面(90/180/270)page0.rotate(90)# 合并PDFmerger=PdfMerger()merger.append("a.pdf")merger.append("b.pdf")merger.write("merged.pdf")# 拆分PDFwriter=PdfWriter()writer.add_page(reader.pages[0])with open("page1.pdf""wb") as f:    writer.write(f)

4. 加密 / 解密

# 加密writer.encrypt("password")# 解密(有密码时)if reader.is_encrypted:    reader.decrypt("password")

5. 优缺点(中文场景)

优点:轻量、无依赖、安装快(pip install PyPDF2)、纯 Python、中文文本能提取、元数据读取稳定。

缺点:排版差、表格 / 公式全丢、双栏乱序、无 OCR(扫描版空白)。

三、代码中的关键洞察

PyPDF2 是专门解析 PDF 的库,每页独立提取文本返回结构化数据(分页 + 全文 + 元数据),如果只用元数据 + 纯文本提取(无表格 / 公式),PyPDF2 足够,轻量稳定。中文论文、双栏、有表格 / 公式、扫描版,可以用 MinerU或其他工具,效果更好。

四、关键代码/可复用片段

import PyPDF2def extract_text_from_pdf(filepath):    result = {"text""""pages": [], "metadata": {}}    withopen(filepath, 'rb'as f:        reader = PyPDF2.PdfReader(f)        # 元数据        if reader.metadata:            result["metadata"] = {                "author": reader.metadata.get("/Author"""),                "title": reader.metadata.get("/Title""")            }        # 分页读取        for i, page inenumerate(reader.pages):            text = page.extract_text()            result["pages"].append({"page": i+1"text": text})            result["text"] += text + "\n"    return result