使用 Flask 实现 PDF 文档处理与展示


前言

在这篇文章中,我将分享如何使用 Flask 框架创建一个 PDF 文档处理与展示的应用程序。昨天我将PyQT程序改到flask框架下看看效果,这个应用程序可以上传 PDF 文件,提取文本和图表,并以用户友好的方式展示这些内容。以下是实现步骤的详细介绍。

一、项目环境准备

安装所需库: 在开始之前,请确保安装以下 Python 库:

pip install Flask PyPDF2 pdf2image pytesseract opencv-python

Flask:Web 框架。
PyPDF2:用于处理 PDF 文件。
pdf2image:将 PDF 页面转换为图像。
pytesseract:进行光学字符识别(OCR)。
opencv-python:用于图像处理,提取图表。
Tesseract OCR: 确保已安装 Tesseract OCR,具体安装步骤请参考 Tesseract GitHub 页面。

二、应用程序结构

本项目的结构如下:

/pdf_processor
    ├── app.py          # Flask 应用主文件
    ├── utils.py        # 处理 PDF 的工具模块
    └── templates
        ├── upload.html # 文件上传页面
        └── display.html # 显示提取内容的页面

三、主要代码实现

1.app.py

这是 Flask 应用的主文件,负责路由和业务逻辑
代码如下(示例):

from flask import Flask, render_template, request, redirect, url_for
from utils import PDFProcessor

app = Flask(__name__)
pdf_processor = PDFProcessor()

@app.route('/')
def index():
    return render_template('upload.html')

@app.route('/upload', methods=['POST'])
def upload():
    if 'pdf_file' not in request.files:
        return redirect(request.url)
    file = request.files['pdf_file']
    if file.filename == '':
        return redirect(request.url)
    
    pdf_path = f'uploads/{file.filename}'
    file.save(pdf_path)
    pdf_processor.set_pdf_path(pdf_path)
    pdf_processor.clear_output_folder()
    pdf_processor.convert_pdf_to_images()
    pdf_processor.extract_charts_from_images()
    toc_data = pdf_processor.generate_toc()
    return render_template('display.html', toc=toc_data)

if __name__ == '__main__':
    app.run(debug=True)

2.utils.py

此模块包含 PDF 处理的逻辑,包括转换、文本提取和图表提取。
代码如下:

import os
import pytesseract
from pdf2image import convert_from_path
import cv2
import re

class PDFProcessor:
    def __init__(self):
        self.pdf_path = None
        self.image_folder = "output_images/"
        self.extracted_charts = {}

    def set_pdf_path(self, pdf_path):
        self.pdf_path = pdf_path

    def clear_output_folder(self):
        if os.path.exists(self.image_folder):
            for file in os.listdir(self.image_folder):
                file_path = os.path.join(self.image_folder, file)
                if os.path.isfile(file_path):
                    os.remove(file_path)
        else:
            os.makedirs(self.image_folder)

    def convert_pdf_to_images(self):
        pages = convert_from_path(self.pdf_path, 300)
        for i, page in enumerate(pages):
            output_filepath = os.path.join(self.image_folder, f'page_{i + 1}.png')
            page.save(output_filepath, 'PNG')

    def extract_text_with_ocr(self, image_path):
        return pytesseract.image_to_string(image_path, lang='chi_sim')

    def generate_toc(self):
        self.toc_data = []
        title_pattern = re.compile(r'^\d+(\.\d+)+\s+([^\d\W]+.*)', re.MULTILINE)
        image_files = sorted(os.listdir(self.image_folder), key=lambda f: int(f.split('_')[1].split('.')[0]))
        for image_filename in image_files:
            image_path = os.path.join(self.image_folder, image_filename)
            text = self.extract_text_with_ocr(image_path)
            for match in title_pattern.finditer(text):
                title = match.group(0).strip()
                page = image_filename.split('_')[1].split('.')[0]
                self.toc_data.append({'title': title, 'page': int(page)})
        return self.toc_data

    def extract_charts_from_images(self):
        # 这里的图表提取逻辑同上
        pass

    # 其他方法省略

3.模板文件

upload.html:

<!DOCTYPE html>
<html>
<head>
    <title>上传 PDF 文件</title>
</head>
<body>
    <h1>上传 PDF 文件</h1>
    <form action="{{ url_for('upload') }}" method="post" enctype="multipart/form-data">
        <input type="file" name="pdf_file" accept="application/pdf">
        <input type="submit" value="上传">
    </form>
</body>
</html>

display.html

<!DOCTYPE html>
<html>
<head>
    <title>提取结果</title>
</head>
<body>
    <h1>目录</h1>
    <ul>
        {% for item in toc %}
            <li>{{ item.title }} - <a href="#">{{ item.page }}</a></li>
        {% endfor %}
    </ul>
    <a href="{{ url_for('index') }}">返回上传页面</a>
</body>
</html>

后面就是点击运行就可以了。

四、总结

通过使用 Flask 和其他 Python 库,我们可以轻松实现 PDF 文档的处理和展示功能。你也可以根据需求扩展功能,比如支持其他文件格式、优化图表提取算法等。希望这篇文章对您有所帮助!非常期待你能想出更好的方法优化文字提取和图表提取效果,我感觉如果不用上深度学习识别图表,确实效果不是很好,在后续我会学习一下相关方法。也期待你能与我交流分享。
如有任何问题,请在评论区留言,我会尽快回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值