gpt-4o-mini WebApp funktioniert nicht mehr?
Verfasst: Montag 18. November 2024, 12:34
Ich baue derzeit eine Web-App zur Generierung von Karteikarten auf Basis der OpenAI API. Diese soll u.a. auch Lernkarten aus handschriftlichen Notizen generieren. Als Grundlage habe ich einen Python-Code zum Testen geschrieben:
Mit diesem Code funktioniert alles perfekt. Jetzt habe ich auch einen PHP-Code für meine Website geschrieben:
Die Erstellung von Karteikarten auf der Basis von handschriftlichen Notizen hat in den letzten Wochen auch mit diesem Code funktioniert. Nun habe ich aber das Problem, dass ich nur pdf's mit handschriftlichen Notizen von bis zu 5 Seiten verarbeiten kann. Bei mehr als 6 Seiten bekomme ich die Fehlermeldung 'Ein Fehler ist aufgetreten! Versuchen Sie es erneut.' angezeigt. Die API funktioniert, weil sie in normalem Python-Code funktioniert. Ich habe auch max_tokens geändert, aber leider ohne Erfolg.
Wie gesagt, das Fragwürdige daran ist, dass es letzte Woche noch funktionierte. Seitdem habe ich meinen php-Code stark verändert, aber selbst mit dem Code von letzter Woche funktioniert es nicht mehr. Ich habe auch alle optischen Merkmale meiner Webapp-Version entfernt, wie den lila Hintergrund oder die Integration meines Logos. Aber auch das hat nicht geholfen.
Hat jemand eine Idee, was das Problem sein könnte?
Code: Alles auswählen
from PyPDF2 import PdfReader
from fpdf import FPDF
import re
import openai
from openai import OpenAI
def extract_text_from_pdf(pdf_path):
text = ""
try:
with open(pdf_path, 'rb') as file:
reader = PdfReader(file)
for page in reader.pages:
text += page.extract_text() + "\n"
except Exception as e:
print(f"Fehler beim Extrahieren des Textes: {e}")
return text
def generiere_karteikarten(text, anzahl_karteikarten):
# System-Prompt definieren
system_prompt = f"""
You are an AI model specializing in creating flashcards in a question-answer format from PDF documents.
Task: Go through the provided text and extract key concepts, definitions, facts, and critical information. Create {anzahl_karteikarten} flashcards in a question-answer format, maintaining the order of the original document.
Instructions:
• Sequential Processing: Start at the beginning of the text and work sequentially to the end.
• Select Relevant Information: Identify the most important learning points suitable for flashcards.
• Question-Answer Creation:
• Question: Formulate a clear and concise question that tests the understanding of the key concept.
• Answer: Provide an accurate and brief answer to the posed question.
• Formatting:
• Write each question starting with 'Q:' and each answer with 'A:'.
• Separate each question-answer pair with an empty line.
• No Additional Information: Do not add any additional comments, explanations, or meta-descriptions. Provide only the question-answer pairs in the specified format.
Goal: At the end, there should be {anzahl_karteikarten} flashcards covering the content of the text and in the correct order of the document, so they can be easily matched with the original text.
Note: Process the text in its original language and generate the flashcards in the same language.
"""
client = OpenAI(
# This is the default and can be omitted
api_key="**************",
)
# OpenAI API-Aufruf mit aktualisierter Syntax
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": text}
],
max_tokens=1500, # Passe die Token-Anzahl nach Bedarf an
temperature=0.7
)
karteikarten = response.choices[0].message.content # Korrekte Zugriffsmethode
return karteikarten
def erstelle_fragen_antworten_pdf(text, pdf_datei_name):
muster = r'(Frage:|Antwort:)(.*?)(?=(Frage:|Antwort:|$))'
abschnitte = re.findall(muster, text, re.DOTALL)
inhalte = []
for abschnitt in abschnitte:
keyword = abschnitt[0].strip()
inhalt = abschnitt[1].strip()
if inhalt:
gesamter_inhalt = f"{keyword} {inhalt}"
inhalte.append(gesamter_inhalt)
pdf = FPDF()
pdf.set_auto_page_break(auto=False)
for inhalt in inhalte:
pdf.add_page()
pdf.set_font("Arial", 'B', 20)
pdf.set_xy(10, 10)
seitenbreite = pdf.w - 20 # 10 mm Rand auf jeder Seite
# Text in Zeilen aufteilen, um die Höhe zu berechnen
lines = pdf.multi_cell(seitenbreite, 10, inhalt, align='C', split_only=True)
text_hoehe = len(lines) * 10
# Y-Position anpassen, um vertikal zu zentrieren
y = (pdf.h - text_hoehe) / 2
pdf.set_y(y)
pdf.multi_cell(seitenbreite, 10, inhalt, align='C')
pdf.output(pdf_datei_name)
# Hauptprogramm
if __name__ == "__main__":
# Pfad zur PDF-Datei eingeben
pdf_file_path = input("Bitte geben Sie den Pfad zur PDF-Datei ein: ")
# Text aus PDF extrahieren
extracted_text = extract_text_from_pdf(pdf_file_path)
# Anzahl der Seiten in der PDF ermitteln
reader = PdfReader(pdf_file_path)
anzahl_seiten = len(reader.pages)
anzahl_karteikarten = anzahl_seiten // 2 # Hälfte der Seitenanzahl
# Karteikarten generieren
karteikarten_text = generiere_karteikarten(extracted_text, anzahl_karteikarten)
# Karteikarten als PDF erstellen
erstelle_fragen_antworten_pdf(karteikarten_text, 'karteikarten.pdf')
print("Die Karteikarten-PDF wurde erfolgreich erstellt.")
Code: Alles auswählen
// FPDF-Bibliothek einbinden
require_once get_template_directory() . '/libs/fpdf/fpdf.php';
// Autoloader für Smalot\PdfParser
spl_autoload_register(function ($class) {
$prefix = 'Smalot\\PdfParser\\';
$base_dir = get_template_directory() . '/libs/pdfparser/src/Smalot/PdfParser/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// Klasse gehört nicht zum Namespace Smalot\PdfParser
return;
}
// Relativen Klassennamen erhalten
$relative_class = substr($class, $len);
// Namespace-Trenner durch Verzeichnis-Trenner ersetzen und .php anhängen
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// Datei einbinden, falls sie existiert
if (file_exists($file)) {
require $file;
}
});
// Die benötigten Klassen verwenden
use Smalot\PdfParser\Parser;
// OpenAI API Schlüssel
define('OPENAI_API_KEY', '**************'); // Ersetzen Sie diesen Platzhalter durch Ihren API-Schlüssel
// Erweiterte FPDF-Klasse mit abgerundeten Rechtecken und Footer
class PDF extends FPDF {
function RoundedRect($x, $y, $w, $h, $r, $style = '') {
$k = $this->k;
$hp = $this->h;
if ($style == 'F')
$op = 'f';
elseif ($style == 'FD' || $style == 'DF')
$op = 'B';
else
$op = 'S';
$MyArc = 4/3 * (sqrt(2) - 1);
$this->_out(sprintf('%.2F %.2F m', ($x+$r)*$k, ($hp-$y)*$k ));
$xc = $x+$w-$r;
$yc = $y+$r;
$this->_out(sprintf('%.2F %.2F l', $xc*$k, ($hp-$y)*$k ));
$this->_Arc($xc+$r*$MyArc, $yc-$r, $xc+$r, $yc-$r*$MyArc, $xc+$r, $yc);
$xc = $x+$w-$r;
$yc = $y+$h-$r;
$this->_out(sprintf('%.2F %.2F l', ($x+$w)*$k, ($hp-$yc)*$k));
$this->_Arc($xc+$r, $yc+$r*$MyArc, $xc+$r*$MyArc, $yc+$r, $xc, $yc+$r);
$xc = $x+$r;
$yc = $y+$h-$r;
$this->_out(sprintf('%.2F %.2F l', $xc*$k, ($hp-($y+$h))*$k));
$this->_Arc($xc-$r*$MyArc, $yc+$r, $xc-$r, $yc+$r*$MyArc, $xc-$r, $yc);
$xc = $x+$r;
$yc = $y+$r;
$this->_out(sprintf('%.2F %.2F l', ($x)*$k, ($hp-$yc)*$k ));
$this->_Arc($xc-$r, $yc-$r*$MyArc, $xc-$r*$MyArc, $yc-$r, $xc, $yc-$r);
$this->_out($op);
}
function _Arc($x1, $y1, $x2, $y2, $x3, $y3) {
$h = $this->h;
$this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c',
$x1*$this->k, ($h-$y1)*$this->k,
$x2*$this->k, ($h-$y2)*$this->k,
$x3*$this->k, ($h-$y3)*$this->k));
}
function NbLines($w, $txt) {
// Berechnet die Anzahl der Zeilen, die eine MultiCell mit Breite w benötigt
$cw = &$this->CurrentFont['cw'];
if($w==0)
$w = $this->w-$this->rMargin-$this->x;
$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
$s = str_replace("\r",'',$txt);
$nb = strlen($s);
if($nb>0 and $s[$nb-1]=="\n")
$nb--;
$sep = -1;
$i = 0;
$j = 0;
$l = 0;
$nl = 1;
while($i<$nb) {
$c = $s[$i];
if($c=="\n") {
$i++;
$sep = -1;
$j = $i;
$l = 0;
$nl++;
continue;
}
if($c==' ')
$sep = $i;
$l += isset($cw[$c]) ? $cw[$c] : 0;
if($l>$wmax) {
if($sep==-1) {
if($i==$j)
$i++;
} else
$i = $sep+1;
$sep = -1;
$j = $i;
$l = 0;
$nl++;
} else
$i++;
}
return $nl;
}
function Footer() {
// Position 15 mm vom unteren Rand
$this->SetY(-15);
// Schriftart setzen (eine Schriftart wählen, die das "©"-Symbol unterstützt)
$this->SetFont('Arial', 'I', 8);
// Textfarbe setzen
$this->SetTextColor(128, 128, 128);
// Footer-Text definieren
$footer_text = '©2024 learncardai. All rights reserved';
// Text konvertieren, um die Kodierung anzupassen
$footer_text = mb_convert_encoding($footer_text, 'ISO-8859-1', 'UTF-8');
// Footer-Text hinzufügen
$this->Cell(0, 10, $footer_text, 0, 0, 'L');
}
}
// Funktion zum Extrahieren von Text aus PDF
function extract_text_from_pdf($pdf_path) {
$parser = new Parser();
try {
$pdf = $parser->parseFile($pdf_path);
$text = $pdf->getText();
} catch (Exception $e) {
return 'Fehler beim Extrahieren des Textes: ' . $e->getMessage();
}
return $text;
}
// Funktion zum Generieren von Karteikarten via OpenAI
function generiere_karteikarten($text, $anzahl_karteikarten) {
$system_prompt = "
You are an AI model specializing in creating flashcards in a question-answer format from PDF documents.
Task: Go through the provided text and extract key concepts, definitions, facts, and critical information. Create {$anzahl_karteikarten} flashcards in a question-answer format, maintaining the order of the original document.
Instructions:
• Sequential Processing: Start at the beginning of the text and work sequentially to the end.
• Select Relevant Information: Identify the most important learning points suitable for flashcards.
• Question-Answer Creation:
• Question: Formulate a clear and concise question that tests the understanding of the key concept.
• Answer: Provide an accurate and brief answer to the posed question.
• Formatting:
• Write each question starting with 'Q:' and each answer with 'A:'.
• Separate each question-answer pair with an empty line.
• No Additional Information: Do not add any additional comments, explanations, or meta-descriptions. Provide only the question-answer pairs in the specified format.
Goal: At the end, there should be {$anzahl_karteikarten} flashcards covering the content of the text and in the correct order of the document, so they can be easily matched with the original text.
Note: Process the text in its original language and generate the flashcards in the same language.
";
// OpenAI API Anfrage
$ch = curl_init();
$data = [
'model' => 'gpt-4o-mini',
'messages' => [
['role' => 'system', 'content' => $system_prompt],
['role' => 'user', 'content' => $text]
],
'max_tokens' => 6000,
'temperature' => 0.7
];
curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/chat/completions");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Authorization: Bearer " . OPENAI_API_KEY
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response = curl_exec($ch);
if (curl_errno($ch)) {
return 'Request Error:' . curl_error($ch);
}
curl_close($ch);
$response_data = json_decode($response, true);
if (isset($response_data['choices'][0]['message']['content'])) {
return $response_data['choices'][0]['message']['content'];
} else {
return 'API Response Error';
}
}
// Funktion zum Erstellen der Flashcard PDF
function erstelle_fragen_antworten_pdf($text, $pdf_datei_name) {
$muster = '/(Q:|A:)(.*?)(?=(Q:|A:|$))/s';
preg_match_all($muster, $text, $abschnitte, PREG_SET_ORDER);
$qa_pairs = array();
$current_item = array();
foreach ($abschnitte as $abschnitt) {
$keyword = trim($abschnitt[1]);
$inhalt = trim($abschnitt[2]);
if ($keyword == 'Q:') {
$current_item = array();
$current_item['Q'] = $inhalt;
} elseif ($keyword == 'A:' && isset($current_item['Q'])) {
$current_item['A'] = $inhalt;
$qa_pairs[] = $current_item;
$current_item = array();
}
}
$pdf = new PDF();
$pdf->SetAutoPageBreak(false);
// Pfad zu Ihrem Logo
$logo_path = ABSPATH . 'wp-content/logo.png';
foreach ($qa_pairs as $pair) {
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 20);
// Fügen Sie Ihr Logo oben rechts hinzu
$logo_width = 30; // Breite des Logos in mm
$logo_height = 0; // Höhe proportional skalieren
$x_logo = $pdf->GetPageWidth() - $logo_width - 10; // 10 mm Rand rechts
$y_logo = 10; // 10 mm von oben
// Logo hinzufügen
if (file_exists($logo_path)) {
$pdf->Image($logo_path, $x_logo, $y_logo, $logo_width, $logo_height);
}
// Verarbeiten der Frage
$question = 'Q: ' . $pair['Q'];
$question_iso = mb_convert_encoding($question, 'ISO-8859-1', 'UTF-8');
// Verarbeiten der Antwort
$answer = 'A: ' . $pair['A'];
$answer_iso = mb_convert_encoding($answer, 'ISO-8859-1', 'UTF-8');
// Maximale Textbreite
$max_text_width = 150; // in mm
// Einstellungen für die Frage
$line_height = 10;
$text_width = $max_text_width;
$nb_lines_q = $pdf->NbLines($text_width, $question_iso);
$text_height_q = $nb_lines_q * $line_height;
$rect_width_q = $text_width + 20;
$rect_height_q = $text_height_q + 20;
$page_width = $pdf->GetPageWidth();
$x_rect_q = ($page_width - $rect_width_q) / 2;
$y_rect_q = 50; // Abstand von oben
// Einstellungen für die Antwort
$nb_lines_a = $pdf->NbLines($text_width, $answer_iso);
$text_height_a = $nb_lines_a * $line_height;
$rect_width_a = $text_width + 20;
$rect_height_a = $text_height_a + 20;
$x_rect_a = ($page_width - $rect_width_a) / 2;
$y_rect_a = $pdf->GetPageHeight() - $rect_height_a - 50; // Abstand von unten
// Zeichnen des Rechtecks für die Frage
$pdf->SetFillColor(118, 120, 237); // Lila Farbe
$pdf->SetTextColor(255, 255, 255); // Weißer Text
$pdf->RoundedRect($x_rect_q, $y_rect_q, $rect_width_q, $rect_height_q, 10, 'F');
$pdf->SetXY($x_rect_q + 10, $y_rect_q + 10);
$pdf->MultiCell($text_width, $line_height, $question_iso, 0, 'C');
// Zeichnen des Rechtecks für die Antwort
$pdf->RoundedRect($x_rect_a, $y_rect_a, $rect_width_a, $rect_height_a, 10, 'F');
$pdf->SetXY($x_rect_a + 10, $y_rect_a + 10);
$pdf->MultiCell($text_width, $line_height, $answer_iso, 0, 'C');
// Textfarbe zurücksetzen
$pdf->SetTextColor(0, 0, 0);
}
// Speichere das PDF in den Uploads-Ordner
$upload_dir = wp_upload_dir();
$pdf_path = $upload_dir['path'] . '/' . $pdf_datei_name;
$pdf->Output('F', $pdf_path);
// Rückgabe des Pfades
return $upload_dir['url'] . '/' . $pdf_datei_name;
}
// Shortcode zur Anzeige des Flashcard-Generators
function flashcard_generator_shortcode() {
ob_start();
?>
<!-- Stildefinitionen -->
<style>
.btn {
background-color: #6366f1;
color: #fff;
border: none;
padding: 10px 20px;
cursor: pointer;
font-size: 16px;
margin-right: 10px;
border-radius: 5px;
}
.btn:hover {
background-color: #4f46e5;
}
/* Deaktivierter Button */
.btn:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
/* Spinner-Stile */
.spinner-overlay {
display: none;
margin-left: 10px;
vertical-align: middle;
}
.spinner {
border: 8px solid #f3f3f3;
border-top: 8px solid #6366f1;
border-radius: 50%;
width: 30px;
height: 30px;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Stil für die Meldung */
#file-selected {
font-size: 16px;
margin-top: 10px;
color: black;
text-align: center;
display: block;
}
/* Container für die Buttons */
#button-container {
text-align: center;
}
/* Stil für den Download-Button */
.download-button {
background-color: #fcd34d;
color: #fff;
border: none;
padding: 10px 20px;
cursor: pointer;
font-size: 16px;
margin-top: 10px;
border-radius: 5px;
text-decoration: none;
display: inline-block;
}
.download-button:hover {
background-color: #fbbf24;
}
</style>
<form id="flashcard-form" enctype="multipart/form-data">
<div id="button-container">
<!-- Benutzerdefinierter "Upload PDF" Button -->
<button type="button" class="btn" id="upload-button">Upload PDF</button>
<!-- "Create" Button (standardmäßig deaktiviert) -->
<button type="submit" class="btn" id="submit-button" disabled>Create</button>
<!-- Lade-Spinner neben dem Button -->
<div class="spinner-overlay" id="loading-spinner">
<div class="spinner"></div>
</div>
<!-- Anzeige der Meldung -->
<span id="file-selected"></span>
</div>
<!-- Verstecktes File-Input -->
<input type="file" id="pdf-upload" name="pdf-upload" accept=".pdf" required style="display:none;">
</form>
<div class="output-section" style="text-align: center;"></div>
<script>
// Event-Listener für den "Upload PDF" Button
document.getElementById('upload-button').addEventListener('click', function() {
document.getElementById('pdf-upload').click();
});
// Anzeige der Erfolgsmeldung und Aktivieren des "Create"-Buttons
document.getElementById('pdf-upload').addEventListener('change', function() {
if (this.files && this.files.length > 0) {
document.getElementById('file-selected').textContent = 'Successfully uploaded';
document.getElementById('submit-button').disabled = false; // "Create"-Button aktivieren
}
});
// Event-Listener für das Formular
document.getElementById('flashcard-form').addEventListener('submit', function(event) {
event.preventDefault(); // Standardformularübermittlung verhindern
// Lade-Spinner anzeigen
document.getElementById('loading-spinner').style.display = 'inline-block';
// Submit-Button deaktivieren
document.getElementById('submit-button').disabled = true;
// Formulardaten sammeln
var formData = new FormData(this);
formData.append('action', 'generate_flashcards');
// AJAX-Anfrage senden
var xhr = new XMLHttpRequest();
xhr.open('POST', '<?php echo admin_url('admin-ajax.php'); ?>', true);
xhr.onload = function () {
if (xhr.status === 200) {
// Antwort verarbeiten
document.querySelector('.output-section').innerHTML = xhr.responseText;
// Lade-Spinner ausblenden
document.getElementById('loading-spinner').style.display = 'none';
// Upload-Button aktivieren und Meldung zurücksetzen
document.getElementById('upload-button').disabled = false;
document.getElementById('file-selected').textContent = '';
// Submit-Button deaktiviert lassen
document.getElementById('submit-button').disabled = true;
} else {
alert('An error occurred! Try it again.');
// Lade-Spinner ausblenden
document.getElementById('loading-spinner').style.display = 'none';
document.getElementById('submit-button').disabled = false;
}
};
xhr.onerror = function () {
alert('An error occurred! Try it again.');
// Lade-Spinner ausblenden
document.getElementById('loading-spinner').style.display = 'none';
document.getElementById('submit-button').disabled = false;
};
xhr.send(formData);
// Upload-Button deaktivieren (nach dem Senden der Anfrage)
xhr.addEventListener('loadstart', function() {
document.getElementById('upload-button').disabled = true;
});
});
</script>
<?php
return ob_get_clean();
}
add_shortcode('flashcard_generator', 'flashcard_generator_shortcode');
// AJAX Handler (nur für eingeloggte Benutzer)
add_action('wp_ajax_generate_flashcards', 'generate_flashcards_callback');
function generate_flashcards_callback() {
// Überprüfen, ob der Benutzer eingeloggt ist
$current_user = wp_get_current_user();
if (0 == $current_user->ID) {
echo 'You must be logged in to use this service.';
wp_die();
}
// Überprüfen, ob der Benutzer Administrator ist
if (current_user_can('administrator')) {
$prompt_limit = 9999999;
} else {
// Überprüfen, ob das Paid Member Subscriptions Plugin aktiv ist
if (!function_exists('pms_get_member_subscriptions')) {
echo 'Subscription functionality is not available.';
wp_die();
}
// Aktives Abonnement des Benutzers abrufen
$member_subscriptions = pms_get_member_subscriptions(array('user_id' => $current_user->ID, 'status' => 'active'));
if (empty($member_subscriptions)) {
echo 'You do not have an active subscription. Register and sign up for a subscription to get access.';
wp_die();
}
// Abonnement-Plan des Benutzers abrufen
$subscription_plan_id = $member_subscriptions[0]->subscription_plan_id;
$subscription_plan = pms_get_subscription_plan($subscription_plan_id);
$subscription_plan_name = $subscription_plan->name;
// Prompt-Limit basierend auf dem Abonnement festlegen
switch ($subscription_plan_name) {
case 'Basic':
$prompt_limit = 10;
break;
case 'Pro':
$prompt_limit = 30;
break;
case 'Group':
case 'Exam Pass':
$prompt_limit = 50;
break;
default:
echo 'Your subscription does not allow generating prompts.';
wp_die();
}
}
// Aktuellen Monat abrufen
$current_month = date('Y-m');
// Prompt-Nutzung des Benutzers abrufen
$usage_month = get_user_meta($current_user->ID, 'prompt_usage_month', true);
$prompt_usage = get_user_meta($current_user->ID, 'prompt_usage_count', true);
// Wenn der Monat gewechselt hat, Zähler zurücksetzen
if ($usage_month != $current_month) {
$prompt_usage = 0;
update_user_meta($current_user->ID, 'prompt_usage_month', $current_month);
update_user_meta($current_user->ID, 'prompt_usage_count', $prompt_usage);
}
// Überprüfen, ob das Limit erreicht wurde
if ($prompt_usage >= $prompt_limit) {
echo 'You have reached your monthly limit of ' . $prompt_limit . ' prompts.';
wp_die();
}
// Prompt-Nutzung erhöhen
$prompt_usage++;
update_user_meta($current_user->ID, 'prompt_usage_count', $prompt_usage);
// Verarbeitung der hochgeladenen Datei
if (isset($_FILES['pdf-upload']) && $_FILES['pdf-upload']['error'] == 0) {
$uploaded_file = $_FILES['pdf-upload']['tmp_name'];
$original_name = basename($_FILES['pdf-upload']['name']);
$upload_dir = wp_upload_dir();
$target_file = $upload_dir['path'] . '/' . $original_name;
// Verschiebe die hochgeladene Datei
if (move_uploaded_file($uploaded_file, $target_file)) {
// Extrahiere Text aus PDF
$extracted_text = extract_text_from_pdf($target_file);
// Bestimme die Anzahl der Karteikarten (hier: Seitenanzahl / 2)
$parser = new Parser();
try {
$pdf = $parser->parseFile($target_file);
$anzahl_seiten = count($pdf->getPages());
$anzahl_karteikarten = max(1, floor($anzahl_seiten / 1)); // Mindestens 1
} catch (Exception $e) {
echo 'Error! Files could not be read: ' . $e->getMessage();
wp_die();
}
// Generiere Karteikarten
$karteikarten_text = generiere_karteikarten($extracted_text, $anzahl_karteikarten);
// Erstelle die Flashcard PDF
$pdf_datei_name = 'karteikarten_' . time() . '.pdf';
$pdf_url = erstelle_fragen_antworten_pdf($karteikarten_text, $pdf_datei_name);
// Anzeige-Link zur herunterladbaren PDF
echo '<p>The flashcards were successfully created!</p>';
echo '<a href="' . esc_url($pdf_url) . '" class="download-button" target="_blank">Download Flashcards</a>';
} else {
echo 'Error! Files could not be read.';
}
} else {
echo 'Please upload a valid PDF file';
}
wp_die(); // Wichtig, um sofort zu beenden und eine korrekte Antwort zu senden
}
Wie gesagt, das Fragwürdige daran ist, dass es letzte Woche noch funktionierte. Seitdem habe ich meinen php-Code stark verändert, aber selbst mit dem Code von letzter Woche funktioniert es nicht mehr. Ich habe auch alle optischen Merkmale meiner Webapp-Version entfernt, wie den lila Hintergrund oder die Integration meines Logos. Aber auch das hat nicht geholfen.
Hat jemand eine Idee, was das Problem sein könnte?