import os import time import csv import base64 from io import BytesIO from dotenv import load_dotenv from pdf2image import convert_from_path from PIL import Image from openai import OpenAI load_dotenv() client = OpenAI(api_key=os.getenv("OPEN_AI_KEY")) def convert_pdf_to_images(pdf_path, dpi=144): print(f"Konvertiere PDF '{pdf_path}' in Bilder...") if not os.path.exists(pdf_path): raise FileNotFoundError(f"Die PDF-Datei '{pdf_path}' wurde nicht gefunden.") if not pdf_path.lower().endswith('.pdf'): raise ValueError("Die angegebene Datei ist keine PDF-Datei.") if not os.path.isfile(pdf_path): raise ValueError(f"Die angegebene Datei '{pdf_path}' ist kein gültiger Pfad.") return convert_from_path(pdf_path, dpi=dpi) def image_to_base64(img: Image.Image) -> str: buf = BytesIO() img.save(buf, format="PNG") return base64.b64encode(buf.getvalue()).decode("utf-8") def analyze_image(img_b64: str, prompt: str) -> str: print("Sende Bild zur Analyse...") if not img_b64: raise ValueError("Das Bild ist leer oder ungültig.") resp = client.chat.completions.create( model="gpt-4.1-mini", messages=[ { "role": "user", "content": [ {"type": "text", "text": prompt}, { "type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_b64}"}, }, ], } ], max_tokens=1000, ) print(resp) return resp.choices[0].message.content def analyze_pdf(pdf_path: str, prompt: str, csv_path="auswertung.csv", delay=2): imgs = convert_pdf_to_images(pdf_path) with open(csv_path, "w", newline="", encoding="utf-8") as f: w = csv.writer(f) w.writerow(["Seite", "Ergebnis"]) pdf_start = int(os.getenv("PDF_START", 1)) pdf_end = int(os.getenv("PDF_END", len(imgs))) print(f"Analysiere Seiten {pdf_start} bis {pdf_end} von {len(imgs)} Seiten...") if pdf_start < 1 or pdf_end > len(imgs): print("Ungültiger Seitenbereich. Bitte überprüfe die Umgebungsvariablen PDF_START und PDF_END.") return for i in range(pdf_start - 1, min(pdf_end + 1, len(imgs))): img = imgs[i] try: b64 = image_to_base64(img) res = analyze_image(b64, prompt) if res: print(f"Seite {i+1}: Ergebnis gefunden") w.writerow([i+1, res]) else: print(f"Seite {i+1}: Kein Ergebnis") except Exception as e: w.writerow([i+1, f"Fehler: {e}"]) time.sleep(delay) if __name__ == "__main__": print("Starte PDF-Analyse...") pdf_path = os.getenv("PDF_PATH", "example.pdf") if not os.path.exists(pdf_path): print(f"PDF-Datei '{pdf_path}' nicht gefunden.") exit(1) prompt = open("prompt.txt", encoding="utf-8").read().strip() analyze_pdf(pdf_path, prompt)