InfluenceAnalyzerDemo / modules /pdf_report.py
teoaivalis's picture
Update modules/pdf_report.py
1fcfcb5 verified
Raw
History Blame Contribute Delete
3.08 kB
from fpdf import FPDF
import requests
from PIL import Image
from io import BytesIO
import datetime
def create_pdf_report(prompt, user_image, top_results):
pdf = FPDF()
pdf.set_auto_page_break(auto=True, margin=15)
# ---------------------------------
# Page 1: Cover + Prompt + Gen Image
# ---------------------------------
pdf.add_page()
# Title
pdf.set_font("Arial", 'B', 24)
pdf.cell(0, 15, "Search-Based Influence Analyzer", ln=True, align="L")
# Description
pdf.set_font("Arial", '', 12)
pdf.ln(10)
description = (
"This tool analyzes your generated image and finds the most similar "
"public web images using DuckDuckGo search and semantic embeddings."
)
pdf.multi_cell(0, 10, description)
# Prompt box
pdf.ln(8)
pdf.set_font("Arial", 'B', 14)
pdf.cell(0, 10, "Prompt:", ln=True)
pdf.set_fill_color(240, 240, 240)
pdf.set_font("Arial", '', 12)
pdf.multi_cell(0, 10, prompt, fill=True)
# Generated Image
pdf.ln(8)
pdf.set_font("Arial", 'B', 14)
pdf.cell(0, 10, "Generated Image:", ln=True)
user_image.save("temp_input.jpg")
img_w, img_h = user_image.size
max_w = 160
scale = max_w / img_w
scaled_w = img_w * scale
scaled_h = img_h * scale
x_center = (210 - scaled_w) / 2
pdf.image("temp_input.jpg", x=x_center, y=None, w=scaled_w)
# ---------------------------------
# Page 2: Top Similar Images
# ---------------------------------
pdf.add_page()
pdf.set_font("Arial", 'B', 16)
pdf.cell(0, 10, "Top Similar Images:", ln=True)
pdf.ln(5)
# Grid settings
col_width = 90
row_height = 60
margin = 10
spacing = 10
x_start = margin
y = pdf.get_y()
col = 0
for i, (url, sim) in enumerate(top_results):
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
img = Image.open(BytesIO(response.content)).convert("RGB")
temp_filename = f"temp_sim_{i}.jpg"
img.save(temp_filename)
scaled_w = col_width
scaled_h = row_height
x = x_start + col * (col_width + spacing)
pdf.image(temp_filename, x=x, y=y, w=scaled_w, h=scaled_h)
# Caption
pdf.set_xy(x, y + scaled_h + 2)
pdf.set_font("Arial", '', 12)
pdf.cell(col_width, 10, f"Similarity: {sim:.3f}", ln=0, align="C")
col += 1
if col >= 2:
col = 0
y += scaled_h + 20
pdf.set_y(y)
pdf.set_x(x_start)
except Exception as e:
print(f"⚠️ Error loading image {url}: {e}")
continue
# Footer with date
pdf.set_y(-15)
pdf.set_font("Arial", 'I', 9)
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
pdf.cell(0, 10, f"Report generated on {timestamp}", 0, 0, "C")
return pdf.output(dest="S").encode("latin1")