Spaces:
Running
on
Zero
Running
on
Zero
Commit
·
c166286
1
Parent(s):
61f26f1
Refactor turn_page function: update return values to include processed image and layout JSON, and improve page info handling
Browse files
app.py
CHANGED
|
@@ -476,45 +476,47 @@ def load_file_for_preview(file_path: str) -> Tuple[Optional[Image.Image], str]:
|
|
| 476 |
return None, f"Error loading file: {str(e)}"
|
| 477 |
|
| 478 |
|
| 479 |
-
def turn_page(direction: str) -> Tuple[Optional[Image.Image], str,
|
| 480 |
-
"""Navigate through PDF pages"""
|
| 481 |
global pdf_cache
|
| 482 |
-
|
| 483 |
if not pdf_cache["images"]:
|
| 484 |
-
return None, "No file loaded
|
| 485 |
-
|
| 486 |
if direction == "prev":
|
| 487 |
pdf_cache["current_page"] = max(0, pdf_cache["current_page"] - 1)
|
| 488 |
elif direction == "next":
|
| 489 |
pdf_cache["current_page"] = min(
|
| 490 |
-
pdf_cache["total_pages"] - 1,
|
| 491 |
pdf_cache["current_page"] + 1
|
| 492 |
)
|
| 493 |
-
|
| 494 |
index = pdf_cache["current_page"]
|
| 495 |
-
|
| 496 |
-
|
| 497 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 498 |
# Get results for current page if available
|
| 499 |
-
|
| 500 |
-
|
| 501 |
-
index < len(pdf_cache["results"]) and
|
| 502 |
pdf_cache["results"][index]):
|
|
|
|
| 503 |
result = pdf_cache["results"][index]
|
| 504 |
-
|
| 505 |
-
|
| 506 |
-
|
| 507 |
-
|
| 508 |
-
|
| 509 |
-
|
| 510 |
-
|
| 511 |
-
# Check if the result contains mostly Arabic text and return appropriate update
|
| 512 |
-
if is_arabic_text(current_result):
|
| 513 |
-
result_update = gr.update(value=current_result, rtl=True)
|
| 514 |
else:
|
| 515 |
-
|
| 516 |
-
|
| 517 |
-
return
|
| 518 |
|
| 519 |
|
| 520 |
def create_gradio_interface():
|
|
@@ -534,7 +536,6 @@ def create_gradio_interface():
|
|
| 534 |
}
|
| 535 |
|
| 536 |
.process-button {
|
| 537 |
-
background: linear-gradient(45deg, #667eea 0%, #764ba2 100%) !important;
|
| 538 |
border: none !important;
|
| 539 |
color: white !important;
|
| 540 |
font-weight: bold !important;
|
|
@@ -546,7 +547,6 @@ def create_gradio_interface():
|
|
| 546 |
}
|
| 547 |
|
| 548 |
.info-box {
|
| 549 |
-
background: #f8f9fa;
|
| 550 |
border: 1px solid #dee2e6;
|
| 551 |
border-radius: 8px;
|
| 552 |
padding: 15px;
|
|
@@ -556,7 +556,6 @@ def create_gradio_interface():
|
|
| 556 |
.page-info {
|
| 557 |
text-align: center;
|
| 558 |
padding: 8px 16px;
|
| 559 |
-
background: #e9ecef;
|
| 560 |
border-radius: 20px;
|
| 561 |
font-weight: bold;
|
| 562 |
margin: 10px 0;
|
|
@@ -575,12 +574,6 @@ def create_gradio_interface():
|
|
| 575 |
color: #0c5460;
|
| 576 |
border: 1px solid #b8daff;
|
| 577 |
}
|
| 578 |
-
|
| 579 |
-
.status-error {
|
| 580 |
-
background: #f8d7da;
|
| 581 |
-
color: #721c24;
|
| 582 |
-
border: 1px solid #f5c6cb;
|
| 583 |
-
}
|
| 584 |
"""
|
| 585 |
|
| 586 |
with gr.Blocks(theme=gr.themes.Soft(), css=css, title="Dots.OCR Demo") as demo:
|
|
@@ -789,25 +782,19 @@ def create_gradio_interface():
|
|
| 789 |
def clear_all():
|
| 790 |
"""Clear all data and reset interface"""
|
| 791 |
global pdf_cache
|
| 792 |
-
|
| 793 |
pdf_cache = {
|
| 794 |
-
"images": [],
|
| 795 |
-
"
|
| 796 |
-
"total_pages": 0,
|
| 797 |
-
"file_type": None,
|
| 798 |
-
"is_parsed": False,
|
| 799 |
-
"results": []
|
| 800 |
}
|
| 801 |
-
|
| 802 |
return (
|
| 803 |
None, # file_input
|
| 804 |
None, # image_preview
|
| 805 |
-
"No file loaded
|
| 806 |
None, # processed_image
|
| 807 |
"Click 'Process Document' to see extracted content...", # markdown_output
|
| 808 |
-
"", # raw_output
|
| 809 |
None, # json_output
|
| 810 |
-
'<div class="model-status status-ready">✅ Interface cleared</div>' # model_status
|
| 811 |
)
|
| 812 |
|
| 813 |
# Wire up event handlers
|
|
@@ -817,14 +804,15 @@ def create_gradio_interface():
|
|
| 817 |
outputs=[image_preview, page_info]
|
| 818 |
)
|
| 819 |
|
|
|
|
| 820 |
prev_page_btn.click(
|
| 821 |
-
lambda:
|
| 822 |
-
outputs=[image_preview, page_info, markdown_output]
|
| 823 |
)
|
| 824 |
-
|
| 825 |
next_page_btn.click(
|
| 826 |
-
lambda:
|
| 827 |
-
outputs=[image_preview, page_info, markdown_output]
|
| 828 |
)
|
| 829 |
|
| 830 |
process_btn.click(
|
|
@@ -833,10 +821,11 @@ def create_gradio_interface():
|
|
| 833 |
outputs=[processed_image, markdown_output, json_output]
|
| 834 |
)
|
| 835 |
|
|
|
|
| 836 |
clear_btn.click(
|
| 837 |
clear_all,
|
| 838 |
outputs=[
|
| 839 |
-
file_input, image_preview, page_info, processed_image,
|
| 840 |
markdown_output, json_output
|
| 841 |
]
|
| 842 |
)
|
|
|
|
| 476 |
return None, f"Error loading file: {str(e)}"
|
| 477 |
|
| 478 |
|
| 479 |
+
def turn_page(direction: str) -> Tuple[Optional[Image.Image], str, Any, Optional[Image.Image], Optional[Dict]]:
|
| 480 |
+
"""Navigate through PDF pages and update all relevant outputs."""
|
| 481 |
global pdf_cache
|
| 482 |
+
|
| 483 |
if not pdf_cache["images"]:
|
| 484 |
+
return None, '<div class="page-info">No file loaded</div>', "No results yet", None, None
|
| 485 |
+
|
| 486 |
if direction == "prev":
|
| 487 |
pdf_cache["current_page"] = max(0, pdf_cache["current_page"] - 1)
|
| 488 |
elif direction == "next":
|
| 489 |
pdf_cache["current_page"] = min(
|
| 490 |
+
pdf_cache["total_pages"] - 1,
|
| 491 |
pdf_cache["current_page"] + 1
|
| 492 |
)
|
| 493 |
+
|
| 494 |
index = pdf_cache["current_page"]
|
| 495 |
+
current_image_preview = pdf_cache["images"][index]
|
| 496 |
+
page_info_html = f'<div class="page-info">Page {index + 1} / {pdf_cache["total_pages"]}</div>'
|
| 497 |
+
|
| 498 |
+
# Initialize default result values
|
| 499 |
+
markdown_content = "Page not processed yet"
|
| 500 |
+
processed_img = None
|
| 501 |
+
layout_json = None
|
| 502 |
+
|
| 503 |
# Get results for current page if available
|
| 504 |
+
if (pdf_cache["is_parsed"] and
|
| 505 |
+
index < len(pdf_cache["results"]) and
|
|
|
|
| 506 |
pdf_cache["results"][index]):
|
| 507 |
+
|
| 508 |
result = pdf_cache["results"][index]
|
| 509 |
+
markdown_content = result.get('markdown_content') or result.get('raw_output', 'No content available')
|
| 510 |
+
processed_img = result.get('processed_image', None) # Get the processed image
|
| 511 |
+
layout_json = result.get('layout_result', None) # Get the layout JSON
|
| 512 |
+
|
| 513 |
+
# Check for Arabic text to set RTL property
|
| 514 |
+
if is_arabic_text(markdown_content):
|
| 515 |
+
markdown_update = gr.update(value=markdown_content, rtl=True)
|
|
|
|
|
|
|
|
|
|
| 516 |
else:
|
| 517 |
+
markdown_update = markdown_content
|
| 518 |
+
|
| 519 |
+
return current_image_preview, page_info_html, markdown_update, processed_img, layout_json
|
| 520 |
|
| 521 |
|
| 522 |
def create_gradio_interface():
|
|
|
|
| 536 |
}
|
| 537 |
|
| 538 |
.process-button {
|
|
|
|
| 539 |
border: none !important;
|
| 540 |
color: white !important;
|
| 541 |
font-weight: bold !important;
|
|
|
|
| 547 |
}
|
| 548 |
|
| 549 |
.info-box {
|
|
|
|
| 550 |
border: 1px solid #dee2e6;
|
| 551 |
border-radius: 8px;
|
| 552 |
padding: 15px;
|
|
|
|
| 556 |
.page-info {
|
| 557 |
text-align: center;
|
| 558 |
padding: 8px 16px;
|
|
|
|
| 559 |
border-radius: 20px;
|
| 560 |
font-weight: bold;
|
| 561 |
margin: 10px 0;
|
|
|
|
| 574 |
color: #0c5460;
|
| 575 |
border: 1px solid #b8daff;
|
| 576 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 577 |
"""
|
| 578 |
|
| 579 |
with gr.Blocks(theme=gr.themes.Soft(), css=css, title="Dots.OCR Demo") as demo:
|
|
|
|
| 782 |
def clear_all():
|
| 783 |
"""Clear all data and reset interface"""
|
| 784 |
global pdf_cache
|
| 785 |
+
|
| 786 |
pdf_cache = {
|
| 787 |
+
"images": [], "current_page": 0, "total_pages": 0,
|
| 788 |
+
"file_type": None, "is_parsed": False, "results": []
|
|
|
|
|
|
|
|
|
|
|
|
|
| 789 |
}
|
| 790 |
+
|
| 791 |
return (
|
| 792 |
None, # file_input
|
| 793 |
None, # image_preview
|
| 794 |
+
'<div class="page-info">No file loaded</div>', # page_info
|
| 795 |
None, # processed_image
|
| 796 |
"Click 'Process Document' to see extracted content...", # markdown_output
|
|
|
|
| 797 |
None, # json_output
|
|
|
|
| 798 |
)
|
| 799 |
|
| 800 |
# Wire up event handlers
|
|
|
|
| 804 |
outputs=[image_preview, page_info]
|
| 805 |
)
|
| 806 |
|
| 807 |
+
# The outputs list is now updated to include all components that need to change
|
| 808 |
prev_page_btn.click(
|
| 809 |
+
lambda: turn_page("prev"),
|
| 810 |
+
outputs=[image_preview, page_info, markdown_output, processed_image, json_output]
|
| 811 |
)
|
| 812 |
+
|
| 813 |
next_page_btn.click(
|
| 814 |
+
lambda: turn_page("next"),
|
| 815 |
+
outputs=[image_preview, page_info, markdown_output, processed_image, json_output]
|
| 816 |
)
|
| 817 |
|
| 818 |
process_btn.click(
|
|
|
|
| 821 |
outputs=[processed_image, markdown_output, json_output]
|
| 822 |
)
|
| 823 |
|
| 824 |
+
# The outputs list for the clear button is now correct
|
| 825 |
clear_btn.click(
|
| 826 |
clear_all,
|
| 827 |
outputs=[
|
| 828 |
+
file_input, image_preview, page_info, processed_image,
|
| 829 |
markdown_output, json_output
|
| 830 |
]
|
| 831 |
)
|