| | import gradio as gr |
| | import json |
| | from reportlab.lib.pagesizes import letter |
| | from reportlab.pdfgen import canvas |
| | from reportlab.lib import colors |
| | import tempfile |
| |
|
| | PAGE_WIDTH, PAGE_HEIGHT = letter |
| |
|
| | |
| | |
| | |
| | def generate_pdf(file): |
| | try: |
| | with open(file.name, "r", encoding="utf-8") as f: |
| | data = json.load(f) |
| | except Exception as e: |
| | return None, f"Error reading JSON: {e}" |
| |
|
| | temp_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") |
| | pdf_path = temp_pdf.name |
| | temp_pdf.close() |
| |
|
| | c = canvas.Canvas(pdf_path, pagesize=letter) |
| | page_created = False |
| |
|
| | |
| | current_y = PAGE_HEIGHT - 50 |
| | bottom_margin = 50 |
| |
|
| | for ad_size, ad_data in data.items(): |
| | for item in ad_data: |
| | for line in item.get("text_lines", []): |
| | text = line.get("text", "") |
| | bbox = line.get("bbox") |
| | if not bbox: |
| | continue |
| | page_created = True |
| | x1, y1, x2, y2 = bbox |
| |
|
| | |
| | box_height = y2 - y1 |
| | font_size = max(6, min(18, box_height * 0.8)) |
| |
|
| | |
| | if current_y - font_size < bottom_margin: |
| | c.showPage() |
| | current_y = PAGE_HEIGHT - 50 |
| |
|
| | pdf_x = x1 |
| | pdf_y = current_y - box_height |
| |
|
| | |
| | c.setStrokeColor(colors.lightgrey) |
| | c.rect(pdf_x, pdf_y, x2 - x1, box_height, fill=0) |
| |
|
| | if "<b>" in text: |
| | c.setFont("Helvetica-Bold", font_size) |
| | text = text.replace("<b>", "").replace("</b>", "") |
| | else: |
| | c.setFont("Helvetica", font_size) |
| |
|
| | c.setFillColor(colors.black) |
| | c.drawString(pdf_x, pdf_y + (box_height - font_size), text) |
| |
|
| | current_y = pdf_y - 5 |
| |
|
| | if not page_created: |
| | c.setFont("Helvetica", 12) |
| | c.drawString(50, 750, "No OCR text found") |
| | c.showPage() |
| |
|
| | c.save() |
| | return pdf_path, "PDF generated successfully!" |
| |
|
| |
|
| | |
| | |
| | |
| | iface = gr.Interface( |
| | fn=generate_pdf, |
| | inputs=gr.File(file_types=[".json"], label="Upload JSON"), |
| | outputs=[gr.File(label="Download PDF"), gr.Textbox(label="Status")], |
| | title="JSON to PDF Converter", |
| | description="Upload a `results.json` file and download the generated PDF." |
| | ) |
| |
|
| | |
| | iface.launch() |
| |
|