91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
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)
|