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('''
Upload a PDF file to extract its text and view it.
''') 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()