【PDF识别】总结PDF文本内容与表格提取的方法

一、前言

在数字化办公的浪潮中,PDF文件以其格式稳定、兼容性强等优点,成为文档存储与传输的重要载体。然而,当我们需要从PDF中提取文本和表格进行进一步处理或分析时,却常常面临诸多挑战。

不同的PDF文件类型、复杂的排版布局、扫描版PDF的图像识别等问题,都可能成为提取过程中的"拦路虎"。本文将深入探讨多种PDF文本与表格提取方法,结合实际代码示例,为大家呈现一份全面的PDF提取指南。

二、文本提取方法

1. pdfplumber:精准提取文本与表格

pdfplumber是一个功能强大的Python库,尤其在处理包含表格的PDF文件时表现出色。通过pdfplumber,我们不仅能提取文本,还能对表格进行精确解析。

复制代码
import pdfplumber

pdf_path = "你的PDF文件路径"

with pdfplumber.open(pdf_path) as pdf:
    text = ""
    for page in pdf.pages:
        page_text = page.extract_text()
        text += page_text
        print(page_text)

2. fitz(PyMuPDF):快速提取文本与图像

fitz,即PyMuPDF,以其高效性著称。它不仅能够快速提取PDF中的文本,还能处理PDF中的图像内容。

复制代码
import fitz

doc = fitz.open(pdf_path)
text = ""
for page in doc:
    page_text = page.get_text()
    text += page_text
    print(page_text)

3. PyPDF2:简单文本提取的利器

PyPDF2是一个广为人知的PDF处理库,虽然其功能相对基础,但对于简单的文本提取任务已经足够。

复制代码
import PyPDF2

def extract_text_from_pdf(pdf_path):
    pdfReader = PyPDF2.PdfReader(pdf_path)
    text = ""
    for page_num in range(len(pdfReader.pages)):
        page = pdfReader.pages[page_num]
        text += page.extract_text()
    return text

print(extract_text_from_pdf(pdf_path))

4. pdfminer:深度自定义提取逻辑

pdfminer是一个高度可定制的PDF处理库,适用于需要深度自定义提取逻辑的场景。

复制代码
from pdfminer.high_level import extract_text

def extract_text_from_pdf(pdf_path):
    text = extract_text(pdf_path)
    return text

print(extract_text_from_pdf(pdf_path))

5. pdfquery:提取特定区域文本

pdfquery通过坐标定位,能够精确提取指定区域的文本内容。

复制代码
import pdfquery

def extract_specific_text_from_pdf(pdf_path):
    pdf = pdfquery.PDFQuery(pdf_path)
    pdf.load()
    text = pdf.pq('LTTextLineHorizontal:in_bbox("100, 500, 400, 600")').text()
    return text

print(extract_specific_text_from_pdf(pdf_path))

6. pytesseract与PaddleOCR:攻克扫描版PDF

对于扫描版PDF或图像型PDF,可以使用pytesseract和PaddleOCR进行OCR识别。
pytesseract:

复制代码
from pdf2image import convert_from_path
import pytesseract

def extract_text_from_scanned_pdf(pdf_path):
    pages = convert_from_path(pdf_path)
    text = ""
    for page in pages:
        text += pytesseract.image_to_string(page, lang='chi_sim') + "\n"
    return text

print(extract_text_from_scanned_pdf(pdf_path))

PaddleOCR

复制代码
from pdf2image import convert_from_path
from paddleocr import PaddleOCR

def extract_text_from_scanned_pdf(pdf_path, lang='ch'):
    ocr = PaddleOCR(use_angle_cls=True, lang=lang)
    pages = convert_from_path(pdf_path)
    text = ""
    for page in pages:
        result = ocr.ocr(page, cls=True)
        for idx in range(len(result)):
            res = result[idx]
            for line in res:
                text += line[1][0] + "\n"
    return text

print(extract_text_from_scanned_pdf(pdf_path))

7. aspose.pdf:商业应用的高质量选择

