Preeeeet's picture
Update app.py
3921b70 verified
Raw
History Blame Contribute Delete
4.55 kB
import gradio as gr
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from PIL import Image
from datetime import datetime
import os
def get_image_creation_date(img_path):
try:
img = Image.open(img_path)
exif_data = img._getexif()
if exif_data and 36867 in exif_data:
taken_date = exif_data[36867]
return datetime.strptime(taken_date, "%Y:%m:%d %H:%M:%S").strftime("%Y-%m-%d %H:%M:%S")
except Exception as e:
print(f"Error retrieving EXIF data: {e}")
creation_date = datetime.fromtimestamp(os.path.getctime(img_path))
return creation_date.strftime("%Y-%m-%d %H:%M:%S")
def process_images(images, job_number, job_name, job_address, uploader_name):
logo_path = "logo.png" # Replace with the exact name of your uploaded logo
doc = Document()
# Set narrow margins (0.5 inches or 1.27 cm on all sides)
section = doc.sections[0]
section.left_margin = Inches(0.5)
section.right_margin = Inches(0.5)
section.top_margin = Inches(0.5)
section.bottom_margin = Inches(0.5)
# Add the logo to the header
header = section.header.paragraphs[0]
run_logo = header.add_run()
run_logo.add_picture(logo_path, width=Inches(1.5)) # Logo in the header
# Add job details at the beginning of the document body
job_details = f"Job: {job_number} - {job_name}, {job_address}"
job_paragraph = doc.add_paragraph()
run_job = job_paragraph.add_run(job_details)
run_job.font.name = "Arial"
run_job.font.size = Pt(14)
run_job.bold = True
run_job.font.color.rgb = RGBColor(0, 0, 0) # Set font color to black
uploaded_date = datetime.now().strftime("%Y-%m-%d")
# Define image and metadata height requirements
image_height = 2.5 # Image height in inches
metadata_height = 1 # Metadata height in inches
# Define available page height for images (after margins and job details)
available_page_height = 10 # Rough page height available in inches (this can vary)
# Calculate the number of rows that can fit on one page
rows_per_page = available_page_height // (image_height + metadata_height)
images_per_page = int(rows_per_page * 2) # Assuming 2 columns per row
# Insert images dynamically based on calculated layout
for i in range(0, len(images), images_per_page):
table = doc.add_table(rows=int(rows_per_page), cols=2)
table.autofit = True
for j, img_file in enumerate(images[i:i+images_per_page]):
row = j // 2
col = j % 2
taken_date = get_image_creation_date(img_file)
cell = table.cell(row, col)
run = cell.paragraphs[0].add_run()
run.add_picture(img_file, width=Inches(2.5)) # Resize to fit
# Add metadata below the image with font size 9 and line spacing 1
for text in [
"Description: Describe it here!",
f"Taken Date: {taken_date}",
f"Uploaded By: {uploader_name}", # Use uploader's name from input
f"Uploaded Date: {uploaded_date}",
f"File Name: {os.path.basename(img_file)}"
]:
paragraph = cell.add_paragraph(text)
paragraph.style.font.name = "Arial"
paragraph.style.font.size = Pt(9)
paragraph.paragraph_format.line_spacing = Pt(9) # Line spacing set to 1
# Save the document
output_path = "/tmp/HKC_report_output.docx"
doc.save(output_path)
return output_path
# HTML code to display the logo and title together at the top of the Gradio interface
title_with_logo = """
<div style="text-align: center;">
<img src="file/logo.png" alt="Logo" width="100"><br>
<h1>HKC Report Generator</h1>
</div>
"""
# Create the Gradio interface with job inputs and uploader name
iface = gr.Interface(
fn=process_images,
inputs=[
gr.File(file_count="multiple", type="filepath", label="Upload Images"), # Allows multiple image uploads
gr.Textbox(label="Job Number"),
gr.Textbox(label="Job Name"),
gr.Textbox(label="Job Address"),
gr.Textbox(label="Uploader Name") # New input for uploader's name
],
outputs=gr.File(label="Download Report"),
title=title_with_logo,
description="Upload images and provide job details to generate a Word report with job information and 2x2 image layout.",
)
# Launch the app with shareable link option
iface.launch(share=True)