""")
with gr.Tabs():
# ===================== Document Parsing =====================
with gr.Tab("Document Parsing"):
with gr.Row():
with gr.Column(scale=5):
file_doc = gr.File(label="Upload Image", file_count="single", type="filepath", file_types=["image"])
preview_doc_html = gr.HTML(value="", elem_id="image_preview_doc", visible=False)
gr.Markdown("_( Use this mode for recognizing full-page documents with structured layouts, such as reports, papers, or magazines.)_")
gr.Markdown("💡 *To recognize a single, pre-cropped element (e.g., a table or formula), switch to the 'Element-level Recognition' tab for better results.*")
example_url_doc = gr.State(value=None)
with gr.Row(variant="panel"):
with gr.Column(scale=2):
btn_parse = gr.Button("Parse Document", variant="primary")
with gr.Column(scale=3):
with gr.Row(elem_classes=["checkbox-row"]):
chart_parsing_switch = gr.Checkbox(label="Enable chart parsing", value=False, min_width=10)
# ############### 修改点在这里 ###############
doc_unwarping_switch = gr.Checkbox(label="Enable document unwarping", value=False, min_width=10)
doc_orientation_switch = gr.Checkbox(label="Enable orientation classification", value=False, min_width=10)
if complex_document_examples:
complex_paths = [e[0] for e in complex_document_examples]
complex_state = gr.State(complex_paths)
gallery_complex = gr.Gallery(
value=complex_paths, columns=4, height=400,
preview=False, label=None, allow_preview=False
)
def on_gallery_select_for_doc(paths, evt: gr.SelectData):
idx = evt.index
if isinstance(idx, (list, tuple)):
idx = idx[0]
try:
url = paths[int(idx)]
except Exception:
raise gr.Error(f"Invalid index from gallery: {evt.index}")
return url, update_preview_visibility(url)
gallery_complex.select(
fn=on_gallery_select_for_doc,
inputs=[complex_state],
outputs=[example_url_doc, preview_doc_html],
)
# ===================== 更新日志模块 =====================
gr.Markdown("""
History Updates
Oct 30, 2025:
Added two advanced control options under the "Document Parsing" tab. These features were previously enabled by default (set to true) but are now user-configurable and default to false.
Enable document unwarping: Corrects distortions in bent or poorly photographed documents.
Enable orientation classification: Automatically corrects the orientation of rotated or upside-down images.
Oct 16, 2025: Initial release of the demo.
""")
with gr.Column(scale=7):
with gr.Tabs():
with gr.Tab("Markdown Preview"):
md_preview_doc = gr.Markdown("Please upload an image and click 'Parse Document'.", latex_delimiters=LATEX_DELIMS, elem_id="md_preview_doc")
with gr.Tab("Visualization"):
vis_image_doc = gr.HTML(label="Detection Visualization", elem_id="vis_image_doc")
with gr.Tab("Markdown Source"):
md_raw_doc = gr.Code(label="Markdown Source Code", language="markdown")
def on_file_doc_change(fp):
return None, update_preview_visibility(fp)
file_doc.change(fn=on_file_doc_change, inputs=[file_doc], outputs=[example_url_doc, preview_doc_html])
def parse_doc_router(fp, example_url, use_chart, use_unwarping, use_orientation):
src = fp if fp else example_url
if not src:
raise gr.Error("Please upload an image or pick an example first.")
return handle_complex_doc(src, use_chart, use_unwarping, use_orientation)
btn_parse.click(fn=parse_doc_router, inputs=[file_doc, example_url_doc, chart_parsing_switch, doc_unwarping_switch, doc_orientation_switch],
outputs=[md_preview_doc, vis_image_doc, md_raw_doc])
# ===================== Element-level Recognition =====================
with gr.Tab("Element-level Recognition"):
with gr.Row():
with gr.Column(scale=5):
file_vl = gr.File(label="Upload Image", file_count="single", type="filepath", file_types=["image"])
preview_vl_html = gr.HTML(value="", elem_id="image_preview_vl", visible=False)
gr.Markdown("_(Best for images with a **simple, single-column layout** (e.g., pure text), or for a **pre-cropped single element** like a table, formula, or chart.)_")
gr.Markdown("Choose a recognition type:")
with gr.Row(elem_classes=["prompt-grid"]):
btn_ocr = gr.Button("Text Recognition", variant="secondary")
btn_formula = gr.Button("Formula Recognition", variant="secondary")
with gr.Row(elem_classes=["prompt-grid"]):
btn_table = gr.Button("Table Recognition", variant="secondary")
btn_chart = gr.Button("Chart Recognition", variant="secondary")
example_url_vl = gr.State(value=None)
if targeted_recognition_examples:
targeted_paths = [e[0] for e in targeted_recognition_examples]
targeted_state = gr.State(targeted_paths)
gallery_targeted = gr.Gallery(
value=targeted_paths, columns=4, height=400,
preview=False, label=None, allow_preview=False
)
def on_gallery_select_for_vl(paths, evt: gr.SelectData):
idx = evt.index
if isinstance(idx, (list, tuple)):
idx = idx[0]
try:
url = paths[int(idx)]
except Exception:
raise gr.Error(f"Invalid index from gallery: {evt.index}")
return url, update_preview_visibility(url)
gallery_targeted.select(
fn=on_gallery_select_for_vl,
inputs=[targeted_state],
outputs=[example_url_vl, preview_vl_html],
)
with gr.Column(scale=7):
with gr.Tabs():
with gr.Tab("Recognition Result"):
md_preview_vl = gr.Markdown("Please upload an image and click a recognition type.", latex_delimiters=LATEX_DELIMS, elem_id="md_preview_vl")
with gr.Tab("Raw Output"):
md_raw_vl = gr.Code(label="Raw Output", language="markdown")
def on_file_vl_change(fp):
return None, update_preview_visibility(fp)
file_vl.change(fn=on_file_vl_change, inputs=[file_vl], outputs=[example_url_vl, preview_vl_html])
def parse_vl_router(fp, example_url, prompt_choice):
src = fp if fp else example_url
if not src:
raise gr.Error("Please upload an image or pick an example first.")
return handle_targeted_recognition(src, prompt_choice)
btn_ocr.click(fn=parse_vl_router, inputs=[file_vl, example_url_vl, gr.State("Text Recognition")], outputs=[md_preview_vl, md_raw_vl])
btn_formula.click(fn=parse_vl_router, inputs=[file_vl, example_url_vl, gr.State("Formula Recognition")], outputs=[md_preview_vl, md_raw_vl])
btn_table.click(fn=parse_vl_router, inputs=[file_vl, example_url_vl, gr.State("Table Recognition")], outputs=[md_preview_vl, md_raw_vl])
btn_chart.click(fn=parse_vl_router, inputs=[file_vl, example_url_vl, gr.State("Chart Recognition")], outputs=[md_preview_vl, md_raw_vl])
if __name__ == "__main__":
port = int(os.getenv("PORT", "7860"))
demo.queue(max_size=64).launch(server_name="0.0.0.0", server_port=port, share=False)