modified: QUICKSTART.md
modified: app.py new file: start.bat modified: static/js/pdf-tools.js
This commit is contained in:
176
app.py
176
app.py
@@ -205,8 +205,14 @@ def upload_pdf():
|
||||
page_count = len(pdf_reader.pages)
|
||||
|
||||
# PDF Vorschau erstellen
|
||||
print(f"Erstelle Vorschau für: {unique_filename}")
|
||||
preview_filename = create_pdf_preview(unique_filename)
|
||||
|
||||
if preview_filename:
|
||||
print(f"Vorschau erfolgreich erstellt: {preview_filename}")
|
||||
else:
|
||||
print("Vorschau-Erstellung fehlgeschlagen, verwende Fallback")
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'filename': unique_filename,
|
||||
@@ -214,7 +220,8 @@ def upload_pdf():
|
||||
'page_count': page_count,
|
||||
'size': os.path.getsize(file_path),
|
||||
'preview': preview_filename,
|
||||
'rotation': 0 # Standardrotation
|
||||
'rotation': 0, # Standardrotation
|
||||
'has_preview': preview_filename is not None
|
||||
})
|
||||
|
||||
return jsonify({'error': 'Nur PDF-Dateien sind erlaubt'}), 400
|
||||
@@ -227,22 +234,110 @@ def create_pdf_preview(pdf_filename):
|
||||
try:
|
||||
pdf_path = os.path.join(UPLOAD_FOLDER, pdf_filename)
|
||||
|
||||
# PDF zu Bild konvertieren (nur erste Seite)
|
||||
images = pdf2image.convert_from_path(pdf_path, first_page=1, last_page=1, dpi=150)
|
||||
# Vorschau-Dateiname generieren
|
||||
preview_filename = f"preview_{pdf_filename.rsplit('.', 1)[0]}.png"
|
||||
preview_path = os.path.join(UPLOAD_FOLDER, preview_filename)
|
||||
|
||||
if images:
|
||||
# Vorschau-Dateiname generieren
|
||||
preview_filename = f"preview_{pdf_filename.rsplit('.', 1)[0]}.png"
|
||||
preview_path = os.path.join(UPLOAD_FOLDER, preview_filename)
|
||||
# PDF zu Bild konvertieren (nur erste Seite)
|
||||
try:
|
||||
# Versuche mit pdf2image (benötigt Poppler)
|
||||
images = pdf2image.convert_from_path(
|
||||
pdf_path,
|
||||
first_page=1,
|
||||
last_page=1,
|
||||
dpi=150,
|
||||
fmt='PNG'
|
||||
)
|
||||
|
||||
# Bild speichern
|
||||
images[0].save(preview_path, 'PNG')
|
||||
return preview_filename
|
||||
if images:
|
||||
# Bild speichern
|
||||
images[0].save(preview_path, 'PNG')
|
||||
print(f"PDF-Vorschau erstellt: {preview_filename}")
|
||||
return preview_filename
|
||||
|
||||
except ImportError:
|
||||
print("pdf2image nicht verfügbar - PDF-Vorschau übersprungen")
|
||||
return None
|
||||
except Exception as pdf2image_error:
|
||||
print(f"pdf2image Fehler: {str(pdf2image_error)}")
|
||||
|
||||
# Fallback: Versuche mit PyPDF2 + reportlab eine einfache Vorschau zu erstellen
|
||||
try:
|
||||
return create_simple_pdf_preview(pdf_path, preview_path, pdf_filename)
|
||||
except Exception as fallback_error:
|
||||
print(f"Fallback Fehler: {str(fallback_error)}")
|
||||
return None
|
||||
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Erstellen der PDF-Vorschau: {str(e)}")
|
||||
print(f"Allgemeiner Fehler beim Erstellen der PDF-Vorschau: {str(e)}")
|
||||
return None
|
||||
|
||||
def create_simple_pdf_preview(pdf_path, preview_path, pdf_filename):
|
||||
"""Erstellt eine einfache Text-basierte PDF-Vorschau als Fallback"""
|
||||
try:
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
# Lese PDF-Informationen
|
||||
with open(pdf_path, 'rb') as pdf_file:
|
||||
pdf_reader = PyPDF2.PdfReader(pdf_file)
|
||||
page_count = len(pdf_reader.pages)
|
||||
|
||||
# Versuche Text der ersten Seite zu extrahieren
|
||||
first_page_text = ""
|
||||
if page_count > 0:
|
||||
try:
|
||||
first_page_text = pdf_reader.pages[0].extract_text()[:200]
|
||||
except:
|
||||
first_page_text = "PDF-Inhalt"
|
||||
|
||||
# Erstelle ein einfaches Vorschaubild
|
||||
img = Image.new('RGB', (300, 400), color='white')
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
# Versuche Standard-Font zu laden
|
||||
try:
|
||||
font = ImageFont.truetype("arial.ttf", 12)
|
||||
title_font = ImageFont.truetype("arial.ttf", 16)
|
||||
except:
|
||||
font = ImageFont.load_default()
|
||||
title_font = ImageFont.load_default()
|
||||
|
||||
# Zeichne PDF-Vorschau
|
||||
draw.rectangle([(10, 10), (290, 390)], outline='black', width=2)
|
||||
draw.text((20, 20), f"PDF: {pdf_filename}", fill='black', font=title_font)
|
||||
draw.text((20, 50), f"Seiten: {page_count}", fill='gray', font=font)
|
||||
|
||||
# Text-Vorschau
|
||||
if first_page_text:
|
||||
# Text umbrechen
|
||||
words = first_page_text.split()
|
||||
lines = []
|
||||
current_line = ""
|
||||
for word in words[:50]: # Maximal 50 Wörter
|
||||
if len(current_line + word) < 35:
|
||||
current_line += word + " "
|
||||
else:
|
||||
lines.append(current_line.strip())
|
||||
current_line = word + " "
|
||||
if len(lines) >= 15: # Maximal 15 Zeilen
|
||||
break
|
||||
if current_line:
|
||||
lines.append(current_line.strip())
|
||||
|
||||
y_pos = 80
|
||||
for line in lines:
|
||||
draw.text((20, y_pos), line, fill='black', font=font)
|
||||
y_pos += 18
|
||||
|
||||
# Speichere Vorschaubild
|
||||
img.save(preview_path, 'PNG')
|
||||
print(f"Fallback PDF-Vorschau erstellt: {preview_path}")
|
||||
return os.path.basename(preview_path)
|
||||
|
||||
except Exception as e:
|
||||
print(f"Fehler bei Fallback-Vorschau: {str(e)}")
|
||||
return None
|
||||
|
||||
@app.route('/api/pdf-to-images', methods=['POST'])
|
||||
@@ -366,13 +461,72 @@ def serve_uploaded_file(filename):
|
||||
file_path = os.path.join(UPLOAD_FOLDER, filename)
|
||||
|
||||
if not os.path.exists(file_path):
|
||||
print(f"Datei nicht gefunden: {file_path}")
|
||||
return "Datei nicht gefunden", 404
|
||||
|
||||
return send_file(file_path)
|
||||
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Servieren der Datei {filename}: {str(e)}")
|
||||
return f"Fehler beim Laden der Datei: {str(e)}", 500
|
||||
|
||||
@app.route('/debug/pdf-preview/<filename>')
|
||||
def debug_pdf_preview(filename):
|
||||
"""Debug-Route für PDF-Vorschau-Probleme"""
|
||||
try:
|
||||
pdf_path = os.path.join(UPLOAD_FOLDER, filename)
|
||||
|
||||
if not os.path.exists(pdf_path):
|
||||
return jsonify({'error': f'PDF nicht gefunden: {pdf_path}'})
|
||||
|
||||
# Teste PDF-Vorschau-Erstellung
|
||||
preview_filename = create_pdf_preview(filename)
|
||||
|
||||
return jsonify({
|
||||
'pdf_file': filename,
|
||||
'pdf_exists': os.path.exists(pdf_path),
|
||||
'preview_created': preview_filename is not None,
|
||||
'preview_filename': preview_filename,
|
||||
'preview_path': os.path.join(UPLOAD_FOLDER, preview_filename) if preview_filename else None,
|
||||
'preview_exists': os.path.exists(os.path.join(UPLOAD_FOLDER, preview_filename)) if preview_filename else False
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({'error': f'Debug-Fehler: {str(e)}'})
|
||||
|
||||
@app.route('/debug/check-dependencies')
|
||||
def debug_check_dependencies():
|
||||
"""Überprüft verfügbare Bibliotheken"""
|
||||
deps = {}
|
||||
|
||||
try:
|
||||
import pdf2image
|
||||
deps['pdf2image'] = 'verfügbar'
|
||||
# Teste Poppler
|
||||
try:
|
||||
pdf2image.convert_from_bytes(b'dummy')
|
||||
except Exception as e:
|
||||
if 'poppler' in str(e).lower():
|
||||
deps['poppler'] = 'nicht gefunden'
|
||||
else:
|
||||
deps['poppler'] = 'möglicherweise verfügbar'
|
||||
except ImportError:
|
||||
deps['pdf2image'] = 'nicht installiert'
|
||||
|
||||
try:
|
||||
import PyPDF2
|
||||
deps['PyPDF2'] = 'verfügbar'
|
||||
except ImportError:
|
||||
deps['PyPDF2'] = 'nicht installiert'
|
||||
|
||||
try:
|
||||
from PIL import Image
|
||||
deps['Pillow'] = 'verfügbar'
|
||||
except ImportError:
|
||||
deps['Pillow'] = 'nicht installiert'
|
||||
|
||||
return jsonify(deps)
|
||||
|
||||
@app.route('/download/<filename>')
|
||||
def download_file(filename):
|
||||
"""Download einer generierten Datei"""
|
||||
|
||||
Reference in New Issue
Block a user