Diese Seite kann automatisch übersetzten Text enthalten.

PDF-Dokumente in C# und VB.NET aufteilen

Docotic.Pdf-Bibliothek ermöglicht es, ein PDF-Dokument in eine Gruppe kleinerer Dateien aufzuteilen. Sie können einzelne Seiten oder Seitenbereiche extrahieren. Sie können PDF-Dokumente auch nach bestimmten Kriterien aufteilen.

PDF-Dokumente aufteilen

Docotic.Pdf wird mit kostenpflichtigen Lizenzen angeboten, ist aber in bestimmten Fällen kostenlos. Laden Sie die Bibliothek und einen kostenlosen, zeitlich begrenzten Lizenzschlüssel auf der C# .NET-PDF-Bibliothek herunterladen-Seite herunter.

Grundlagen des PDF-Aufteilens

Die Methoden PdfDocument.CopyPages ermöglichen das Kopieren von Seiten aus PdfDocument-Objekten. Dies ist die primäre Docotic.Pdf API zum Aufteilen von PDF-Dokumenten.

PDF in einzelne Seiten aufteilen

Der folgende C#-Code speichert jede PDF-Seite in einer separaten Datei:

using var pdf = new PdfDocument("source.pdf");

for (int i = 0; i < pdf.PageCount; ++i)
{
    using PdfDocument copy = pdf.CopyPages(i, 1);
    copy.RemoveUnusedResources();
    copy.Save(i + ".pdf");
}

Die Methode PdfDocument.RemoveUnusedResources hilft, Ausgabedateien zu verkleinern. Sie ist nützlich, wenn kopierte Seiten ungenutzte Schriftarten, Bilder oder Muster referenzieren. Lesen Sie mehr über PDF-Komprimierung im Abschnitt Ausgabedateien optimieren.

In Seitengruppen aufteilen

Die Methode CopyPages unterstützt das Kopieren beliebiger Seitenbereiche. Dieses Codebeispiel zeigt, wie die dritte und die erste Seite extrahiert werden:

using var pdf = new PdfDocument(@"source.pdf");

using PdfDocument copy = pdf.CopyPages([2, 0]);
copy.RemoveUnusedResources();
copy.Save("result.pdf");

Die Reihenfolge der Seitenindizes ist wichtig. Sie bestimmt die Reihenfolge der Seiten im resultierenden Dokument.

Probieren Sie das Codebeispiel Seiten kopieren von GitHub aus.

PDF nach Bedingung aufteilen

Sie können Dokumente anhand des Inhalts aufteilen. Das ist hilfreich, wenn Sie im Voraus nicht wissen, welche Seiten extrahiert werden sollen. Zum Beispiel Seiten mit einem bestimmten Text extrahieren:

string textToFind = ".NET Standard";
using var pdf = new PdfDocument("C# in depth.pdf");
var pageIndexes = new List<int>();
for (int i = 0; i < pdf.Pages.Count; i++)
{
    string pageText = pdf.Pages[i].GetText();
    if (pageText.Contains(textToFind, StringComparison.CurrentCultureIgnoreCase))
        pageIndexes.Add(i);
}

if (pageIndexes.Count > 0)
{
    using var copy = pdf.CopyPages(pageIndexes.ToArray());
    copy.RemoveUnusedResources();
    copy.Save(textToFind + ".pdf");
}

Weitere Informationen zur Textextraktion finden Sie im Artikel Text aus PDF in C# und VB.NET extrahieren.

Erweitertes PDF-Aufteilen

Seiten extrahieren

Die CopyPages-Methoden ändern das zugehörige PdfDocument-Objekt nicht. Es gibt auch die Methoden PdfDocument.ExtractPages. Sie ermöglichen es, extrahierte Seiten aus dem Dokument zu entfernen:

using var pdf = new PdfDocument(@"source.pdf");

