python解析pdf文件

先安装PyPDF2,据说这是目前最好的解析pdf的包

pip install PyPDF2

 PDF文件分割、拼接

import os
from PyPDF2 import PdfFileWriter, PdfFileReader


def clear_dir(dir_path):
    """清空目录下的文件"""
    names = os.listdir(dir_path)
    for name in names:
        file_path = os.path.join(dir_path, name)
        cmd = 'del %s' % file_path    #这个是windows命令
        #cmd = 'rm -rf %s' % file_path  #这个是Linux的命令
        cmd = cmd.replace('/', '\\')  #为啥要这个?因为windows命令不支持/所以需要替换,Linux命令没有遇见这个问题;
        os.system(cmd)  #可以通过返回值来判断是否执行成功:0成功,其他失败


def split_pdf(pdf, output_dir):
    """pdf按每页拆分"""
    clear_dir(output_path)
    # 获取 PdfFileReader 对象
    reader = PdfFileReader(pdf_file)
    pages_num = reader.getNumPages()
    # writer = PdfFileWriter() 生成一个文件
    for index in range(pages_num):
        #可以通过对index判断分割想要的
        writer = PdfFileWriter()  #按照每页来分割pdf
        pageObj = reader.getPage(index)
        writer.addPage(pageObj)
        # 添加完每页,再一起保存至文件中;如果要输出一个文件,后面这些放置到循环外即可
        file_name = os.path.join(output_path, str(index) + '.pdf')
        with open(file_name, 'wb') as fw:
            writer.write(fw)

PDF文件抽取表格、文本

需要的包:pdfplumber,tabula,camelot

pdfplumber

①每页单独对象,支持文本、表格数据的抽取(亮点);

②文本抽取:保留了文本的格式,比如换行位置有空格,可以通过这个特点将一段的文本整合;

③表格数据抽取:不会被换行数据所干扰;

缺点:

①文本抽取:如果这页有表格数据,抽取到的文本数据中会包含表格数据(也可能是一个优点???)。

②表格数据抽取:对于有合并单元格的表格,无法还原表格结构。

③表格数据抽取:表格数据不能100%保证和原数据一致,可能少那么接个字,可能识别出错等。

④表格数据抽取(缺陷):最主要的还是对无边界的表格,效果很差,会丢失边缘的数据!!!

⑤表格数据抽取:会被流程图、柱状图干扰;

import pdfplumber
pdf = r'../data/text.pdf'
wookroot = pdfplumber.open(pdf)
pages = wookroot.pages
for page in pages:
    text = page.extract_text()
    tables = page.extract_tables()
    print(text)
    print(tables)
    break
wookroot.close()

tablua

专门用于抽取PDF文件中表格数据的包

优点:

①抽取出来表格数据可以反向推导出表格的结构(亮点);

②不会换行数据干扰;

③可以指定页读取

缺点:

①无法保证表格数据100%准确;

②对于无边界表格支持不好,丢失数据;

import tablua


def get_tabula_tables(pdf_path):
    dfs = tabula.read_pdf(pdf_path, pages='all', encoding='gbk')
    tables = []
    for df in dfs:
        df = df.fillna('')
        headers = df.keys().values.tolist()
        lt = []
        for header in headers:
            if header.count('Unnamed'):
                lt.append('')
                continue
            if header[-1].isdigit() and header.count('.'):
                words = header.split('.')
                line = '.'.join(words[:-1])
                if headers.count(line):
                    lt.append(line)
                    continue
            lt.append(header)
        headers = lt
        values = df.values.tolist()
        lt = []
        for words in values:
            rows = []
            for word in words:
                if not isinstance(word, str):
                    word = str(word)
                    if word[-2:] == '.0':
                        word = word[:-2]
                        rows.append(word)
                        continue
                rows.append(word)
            lt.append(rows)
        values = lt
        values.insert(0, headers)
        tables.append(values)
    return tables


pdf_file = 'xxxx.pdf'
tables = get_tabula_tables(pdf_path)

读取表格中的整数,后面会带有“.0“。

PDF文件转docx

pdf提取困难,可以尝试先转换成文档。

pdf2docx

from pdf2docx import Converter
import logging


logging.disable(logging.INFO)
logging.disable(logging.DEBUG)
logging.disable(logging.WARNING)


pdf_file = 'xxx.pdf'
cv = Converter(pdf_file)
docx_file = 'xxx.docx'
cv.convert(docx_file)
cv.close()

