DOCX zu HTML Konvertierung
Created on: December 25, 2024
Created on: December 25, 2024
Wie kann ich mit Python ein docx zu HTML ohne Verluste der Formatierungen und Bilder umwandeln? Ich möchte weder Word noch libreoffice installieren und auch keine sinnlosen Formatierungen im HTML erhalten. Das HTML soll die Basis für eine Umwandlung in ein PDF im A4 Format sein. Wenn mein Vorhaben mit markdown besser funktioniert, dann beschreibe diesen Weg. Genutzt soll das Ergebnis werden, um Texte zu suchen und mit Werten zu Ersetzen, die in einer Tabelle gespeichert sind.
Um eine DOCX-Datei in HTML (oder Markdown) mit Python ohne Verlust von Formatierungen und Bildern zu konvertieren, ohne auf externe Anwendungen wie Word oder LibreOffice zurückgreifen zu müssen, empfehle ich die Nutzung der Mammoth-Bibliothek. Mammoth erzeugt sauberes, semantisches HTML, das sich gut für weitere Verarbeitungsschritte wie die Umwandlung in PDF oder das Durchführen von Suchen und Ersetzungen eignet.
Zuerst müssen Sie die notwendigen Python-Bibliotheken installieren:
bashpip install mammoth Pillow
Hier ist ein Beispielskript, das eine DOCX-Datei in sauberes HTML konvertiert und dabei Bilder behandelt:
pythonimport mammoth import os import base64 def convert_docx_to_html(docx_path, output_html_path, images_output_dir): # Stelle sicher, dass das Bilderverzeichnis existiert os.makedirs(images_output_dir, exist_ok=True) # Funktion zum Speichern der Bilder und Rückgabe des Pfads def image_handler(image): image_bytes = image.read() image_extension = image.content_type.split('/')[-1] image_name = f'image_{image.index}.{image_extension}' image_path = os.path.join(images_output_dir, image_name) with open(image_path, 'wb') as img_file: img_file.write(image_bytes) # Rückgabe des HTML-Image-Tags return {'src': os.path.relpath(image_path, os.path.dirname(output_html_path))} with open(docx_path, "rb") as docx_file: result = mammoth.convert_to_html(docx_file, convert_image=mammoth.images.inline(image_handler)) html = result.value # Das konvertierte HTML messages = result.messages # Warnungen und Hinweise # Optional: Nachrichten ausgeben for message in messages: print(message) # HTML speichern with open(output_html_path, "w", encoding="utf-8") as html_file: html_file.write(html) # Beispielnutzung docx_path = "beispiel.docx" output_html_path = "beispiel.html" images_output_dir = "bilder" convert_docx_to_html(docx_path, output_html_path, images_output_dir)
Erläuterungen:
convert_image
-Parameter wird sichergestellt, dass Bilder korrekt behandelt werden.Falls Sie Markdown bevorzugen, können Sie Mammoth verwenden, um direkt in Markdown zu konvertieren:
pythondef convert_docx_to_markdown(docx_path, output_md_path, images_output_dir): os.makedirs(images_output_dir, exist_ok=True) def image_handler(image): image_bytes = image.read() image_extension = image.content_type.split('/')[-1] image_name = f'image_{image.index}.{image_extension}' image_path = os.path.join(images_output_dir, image_name) with open(image_path, 'wb') as img_file: img_file.write(image_bytes) # Rückgabe des Markdown-Image-Tags return f')})' with open(docx_path, "rb") as docx_file: result = mammoth.convert_to_markdown(docx_file, convert_image=mammoth.images.inline(image_handler)) markdown = result.value messages = result.messages for message in messages: print(message) with open(output_md_path, "w", encoding="utf-8") as md_file: md_file.write(markdown) # Beispielnutzung output_md_path = "beispiel.md" convert_docx_to_markdown(docx_path, output_md_path, images_output_dir)
Hinweis: Die Konvertierung zu Markdown kann hilfreich sein, wenn Sie eine noch einfachere und sauberere Textstruktur benötigen. Allerdings unterstützt Markdown weniger komplexe Formatierungen im Vergleich zu HTML.
Nachdem Sie die DOCX-Datei in HTML oder Markdown konvertiert haben, können Sie den resultierenden Text für Suchen und Ersetzen verwenden. Hier ein einfaches Beispiel mit HTML:
pythonfrom bs4 import BeautifulSoup def replace_values_in_html(html_path, replacements): with open(html_path, "r", encoding="utf-8") as file: soup = BeautifulSoup(file, "html.parser") html_str = str(soup) for key, value in replacements.items(): html_str = html_str.replace(key, value) with open(html_path, "w", encoding="utf-8") as file: file.write(html_str) # Beispielnutzung replacements = { "{{Name}}": "Max Mustermann", "{{Datum}}": "2024-12-25" } replace_values_in_html(output_html_path, replacements)
Erläuterungen:
Nachdem Sie das HTML vorbereitet haben, können Sie es mit Bibliotheken wie WeasyPrint oder pdfkit in PDF umwandeln. Hier ein Beispiel mit WeasyPrint:
bashpip install weasyprint
pythonfrom weasyprint import HTML def convert_html_to_pdf(html_path, pdf_path): HTML(html_path).write_pdf(pdf_path, stylesheets=['styles.css']) # Optional: CSS einbinden # Beispielnutzung pdf_path = "beispiel.pdf" convert_html_to_pdf(output_html_path, pdf_path)
Hinweis: Sie können eine separate CSS-Datei (styles.css
) erstellen, um das Layout für das PDF zu optimieren, insbesondere für das A4-Format.
Mit diesem Ansatz vermeiden Sie die Installation von Microsoft Word oder LibreOffice und erhalten gleichzeitig sauberes, gut strukturiertes HTML oder Markdown, das für weitere Verarbeitungsschritte geeignet ist.