Diese Seite kann automatisch übersetzten Text enthalten.

PDF-Dokumente in C# und VB.NET zusammenführen

Unternehmen führen PDF-Dateien häufig zusammen, um Dokumente zu archivieren. Obwohl das Zusammenführen von PDFs nach einer einfachen Aufgabe klingt, gibt es hier viele Fallstricke. Sie sollten Formularfelder, Lesezeichen, Ebenen und andere PDF-Objekte richtig kombinieren. Sie sollten auch doppelte Objekte vermeiden, um eine kompakte Ausgabedatei zu erhalten.

Docotic.Pdf-Bibliothek behandelt alle Nuancen des Zusammenführens. Sie können PDF-Dokumente in nur wenigen Zeilen C#- oder VB.NET-Code zusammenführen.

PDF-Dokumente zusammenführen

Docotic.Pdf wird mit kostenlosen und kostenpflichtigen Lizenzen geliefert. Sie können die Bibliothek herunterladen und einen Testlizenzschlüssel auf der Docotic.Pdf-Downloadseite erhalten.

Docotic.Pdf-Bibliothek 9.4.17467-dev Regressionstests 14,760 bestanden NuGet-Downloads insgesamt 4,415,970

Grundlagen zum Zusammenführen von PDFs

Mit den Methoden PdfDocument.Append können Sie PDF-Dokumente aus Dateien, Streams oder Byte-Arrays anhängen. Es gibt auch Optionen zum Anhängen geschützter Dateien und zum Zusammenführen von Formularfeldern.

Zwei PDF-Dateien kombinieren

Dieser Beispielcode zeigt, wie PDF-Dateien in C# zusammengeführt werden:

using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.Save("merged.pdf");

Probieren Sie das Codebeispiel Zwei PDF-Dokumente zusammenführen von GitHub aus.

PDF-Streams kombinieren

Das vorherige Beispiel lässt sich leicht anpassen, um mit Streams statt mit Dateipfaden zu arbeiten. Hier ist die Hilfsmethode zum Zusammenführen von Streams:

void Merge(Stream first, Stream second, Stream result)
{
    using var pdf = new PdfDocument(first);
    pdf.Append(second);
    pdf.Save(result);
}

Mehrere PDF-Dateien kombinieren

Sie können die Methode Append wiederholt aufrufen, um mehrere PDF-Dateien anzuhängen:

string[] filesToMerge = ..;
using var pdf = new PdfDocument();
foreach (string file in filesToMerge)
    pdf.Append(file);

// Entfernen Sie die leere Seite, die durch den Aufruf von PdfDocument() hinzugefügt wurde
pdf.RemovePage(0);

pdf.Save(pathToFile);

Verschlüsselte PDF-Dateien zusammenführen

Es gibt Append-Überladungen zum Zusammenführen verschlüsselter Dokumente:

using var pdf = new PdfDocument();
pdf.Append("encrypted.pdf", new PdfStandardDecryptionHandler("password"));
pdf.Save("merged.pdf");

Weitere Informationen finden Sie im Artikel PDF-Dokumente in C# und VB.NET entschlüsseln.

PDF-Formulare kombinieren

Jedes Formularfeld in einem PDF-Dokument muss einen eindeutigen Namen haben. Das kann zu Problemen führen, wenn die zusammenzuführenden Dokumente Felder mit denselben Namen enthalten. Docotic.Pdf bietet die folgenden Zusammenführungsstrategien für widersprüchliche Formularsteuerelemente:

  • Angehängte Steuerelemente umbenennen, wenn sie mit vorhandenen Steuerelementen in Konflikt stehen
  • Angefügte Steuerelemente mit vorhandenen Steuerelementen zusammenführen
  • Angehängte Steuerelemente reduzieren
  • Keine Steuerelemente anhängen
  • Steuerelemente unverändert anhängen

Standardmäßig benennt die Bibliothek angehängte Steuerelemente bei Konflikten um. Sie können mit der Klasse PdfMergingOptions eine alternative Strategie wählen:

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

var decryptionHandler = new PdfStandardDecryptionHandler(string.Empty);
var mergingOptions = new PdfMergingOptions()
{
    ControlMergingMode = PdfControlMergingMode.CopyAsKids
};
pdf.Append("form.pdf", decryptionHandler, mergingOptions);

pdf.Save("merged.pdf");

Im Modus CopyAsKids führt die Bibliothek die in Konflikt stehenden Steuerelemente zusammen und synchronisiert sie. D. h., wenn Sie ein Steuerelement ändern, hat das zweite denselben Wert.

