PaddleOCR / app.py
1oscon's picture
Update app.py
bb6244a verified
import gradio as gr
import spaces
from paddleocr import PaddleOCR
import fitz # PyMuPDF
from PIL import Image
import numpy as np
import os
# --- 配置 ---
OUTPUT_DIR = "output_results"
os.makedirs(OUTPUT_DIR, exist_ok=True)
# --- 模型加载器 (这个函数将在GPU容器中被安全调用) ---
def load_gpu_model():
print("正在Docker容器中加载PaddleOCR GPU模型...")
# 使用与2.7.3版本兼容的参数
ocr_model = PaddleOCR(use_angle_cls=True, lang='ch', use_gpu=True)
print("GPU模型加载成功。")
return ocr_model
# --- Gradio调用的核心处理函数 ---
@spaces.GPU
def process_pdf_max_speed(pdf_file, progress=gr.Progress(track_tqdm=True)):
"""
使用GPU和批处理来极速处理PDF,并实时更新进度条。
"""
if pdf_file is None:
return "请先上传一个PDF文件。", None
try:
# 在GPU会话中加载模型
ocr = load_gpu_model()
doc = fitz.open(pdf_file.name)
total_pages = len(doc)
batch_size = 4
full_text_result = []
for i in progress.tqdm(range(0, total_pages, batch_size), desc="🚀 批处理中..."):
batch_images = []
for page_num in range(i, min(i + batch_size, total_pages)):
page = doc.load_page(page_num)
pix = page.get_pixmap(dpi=200)
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
batch_images.append(np.array(img))
if batch_images:
results = ocr.ocr(batch_images, cls=True)
for page_index, page_result in enumerate(results):
page_texts = []
current_page_num = i + page_index + 1
if page_result:
for line in page_result:
page_texts.append(line[1][0])
full_text_result.append(f"--- Page {current_page_num} ---\n" + "\n".join(page_texts))
doc.close()
final_text = "\n\n".join(full_text_result)
output_filename = os.path.join(OUTPUT_DIR, f"{os.path.splitext(os.path.basename(pdf_file.name))[0]}_result.txt")
with open(output_filename, 'w', encoding='utf-8') as f:
f.write(final_text)
print(f"处理完成!结果已保存到 {output_filename}")
return final_text, output_filename
except Exception as e:
error_message = f"处理过程中发生错误: {str(e)}"
print(error_message)
return error_message, None
# --- 构建Gradio界面 ---
with gr.Blocks(title="极速PDF识别器", theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# ✅ 极速PDF识别器 (终极稳定版) ✅
**速度拉满!实时进度显示,处理期间请勿关闭页面。**
"""
)
with gr.Row():
pdf_input = gr.File(label="📄 上传PDF文件", file_types=[".pdf"])
submit_btn = gr.Button("⚡️ 开始极速处理", variant="primary")
result_display = gr.Textbox(label="识别结果", lines=20, show_copy_button=True)
download_link = gr.File(label="📥 点击此处下载结果文件", interactive=False)
submit_btn.click(
fn=process_pdf_max_speed,
inputs=[pdf_input],
outputs=[display, download_link]
)
demo.queue().launch()