import base64 import datetime import os import pandas as pd from io import BytesIO from PIL import Image from reportlab.pdfgen import canvas from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase import pdfmetrics from reportlab.lib.utils import ImageReader import arabic_reshaper from bidi.algorithm import get_display shulam = " - שולם" def reshape_text(text): """Reshape Hebrew text for correct RTL display""" reshaped = arabic_reshaper.reshape(text) bidi_text = get_display(reshaped) return bidi_text def generate_signed_consent_pdf( signature_base64_data: str, participant_full_name: str, participant_id_number: str, previous_payment_choice: int, previous_payment_amount: float, phone_number: str, total_payout: float, played_date: datetime, ): phone_number = "0"+phone_number # Ensure "pdfs" folder exists output_dir = os.path.join(os.path.dirname(__file__), "pdfs") os.makedirs(output_dir, exist_ok=True) filename = f"{participant_full_name}{shulam}.pdf" #filename = f"consent_form_{participant_full_name}_{datetime.date.today().strftime('%Y%m%d')}.pdf" filepath = os.path.join(output_dir, filename) # Register font that supports Hebrew font_path = os.path.join(os.path.dirname(__file__), "fonts", "DejaVuSans.ttf") pdfmetrics.registerFont(TTFont("DejaVu", font_path)) c = canvas.Canvas(filepath) # Save directly into "pdfs" c.setFont("DejaVu", 12) width, height = 595, 842 # A4 size y = height - 50 # Title title = reshape_text("קבלה") c.setFont("DejaVu", 16) c.drawCentredString(width / 2, y, title) c.setFont("DejaVu", 12) y -= 40 # Main declaration text1 = f"הנני מצהיר/ה כי השתתפתי כנבדק במחקר." c.drawRightString(width - 40, y, reshape_text(text1)) y -= 20 text2 = "עבור השתתפותי כנבדק במחקר קיבלתי (נא לסמן במקום המתאים):" c.drawRightString(width - 40, y, reshape_text(text2)) y -= 20 payment_text = f"תשלום בסך {total_payout:.2f} ש\"ח." c.drawRightString(width - 40, y, reshape_text(payment_text)) y -= 40 # Previous payment declaration prev_header = "הנני מצהיר/ה כי בשנת המס הנוכחית:" c.drawRightString(width - 40, y, reshape_text(prev_header)) y -= 20 if previous_payment_choice == 1: prev_amount_text = f"(*) קבלתי גמול מסוג זה בסך {previous_payment_amount or '____'} ש\"ח" c.drawRightString(width - 40, y, reshape_text(prev_amount_text)) y -= 20 no_prev = "( ) לא קבלתי גמול מסוג זה בגין השתתפות במחקר זה או אחר באוניברסיטה." c.drawRightString(width - 40, y, reshape_text(no_prev)) y -= 30 else: prev_blank = "( ) קבלתי גמול מסוג זה בסך ________ ש\"ח" c.drawRightString(width - 40, y, reshape_text(prev_blank)) y -= 20 no_prev = "(*) לא קבלתי גמול מסוג זה בגין השתתפות במחקר זה או אחר באוניברסיטה." c.drawRightString(width - 40, y, reshape_text(no_prev)) y -= 30 # Disclaimer disclaimer1 = "ידוע לי כי קבלת גמול זה בגין השתתפותי במחקר אין משמעותה קיום יחסי עובד - מעביד" disclaimer2 = "ולא תהיה לי כל תביעה בהקשר זה." c.drawRightString(width - 40, y, reshape_text(disclaimer1)) y -= 20 c.drawRightString(width - 40, y, reshape_text(disclaimer2)) y -= 50 # Name, ID, Phone c.drawRightString(width - 40, y, reshape_text(f"שם: {participant_full_name or ''}")) y -= 20 c.drawRightString(width - 40, y, reshape_text(f"ת.ז. {participant_id_number or ''}")) y -= 20 c.drawRightString( width - 40, y, reshape_text(f"מספר טלפון לקבלת התשלום (יועבר בביט): {phone_number or ''}"), ) y -= 50 # Date and signature line date_text = reshape_text(f"תאריך: {played_date.strftime('%d/%m/%Y')}") signature_line = reshape_text("חתימה: _______________") c.drawRightString(width / 2 - 10, y, date_text) c.drawRightString(width - 40, y, signature_line) # Add signature if exists if signature_base64_data: try: if "," in signature_base64_data: _, encoded_data = signature_base64_data.split(",", 1) else: encoded_data = signature_base64_data img_data = base64.b64decode(encoded_data) img_buffer = BytesIO(img_data) img = Image.open(img_buffer) img = img.convert("RGBA") background = Image.new("RGBA", img.size, (255, 255, 255, 255)) background.paste(img, mask=img) img_rgb = background.convert("RGB") final_img_buffer = BytesIO() img_rgb.save(final_img_buffer, format="PNG") final_img_buffer.seek(0) img_reader = ImageReader(final_img_buffer) c.drawImage(img_reader, width - 160, y, width=80, height=40, mask="auto") except Exception as e: print(f"Error adding signature: {e}") error_text = reshape_text("[חתימה לא נקלטה]") c.drawRightString(width - 40, y, error_text) c.showPage() c.save() print(f"PDF saved as: {filepath}") excel_path = "sig info.xlsx" df = pd.read_excel(excel_path) for _, row in df.iterrows(): generate_signed_consent_pdf( signature_base64_data=row.get("sig_app.1.player.signature_base64", ""), participant_full_name=row["sig_app.1.player.participant_full_name"], participant_id_number=row["sig_app.1.player.participant_id_number"], previous_payment_choice=int(row["sig_app.1.player.previous_payment_choice"]), previous_payment_amount=float(row.get("sig_app.1.player.previous_payment_amount", 0)), phone_number=str(row.get("sig_app.1.player.phone_number", "")), total_payout=float(row["participant.payoff"]), played_date=row["participant.time_started_utc"], )