Zusammengeführte PDF-Datei verkleinern

PDF-Dokumente können identische Objekte enthalten, wie Schriftarten oder Bilder. Wenn Sie solche Dokumente zusammenführen, enthält das resultierende Dokument Kopien derselben Objekte. Verwenden Sie die Methode PdfDocument.ReplaceDuplicateObjects(), um das Zusammenführungsergebnis zu optimieren:

using var pdf = new PdfDocument("2024-05-28.pdf");
pdf.Append("2024-05-29.pdf");

pdf.ReplaceDuplicateObjects();

pdf.Save("merged.pdf");

Sie können die Größe der Ausgabedatei noch weiter reduzieren. Sie können beispielsweise nicht verwendete Schriftglyphen entfernen oder Bilder komprimieren. Informationen zu unterstützten Komprimierungsoptionen finden Sie im Artikel Komprimieren Sie PDF-Dokumente in C# und VB.NET.

PDF-Zusammenführung anpassen

Docotic.Pdf bietet Methoden zum Extrahieren, Neuordnen oder Entfernen von PDF-Seiten. Sie können sie mit der Methode Append verwenden, um benutzerdefinierte PDF-Zusammenführungsaufgaben zu implementieren.

Bestimmte PDF-Seiten anhängen

Docotic.Pdf ermöglicht es Ihnen auch, einen Teil eines PDF-Dokuments zusammenzuführen. Dafür gibt es verschiedene Möglichkeiten. Sie können beispielsweise ein hinzugefügtes PDF-Dokument aufteilen und extrahierte Seiten anhängen. Der folgende C#-Helfer hängt ausgewählte Seiten an das PdfDocument an:

private static void AppendPart(PdfDocument pdf, string filePath, params int[] pagesToAppend)
{
    using var streamToAppend = new MemoryStream();
    using var other = new PdfDocument(filePath);
    using var extracted = other.CopyPages(pagesToAppend);
    var options = new PdfSaveOptions
    {
        UseObjectStreams = false
    };
    extracted.Save(streamToAppend, options);

    pdf.Append(streamToAppend);
}

Oder Sie können ein ganzes PDF-Dokument anhängen und unnötige Seiten entfernen. Das folgende Codebeispiel hängt die ersten beiden Seiten von second.pdf an:

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

int pageCountBefore = pdf.PageCount;
pdf.Append(@"second.pdf");
pdf.RemovePages(pageCountBefore + 2);

pdf.Save(pathToFile);

Eine weitere Lösung betrifft das PDF-Auferlegen. Darüber können Sie im entsprechenden Abschnitt lesen.

PDF voranstellen

Die Append-Methoden hängen Seiten immer an das Ende des aktuellen Dokuments an. Wie kann man PDF-Dateien in anderer Reihenfolge zusammenführen? Manchmal kann man die Reihenfolge der Append-Aufrufe ändern. D. h., man verwendet

pdf.Append("first.pdf");
pdf.Append("second.pdf");

statt

pdf.Append("second.pdf");
pdf.Append("first.pdf");

Oder Sie können die Seiten nach dem Zusammenführen neu anordnen. Dieser C#-Code verschiebt das angehängte PDF-Dokument an den Anfang:

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

int pageCountBefore = pdf.PageCount;
pdf.Append(@"first.pdf");
pdf.MovePages(pageCountBefore, pdf.PageCount - pageCountBefore, 0);

pdf.Save(pathToFile);

Zugehörige Codebeispiele zum Neuordnen von PDF-Seiten:

PDF auferlegen

Docotic.Pdf ermöglicht Ihnen, mehrere PDF-Seiten auf einer einzigen Seite zu kombinieren. Verwenden Sie die Methode PdfDocument.CreateXObject(PdfPage), um ein PdfXObject-Objekt basierend auf einer vorhandenen Seite zu erstellen. Zeichnen Sie dieses Objekt dann mit der gewünschten Skalierung. Beispielcode:

using var src = new PdfDocument(@"src.pdf");
using var dest = new PdfDocument();
PdfXObject firstXObject = dest.CreateXObject(src.Pages[0]);
PdfXObject secondXObject = dest.CreateXObject(src.Pages[1]);

PdfPage page = dest.Pages[0];
page.Orientation = PdfPaperOrientation.Landscape;
double halfOfPage = page.Width / 2;
page.Canvas.DrawXObject(firstXObject, 0, 0, halfOfPage, page.Height, 0);
page.Canvas.DrawXObject(secondXObject, halfOfPage, 0, halfOfPage, page.Height, 0);