using PdfDocument copy = pdf.ExtractPages(0, 3);
copy.Save("extracted.pdf");

pdf.Save("original.pdf");

Sie können das entsprechende Codebeispiel Seiten extrahieren von GitHub ausprobieren.

Seiten entfernen und neu anordnen

Die CopyPages- und ExtractPages-Methoden erzeugen ein neues Dokument mit ausgewählten Seiten. Eine Alternative besteht darin, Seiten aus einem aktuellen Dokument zu entfernen:

using var pdf = new PdfDocument(@"source.pdf");
pdf.RemovePages(0, 3);
pdf.Save("remaining.pdf");

Sie können Seiten nach dem Entfernen auch neu anordnen. Sehen Sie sich die Codebeispiele in diesen Abschnitten an:

Ausgabedateien optimieren

Früher habe ich die Methode RemoveUnusedResources verwendet, um die resultierenden Dateien zu optimieren. Docotic.Pdf bietet weitere Optionen zur PDF-Komprimierung. Sie können beispielsweise Strukturinformationen entfernen oder Bilder komprimieren. Weitere Informationen finden Sie im Artikel PDF-Dokumente in C# und VB.NET komprimieren. Sie können auch das Codebeispiel PDF-Dokument in .NET komprimieren von GitHub ausprobieren.

PDF-Aufteilung wird manchmal verwendet, um Seitendateien kleiner als ein bestimmtes Limit zu machen. In solchen Fällen können Sie die resultierende Größe messen und die Datei bei Bedarf komprimieren. Beispielcode:

using var pdf = new PdfDocument("source.pdf");

using PdfDocument copy = pdf.CopyPages(0, 1);
copy.RemoveUnusedResources();

using var ms = new MemoryStream();
copy.Save(ms);

var limit = 1024 * 1024;
if (ms.Length > limit)
{
    compress(copy);
    copy.Save("result.pdf");
}

Beachten Sie, dass es unter Umständen unmöglich ist, eine PDF-Datei unter ein bestimmtes Limit zu komprimieren. Die Ergebnisse hängen vom Dateiinhalt und vom Limitwert ab.

Seiteninhalt extrahieren

Es ist auch möglich, den Seiteninhalt beim Aufteilen zu ändern. Sie können beispielsweise extrahierte Seiten skalieren, bevor Sie sie in einer PDF-Imposition verwenden. Probieren Sie das zugehörige Beispielprojekt XObject aus Seite erstellen von GitHub aus.

Oder Sie können bestimmte Inhalte auf extrahierten Seiten entfernen oder ersetzen. Sehen Sie sich das Codebeispiel Text, Pfade und Bilder kopieren an, das zeigt, wie PDF-Seitenobjekte kopiert werden.

PDF in Bilder aufteilen

Docotic.Pdf ermöglicht auch das Aufteilen eines PDF-Dokuments in Seitenbilder. Weitere Details finden Sie im Artikel PDF in C# und VB.NET in ein Bild konvertieren.

Parallel in Threads aufteilen

Möglicherweise möchten Sie die PDF-Aufteilung für große Dokumente parallelisieren. Die PdfDocument-Klasse ist nicht threadsicher. Es ist jedoch möglich, separate PdfDocument-Objekte in jedem Thread zu verwenden:

string fileName = "source.pdf";
using var temp = new PdfDocument(fileName);
int pageCount = temp.PageCount;

Parallel.For(0, pageCount, i =>
{
    using var pdf = new PdfDocument(fileName);
    using var copy = pdf.CopyPages(i, 1);
    copy.RemoveUnusedResources();
    copy.Save($"split_{i}.pdf");
});

Beachten Sie, dass der einthreadige Code in der Regel schneller ist. Die mehrthreadige Lösung verursacht einen Overhead durch das Parsen zusätzlicher PdfDocument-Objekte. Verwenden Sie die einthreadige Variante, sofern Tests nicht belegen, dass der parallele Code schneller ist.