pdf-to-markdown / app.py
Liam Dyer
huge
c1d7645 unverified
raw
history blame
2.15 kB
import spaces
import gradio as gr
import surya.detection as detection
import surya.layout as layout
import os
import base64
# Monkey patch to prevent spawning processes
def batch_text_detection(images, model, processor, batch_size=None):
preds, orig_sizes = detection.batch_detection(
images, model, processor, batch_size=batch_size
)
results = []
for i in range(len(images)):
result = detection.parallel_get_lines(preds[i], orig_sizes[i])
results.append(result)
return results
detection.batch_text_detection = batch_text_detection
def batch_layout_detection(
images, model, processor, detection_results=None, batch_size=None
):
preds, orig_sizes = layout.batch_detection(
images, model, processor, batch_size=batch_size
)
id2label = model.config.id2label
results = []
for i in range(len(images)):
result = layout.parallel_get_regions(
preds[i],
orig_sizes[i],
id2label,
detection_results[i] if detection_results else None,
)
results.append(result)
return results
layout.batch_layout_detection = batch_layout_detection
from marker.convert import convert_single_pdf
from marker.models import load_all_models
model_list = load_all_models()
@spaces.GPU
def convert(pdf_file, extract_images):
global model_list
full_text, images, out_meta = convert_single_pdf(pdf_file, model_list)
image_data = {}
if extract_images:
for filename, image in images.items():
image.save(filename, "PNG")
with open(filename, "rb") as f:
image_bytes = f.read()
image_base64 = base64.b64encode(image_bytes).decode("utf-8")
image_data[filename] = image_base64
os.remove(filename)
return full_text, out_meta, image_data
gr.Interface(
convert,
inputs=[
gr.File(label="Upload PDF", type="filepath"),
gr.Checkbox(label="Extract Images"),
],
outputs=[
gr.Text(label="Markdown"),
gr.JSON(label="Metadata"),
gr.JSON(label="Images"),
],
).launch()