Spaces:
Sleeping
Sleeping
import gradio as gr | |
import fitz # PyMuPDF | |
from PIL import Image | |
from pathlib import Path | |
import os | |
def convert_pdf_to_images(pdf_path, image_folder="pdf_images", dpi=300): | |
# 创建存储图像的文件夹 | |
os.makedirs(image_folder, exist_ok=True) | |
# 打开PDF文档 | |
pdf_document = fitz.open(pdf_path) | |
image_paths = [] | |
# 遍历每一页PDF,并生成高DPI的图像 | |
for page_number in range(len(pdf_document)): | |
page = pdf_document[page_number] | |
pix = page.get_pixmap(dpi=dpi) | |
image_path = Path(image_folder) / f"page_{page_number + 1}.png" | |
Image.frombytes("RGB", [pix.width, pix.height], pix.samples).save(image_path) | |
image_paths.append(str(image_path)) # 收集每一页的图像路径 | |
pdf_document.close() | |
return image_paths | |
def read_pdf(file): | |
# 提取PDF中的文本 | |
pdf_document = fitz.open(file) | |
text = "" | |
for page in pdf_document: | |
text += page.get_text() | |
pdf_document.close() | |
return text | |
def display_pdf_images(file): | |
# 转换PDF为高清图像 | |
image_paths = convert_pdf_to_images(file) | |
return image_paths # 返回图像路径列表以显示 | |
# 示例PDF路径 | |
example_pdf_path = "./sample.pdf" # 将此替换为您的示例 PDF 的实际路径 | |
# 使用Blocks布局 | |
with gr.Blocks() as app: | |
gr.Markdown('''<h1 align="center"> PDF Text Extractor </h1>''') | |
gr.Markdown('''<p align="center">Upload a PDF file to extract its text and view it.</p>''') | |
with gr.Row(): | |
with gr.Column(scale=1): | |
file_input = gr.File(label="Upload a PDF file", type="filepath") | |
with gr.Row(): | |
display_button = gr.Button("Display PDF", variant="secondary") | |
extract_button = gr.Button("Extract Text", variant="primary") | |
# 使用 Gallery 作为 PDF 查看器,并指定列数和高度 | |
pdf_viewer = gr.Gallery(label="PDF Viewer", columns=1, height="auto", object_fit="contain") | |
with gr.Column(scale=1): | |
text_output = gr.Textbox( | |
label="Extracted Text", | |
interactive=True, | |
placeholder="Extracted text will appear here...", | |
lines=40, | |
max_lines=40, # 设置最大行数,如果超过将显示滚动条 | |
autoscroll=False, # 设置自动滚动到底部 | |
show_copy_button=True, | |
elem_id="text-output" | |
) | |
# 添加一个预设示例PDF | |
gr.Examples( | |
examples=[[example_pdf_path]], | |
inputs=file_input, | |
outputs=[pdf_viewer, text_output], | |
fn=lambda file: (display_pdf_images(file), read_pdf(file)) | |
) | |
# 连接按钮和功能 | |
extract_button.click(read_pdf, inputs=file_input, outputs=text_output) | |
display_button.click(display_pdf_images, inputs=file_input, outputs=pdf_viewer) | |
# 自定义样式 | |
app.css = """ | |
#text-output { | |
width: 100%; | |
max-width: 600px; | |
overflow-y: auto; | |
} | |
""" | |
app.launch() | |