aspose.pdf是一个商业库,提供了高质量的文本和表格提取功能。

复制代码
from aspose.pdf import Document
from aspose.pdf.text import TextFragmentAbsorber

def extract_text_from_pdf(pdf_path):
    pdf_doc = Document(pdf_path)
    absorber = TextFragmentAbsorber()
    text = ""
    for page in pdf_doc.pages:
        page.accept(absorber)
        for fragment in absorber.text_fragments:
            text += fragment.text + "\n"
        absorber.text_fragments.clear()
    return text

print(extract_text_from_pdf(pdf_path))

8. textract:简化文本提取流程

textract是一个简洁高效的文本提取库,能够快速实现文本提取功能。

复制代码
import textract

def extract_text_from_pdf(pdf_path):
    text = textract.process(pdf_path, method='pdfminer')
    print("-----------textract--------------------")
    print(text.decode('utf-8'))
    return text.decode('utf-8')

print(extract_text_from_pdf(pdf_path))

三、表格提取方法

1. pdfplumber:精确表格提取

pdfplumber不仅擅长文本提取,还能精确提取PDF中的表格数据。

复制代码
import pdfplumber

with pdfplumber.open(pdf_path) as pdf:
    for page in pdf.pages:
        table = page.extract_table()
        if table:
            for row in table:
                print(row)

2. camelot:智能表格提取

camelot是一个专门用于从PDF中提取表格数据的Python库,它能够智能地识别PDF中的表格结构。

复制代码
import camelot
import pandas as pd

def extract_tables_from_pdf(pdf_path):
    tables = camelot.read_pdf(pdf_path, flavor='stream')
    combined_df = pd.concat([table.df for table in tables])
    print("-----------camelot--------------------")
    return combined_df

tables_df = extract_tables_from_pdf(pdf_path)
print(tables_df)

3. aspose.pdf:高质量表格提取

aspose.pdf库也提供了表格提取的功能,适合商业应用。

复制代码
from aspose.pdf import Document
from aspose.pdf.text import TextFragmentAbsorber

def extract_tables_from_pdf(pdf_path):
    pdf_doc = Document(pdf_path)
    absorber = TextFragmentAbsorber()
    tables = []
    for page in pdf_doc.pages:
        page.accept(absorber)
        for fragment in absorber.text_fragments:
            # 处理表格数据
            pass
    return tables

print(extract_tables_from_pdf(pdf_path))

四、总结

在PDF文本与表格提取的征程中,我们遇到了各种挑战,也探索了多种解决方案。每种方法都有其独特的适用场景和优缺点:

  • 简单文本提取:PyPDF2和fitz是不错的选择,简单易用,适合初学者快速上手。
  • 表格与精确文本提取:pdfplumber在处理表格方面表现出色,能够满足对文本和表格精确提取的需求。
  • 复杂PDF处理:pdfminer的灵活性使其能够应对复杂的PDF结构,适合需要深度自定义提取逻辑的场景。
  • 扫描PDF处理:pytesseract和PaddleOCR是OCR技术的代表,能够攻克扫描版PDF的难题,但对图像质量有一定要求。
  • 商业应用:aspose.pdf以其高质量的提取效果和稳定性,成为商业应用中的优选,尽管需要考虑成本因素。
  • 简化提取流程:textract通过封装底层逻辑,提供了简洁高效的文本提取方式,适合快速开发。
  • 智能表格提取:camelot在表格提取方面表现出色,能够智能识别PDF中的表格结构,提高提取效率。
相关推荐
固定资产管理系统软件8 分钟前
商务局RFID固定资产管理系统的应用价值与落地要点解析
大数据·python
码农颜29 分钟前
6.3 主函数流程剖析
开发语言·php
研☆香1 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
lancyu1 小时前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗2 小时前
Claude 使用指南
开发语言·python
工具分享2 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI2 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造2 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
longxiaozhang62 小时前
C# Array类:数组其实没那么难
开发语言·c#
程序员三藏2 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例