<think>好的,我现在需要解决用户的问题:如何用Python解析PDF文件并提取数据,使用PyPDF2或pdfplumber这样的库。首先,我得回忆一下自己对这些库的了解,以及是否有其他相关的库可以使用。 用户提到了PyPDF2和pdfplumber,这两个库我之前接触过。PyPDF2是比较常用的库,但可能功能相对基础,适合处理简单的文本提取。而pdfplumber听说在提取表格数据方面更强大,特别是处理复杂布局的PDF。此外,还有没有其他库呢?比如tabula-py,这个库专门用于提取表格数据,可能也是一个不错的选择。不过用户没有提到,可能需要补充说明一下。 接下来,我需要分步骤思考如何回答这个问题。首先应该介绍常用的库,然后针对每个库给出示例代码,说明它们的优缺点。同时,用户可能需要知道如何处理不同类型的PDF,比如扫描件或加密文件,所以也需要提到相关的注意事项,比如OCR库或者处理加密的方法。 另外,用户的问题可能涉及到实际应用中常见的问题,比如格式混乱或者表格提取困难,所以需要给出一些最佳实践,比如优先使用pdfplumber处理表格,或者结合多个库使用。同时,可能还需要提到性能优化方面的建议,比如处理大文件时的分页处理。 还要考虑用户的实际应用场景,比如他们可能需要将提取的数据保存为CSV或者其他格式,所以在示例代码中可以加入保存数据的部分,比如使用pandas将提取的表格数据转为DataFrame再保存为CSV。 然后,我需要检查这些库的安装方法,确保用户能够顺利安装。比如PyPDF2和pdfplumber都可以通过pip安装,但pdfplumber可能依赖其他库,比如Pillow,需要确认安装步骤是否正确。 在代码示例方面,需要确保语法正确,并且有注释说明每一步的作用。比如使用PyPDF2读取PDF文件,提取文本;使用pdfplumber提取表格,并处理可能出现的异常情况,比如没有表格的情况。 此外,用户可能想知道如何处理加密的PDF,所以需要提到如何使用PyPDF2解密,前提是用户知道密码。同时,对于扫描件,需要提到OCR工具如Tesseract,并推荐使用PyMuPDF或者pdf2image库将PDF转为图片再进行OCR处理。 最后,生成相关问题,帮助用户进一步探索。比如如何提取图片、处理加密PDF、提升提取效率,或者处理非结构化数据等。 现在需要验证这些思路是否正确。比如,PyPDF2是否能处理加密文件?是的,通过decrypt方法。pdfplumber是否真的擅长表格提取?根据文档,是的,它能够识别表格并提取为列表形式。而tabula-py则是基于Java的Tabula库,可能需要Java环境,但提取表格效果更好,不过用户可能更倾向于纯Python的解决方案,所以pdfplumber可能更合适。 另外,需要注意提醒用户PDF解析的局限性,特别是格式复杂的文件可能导致提取不准确,这时候可能需要结合其他工具或手动检查。 总结回答的结构应该是:介绍常用库,分别给出示例代码和说明优缺点,然后给出最佳实践和注意事项,最后生成相关问题。</think>在Python解析PDF并提取数据可使用多个库,以下是常用工具及示例: ### 一、常用库及代码示例 1. **PyPDF2(基础文本提取)** ```python import PyPDF2 with open("example.pdf", "rb") as file: reader = PyPDF2.PdfReader(file) text = "" for page in reader.pages: text += page.extract_text() # 提取文本 print(text) ``` - ✔️ 优点:轻量级,适合简单文本 - ❌ 缺点:无法解析复杂布局或表格 2. **pdfplumber(高级表格/文本提取)** ```python import pdfplumber with pdfplumber.open("example.pdf") as pdf: first_page = pdf.pages[0] # 提取文本 text = first_page.extract_text() # 提取表格 table = first_page.extract_table() print(pd.DataFrame(table[1:], columns=table[0])) ``` - ✔️ 优点:精准识别表格结构和文本位置 - ❌ 缺点:处理大文件速度较慢 3. **tabula-py(表格数据专用)** ```python import tabula tables = tabula.read_pdf("example.pdf", pages="all") tables[0].to_csv("output.csv") # 保存为CSV ``` - ✔️ 优点:表格提取准确率高 - ❌ 缺点:依赖Java环境 ### 二、关键注意事项 1. **加密PDF处理** ```python # PyPDF2解密(需已知密码) reader = PyPDF2.PdfReader("encrypted.pdf") if reader.is_encrypted: reader.decrypt("password") ``` 2. **扫描件处理方案** - 使用OCR库组合: ```python from pdf2image import convert_from_path import pytesseract images = convert_from_path("scanned.pdf") text = pytesseract.image_to_string(images[0]) ``` ### 三、最佳实践建议 1. 优先使用`pdfplumber`处理含表格的PDF 2. 混合使用多个库应对复杂场景 3. 大文件采用分页处理: ```python with pdfplumber.open("large.pdf") as pdf: for i, page in enumerate(pdf.pages): if i % 100 == 0: print(f"Processing page {i}") ``` ### 四、数据保存示例 ```python import pandas as pd with pdfplumber.open("data.pdf") as pdf: table_data = pdf.pages[0].extract_table() df = pd.DataFrame(table_data[1:], columns=table_data[0]) df.to_csv("extracted_data.csv", index=False) # 保存结构化数据 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值