· 

Python PDF Converter

1. Einführung

Python ist eine sehr mächtige Script-Programmiersprache. Viele technische Prozesse lassen sich durch sie leicht automatisieren. So verhält es sich (bei aktivierter MS-Word Installation) auch mit dem Konvertieren von PDF-Dokumenten. Stelle dir vor, du musst mehrere hundert alte Word-Dokumente z. B. zwecks Archivierung ins PDF-Format überführen. Statt jedes Dokument einzeln anzufassen oder kostenpflichtige Programme nutzen zu müssen, erfährst du in diesem Artikel, wie man Python zur Lösung dieser Aufgabe nutzen kann.

Normalerweise ist es so, dass man in Word zunächst das zu konvertierende Dokument öffnet und anschließend als PDF speichert. Dieser Prozess wird durch Python-Skript implizit abgebildet.


2. Konvertieren eines Dokuments

Wie bereits erwähnt wird eine aktive MS-Word Installation auf dem Rechner benötigt, der die Konvertierung vornehmen soll. Das liegt daran, dass das Python-Skript auf die Export-Funktion von MS-Word zugreift. Neben den Modulen sys und os wird auch das Paket comtypes benötigt.

import sys
import os
import comtypes.client

Ein geeigneter Name für die Konvertierungsfunktion ist z. B. word_to_pdf. Du könntest ihr beim Aufruf zwei Pfade (zur Quelle _in und zum Speicher-Ziel _out) übergeben:

def word_to_pdf(_in, _out):

Für den späteren Aufruf der Word-Funktion SaveAs( ) wird zur Signalisierung des Dateityps (PDF) der Wert 17 verwendet. Es bietet sich also, diesen vorab in einer Variable zu speichern:

pdf_format_key = 17

Nun ist es an der Zeit die Quell-Datei zu laden und den Speicherort bzw. den gewünschten Namen für das PDF-Output-File zu spezifizieren:

file_in = os.path.abspath(_in)
file_out = os.path.abspath(_out)

Als nächstes schaffst du via CreateObject( ), dem du als Argument "Word.Application" übergibst, ein Objekt, auf dem du verschiedene Word-Funktionen aufrufen kannst.

worddoc = comtypes.client.CreateObject('Word.Application')

Nun öffnest du das zu konvertierende File. Hier kommt die zuvor definierte Variable file_in zum Tragen.

doc = worddoc.Documents.Open(file_in)

Anschließend speicherst du das implizit geöffnete Dokument und wählst dabei den gewünschten Dateityp (hier PDF, kodiert durch den Wert 17) aus. Der Funktion SaveAs( ) übergibst du also die Parameter file_out (dein gewünschter Zielpfad) und den Dateityp.

doc.SaveAs(file_out, FileFormat = pdf_format_key)

Zum Schluss schließt du das geöffnete Dokument und beendest die Word.Application-Instanz:

doc.Close()
worddoc.Quit()

Nun kannst du die Funktion am Ende deines Skripts aufrufen:

word_to_pdf(sys.argv[1], sys.argv[2])

Das fertige Skript sieht wie folgt aus:

import sys
import os
import comtypes.client

def word_to_pdf(_in, _out):
    pdf_format_key = 17
    file_in = os.path.abspath(_in)
    file_out = os.path.abspath(_out)
    worddoc = comtypes.client.CreateObject('Word.Application')
    doc = worddoc.Documents.Open(file_in)
    doc.SaveAs(file_out, FileFormat = pdf_format_key)
    doc.Close()
    worddoc.Quit()

word_to_pdf(sys.argv[1], sys.argv[2])

3. Konvertieren vieler Dokumente

Um nun mehrere Dokumente (z. B. alle in einem bestimmten Ordner) konvertieren zu können, muss das Programm noch etwas angepasst werden. Zunächst definierst du dir eine Variable, die den Pfad des Ordners angibt, der alle zu konvertierenden Dokumente enthält.

destination = sys.argv[1]

Mit einer For-Schleife iterierst du via listdir über die Menge an Dateinamen im Ordner destination:

for file in os.listdir(destination):

Für jedes Dokument in dem Zielordner setzt du den Pfad des Input-Files zusammen und übergibst diesen der Funktion word_to_pdf. Das Output-File könnte der Einfachheit wegen schlicht und ergreifend der Name des Word-Dokuments mit der angehängten Endung .pdf heißen.

word_to_pdf(destination + "\\" + file, destination + "\\" + file + ".pdf")

Der neue Aufruf der Funktion sieht dann wie folgt aus:

destination = sys.argv[1]
for file in os.listdir(destination):
    word_to_pdf(destination + "\\" + file, destination + "\\" + file + ".pdf")

Abschließend kannst du dir hier noch einmal das gesamte Skript kopieren:

import sys
import os
import comtypes.client

def word_to_pdf(_in, _out):
    pdf_format_key = 17
    file_in = os.path.abspath(_in)
    file_out = os.path.abspath(_out)
    worddoc = comtypes.client.CreateObject('Word.Application')
    doc = worddoc.Documents.Open(file_in)
    doc.SaveAs(file_out, FileFormat = pdf_format_key)
    doc.Close()
    worddoc.Quit()

destination = sys.argv[1]
for file in os.listdir(destination):
    word_to_pdf(destination + "\\" + file, destination + "\\" + file + ".pdf")