dest.Save("result.pdf");

Testen Sie das zugehörige Beispielprojekt XObject aus Seite erstellen von GitHub.

Zusammenführen als Anhang

Manchmal müssen Sie eine PDF-Datei als Anhang in eine andere einbetten. Auch das ist möglich. Sie können auf PDF-Seiten auch Links zur eingebetteten Datei hinzufügen:

using var pdf = new PdfDocument();

PdfFileSpecification first = pdf.CreateFileAttachment("first.pdf");
pdf.SharedAttachments.Add(first);

var bounds = new PdfRectangle(20, 70, 100, 100);
PdfFileSpecification fs = pdf.CreateFileAttachment("second.pdf");
pdf.Pages[0].AddFileAnnotation(bounds, fs);

pdf.Save("attachments.pdf");

Verwandte Codebeispiele finden Sie in der Gruppe PDF-Anhänge auf GitHub.

Zusammenführen in parallelen Threads

Beim Zusammenführen vieler PDF-Dateien ist es möglich, den Code zu parallelisieren. Die Klasse PdfDocument ist nicht threadsicher. Daher müssen wir separate PdfDocument-Objekte in verschiedenen Threads verwenden. Weitere Einzelheiten finden Sie im Codebeispiel PDF-Dokumente in parallelen Threads zusammenführen.

Dieser Code zeigt, wie Sie PDF-Streams parallel kombinieren können:

Stream[] documentsToMerge = ..;

int rangeSize = 50;
while (documentsToMerge.Length > rangeSize)
{
    int partitionCount = (int)Math.Ceiling(documentsToMerge.Length / (double)rangeSize);
    var result = new Stream[partitionCount];

    var partitioner = Partitioner.Create(0, documentsToMerge.Length, rangeSize);
    Parallel.ForEach(partitioner, range =>
    {
        int startIndex = range.Item1;
        int count = range.Item2 - range.Item1;
        result[startIndex / rangeSize] = MergeToStream(documentsToMerge, startIndex, count);
    });
    documentsToMerge = result;
}

using PdfDocument final = GetMergedDocument(documentsToMerge, 0, documentsToMerge.Length);
final.Save("merged.pdf");


private static Stream MergeToStream(Stream[] streams, int startIndex, int count)
{
    using PdfDocument pdf = GetMergedDocument(streams, startIndex, count);

    var result = new MemoryStream();

    var options = new PdfSaveOptions
    {
        UseObjectStreams = false // Beschleunigen Sie das Schreiben von Zwischendokumenten
    };
    pdf.Save(result, options);
    return result;
}

private static PdfDocument GetMergedDocument(Stream[] streams, int startIndex, int count)
{
    var pdf = new PdfDocument();
    try
    {
        for (int i = 0; i < count; ++i)
        {
            var s = streams[startIndex + i];
            pdf.Append(s);
            s.Dispose();
        }

        pdf.RemovePage(0);

        pdf.ReplaceDuplicateObjects();

        return pdf;
    }
    catch
    {
        pdf.Dispose();
        throw;
    }
}

Der obige Code teilt Eingabedokumente in Gruppen der Größe rangeSize auf. Anschließend führt der Code jede Gruppe parallel zu Zwischendokumenten zusammen. Der Vorgang wird fortgesetzt, bis die Anzahl der Eingabedokumente klein genug für die einfache Zusammenführung ist.

Eine parallele Lösung ist nicht unbedingt schneller als die Single-Thread-Version. Die Ergebnisse können je nach Anzahl und Größe der Eingabedokumente variieren. Im Beispielcode kann der optimale Wert des Parameters rangeSize größer oder kleiner sein. Sie sollten Ihre Anwendung vergleichen, um die effektivste Implementierung zu finden.

Abschluss

Sie können die Docotic.Pdf-Bibliothek verwenden, um PDF-Dokumente in C# und VB.NET zu kombinieren. Sie können damit Dateien, Streams oder Byte-Arrays zusammenführen. Sie können verschlüsselte Dateien, PDF-Formulare und bestimmte PDF-Seiten zusammenführen. Docotic.Pdf hilft Ihnen auch dabei, die resultierenden Dateien zu komprimieren und Speicherplatz zu sparen.

Probieren Sie Codebeispiele aus dem Docotic.Pdf-Beispiel-Repository auf GitHub aus. Sie können einen Testlizenzschlüssel erhalten und die Bibliothek auf der Docotic.Pdf-Downloadseite herunterladen.