PDFs aufteilen und zusammenfügen mit .NET

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Gelegentlich möchte man PDF-Dateien bearbeiten – und das am besten ohne eigenes Zutun, sondern komplett programmgesteuert. Ein Kunde ist beispielsweise an mich herangetreten und wollte ein riesiges PDF-Dokument, das eine Menge Rechnungen in einer einzigen Datei enthielt, aufteilen. Als Ergebnis wünscht er sich einzelne Dateien, die jeweils eine Rechnung enthielten. Grund genug, einmal zu schauen, wie man mit .NET an dieses Problem herangehen kann. Genügend NuGet-Pakete mit Funktionen zum Bearbeiten von PDF-Dokumenten sind verfügbar, sodass wir die Qual der Wahl haben. Für diese Aufgabe haben wir das NuGet-Paket PDFsharp herangezogen, das verspricht, mit PDF-Seiten umgehen zu können – egal, ob es um das Entfernen, Hinzufügen, Extrahieren oder Zusammenstellen neuer Dokumente geht.

Anforderungen an ein NuGet-Paket zum Analysieren und Bearbeiten von PDF-Dokumenten

Speziell auf die oben angegebene Aufgabenstellung bezogen können wir zwei Anforderungen definieren:

  • Wir benötigen eine Funktion, mit der wir ein PDF-Dokument seitenweise durchlaufen und im Text der Seiten nach bestimmten Ausdrücken suchen können. Diese Aufgabe erledigt PDFsharp nicht zufriedenstellend, daher schauen wir uns dazu in einem weiteren Artikel ein besser geeignetes Paket an.
  • Außerdem benötigen wir eine Funktion, mit der wir einzelne Seiten eines PDFs-Dokuments extrahieren und als eigenständige Dokumente speichern können.

Beides würde theoretisch auch Adobe Acrobat Pro bieten, aber dies ist kostenpflichtig und wir sollen sehen, ob wir auch mit kostenloser Software weiterkommen.

NuGet-Paket suchen

Also starten wir Visual Studio und legen ein neues Projekt namens PDFTools an. Das Projekt soll den Typ WPF-App (.NET Framework) erhalten (siehe Bild 1), damit wir die Funktionen über eine Benutzeroberfläche steuern können – beispielsweise, um den Namen der zu bearbeitenden PDF-Datei anzugeben und die gewünschten Funktionen aufzurufen.

Anlegen einer neuen WPF-Anwendung

Bild 1: Anlegen einer neuen WPF-Anwendung

Nachdem das Projekt angelegt und geöffnet wurde, rufen wir den Menübefehl Projekt|NuGet-Pakete verwalten… auf. Dies öffnet das Fenster NuGet: PDFTools, wo wir zum Bereich Durchsuchen wechseln.

Hier geben wir einfach einmal den Suchbegriff PDF ein und erhalten direkt einige Treffer. Direkt der erste ist recht bekannt und heißt PDFsharp. Interessant ist, dass es unter der MIT-Lizenz läuft. Die Bedingungen kannst Du mit einem Klick auf Lizenz anzeigen einsehen.

Wir wählen PDFsharp in der Version Aktuellste stabile Version aus und klicken auf Installieren (siehe Bild 2). Damit landen die benötigten Dateien im Projektverzeichnis und werden als Verweise eingebunden.

Hinzufügen einer PDF-Bibliothek

Bild 2: Hinzufügen einer PDF-Bibliothek

Funktion zum Auswählen des PDF-Dokuments hinzufügen

Bevor wir uns mit PDFsharp beschäftigen, fügen wir der Startseite MainWindow.xaml schon einmal ein Textfeld zum Anzeigen und eine Schaltfläche zum Auswählen der zu untersuchenden und gegebenenfalls zu bearbeitenden PDF-Datei hinzu. Dazu definieren wir die Steuerelemente wie folgt (für den kompletten Code siehe Beispielprojekt im Download):

<Label>PDF-Dokument:</Label>
<StackPanel Orientation="Horizontal" Grid.Column="1">
     <TextBox x:Name="txtPDFDokument"         Width="300"></TextBox>
     <Button x:Name="btnDateiauswahl"         Click="btnDateiauswahl_Click">Auswählen</Button>
</StackPanel>

Für die Schaltfläche btnDateiauswahl hinterlegen wir die Prozedur aus Listing 1 in der Code behind-Datei MainWindow.xaml.vb. Diese Prozedur ruft einen Dialog zur Auswahl der zu bearbeitenden PDF-Datei auf.

Imports Microsoft.Win32
Class MainWindow
     Private Sub btnDateiauswahl_Click(sender As Object, e As RoutedEventArgs)
         Dim objFileDialog As New OpenFileDialog()
         objFileDialog.Filter = "PDF-Dateien (*.pdf)|*.pdf|Alle Dateien (*.*)|*.*"
         objFileDialog.FilterIndex = 1
         objFileDialog.RestoreDirectory = True
         If objFileDialog.ShowDialog() = True Then
             txtPDFDokument.Text = objFileDialog.FileName
         End If
     End Sub
End Class

Listing 1: Öffnen eines Dateiauswahl-Dialogs

Zum Ausprobieren klicken wir auf F5 und sehen, dass alles wie gewünscht funktioniert.

Seitenzahl eines PDF-Dokuments ermitteln

Zum Warmwerden wollen wir die Seitenzahl des ausgewählten PDF-Dokuments ermitteln. Dazu fügen wir eine neue Schaltfläche zum Code hinzu:

<Button x:Name="btnSeitenzahl" Grid.Row="1"     Click="btnSeitenzahl_Click">Seitenzahl</Button>

Die dadurch ausgelöste Prozedur beantwortet gleich zwei Fragen: Wie kann ich überhaupt ein PDF-Dokument für die Analyse und Bearbeitung mit PDFsharp öffnen und wie finde ich die Seitenzahl des geöffneten Dokuments heraus?

Bevor wir damit starten, fügen wir der Klasse MainWindow.xaml.vb die folgenden weiteren beiden Namespace-Verweise hinzu:

 

Schreibe einen Kommentar