Diese Seite kann automatisch übersetzten Text enthalten.
PDF-Dokumente in C# und VB.NET zusammenführen
Unternehmen führen PDF-Dateien häufig zur Dokumentenarchivierung zusammen. Auch wenn das Zusammenführen von PDFs einfach klingt, gibt es dabei viele Fallstricke. Formularfelder, Lesezeichen, Ebenen und andere PDF-Objekte sollten korrekt zusammengeführt werden. Doppelte Objekte sollten außerdem vermieden werden, um eine kompakte Ausgabedatei zu erhalten.
Docotic.Pdf-Bibliothek berücksichtigt alle Feinheiten der Zusammenführung. Sie können damit PDF-Dokumente mit nur wenigen Zeilen C#- oder VB.NET-Code zusammenführen.

Docotic.Pdf wird mit kostenlosen und kostenpflichtigen Lizenzen geliefert. Holen Sie sich die Bibliothek und einen kostenlosen, zeitlich begrenzten Lizenzschlüssel auf der C# .NET-PDF-Bibliothek herunterladen-Seite.
Grundlegendes zum PDF-Zusammenführen
Die Methoden PdfDocument.Append ermöglichen es, PDF-Dokumente aus Dateien, Streams oder Byte-Arrays anzuhängen. Es gibt außerdem Optionen zum Anhängen geschützter Dateien und zum Zusammenführen von Formularfeldern.
Zwei PDF-Dateien zusammenführen
Dieses Beispiel zeigt, wie Sie PDF-Dateien in C# zusammenführen:
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 zusammenführen
Das vorherige Beispiel lässt sich leicht so anpassen, dass es mit Streams statt mit Dateipfaden arbeitet. 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 zusammenführen
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);
// Entferne die leere Seite, die durch den PdfDocument()-Aufruf hinzugefügt wurde
pdf.RemovePage(0);
pdf.Save(pathToFile);
Verschlüsselte PDF-Dateien zusammenführen
Es gibt Append-Überladungen für das 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 zusammenführen
Jedes Formularfeld in einem PDF-Dokument muss einen eindeutigen Namen haben. Das kann zu einem Problem führen, wenn die zusammenzuführenden Dokumente Felder mit denselben Namen enthalten. Docotic.Pdf bietet die folgenden Zusammenführungsstrategien für in Konflikt stehende Formularsteuerelemente:
- Angehängte Steuerelemente bei Konflikten mit vorhandenen Steuerelementen umbenennen
- Angehängte 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 CopyAsKids-Modus führt die Bibliothek die konfligierten Steuerelemente zusammen und synchronisiert sie. Das heißt: Wenn Sie ein Steuerelement ändern, hat das zweite denselben Wert.
Zusammengeführte PDF-Datei verkleinern
PDF-Dokumente können identische Objekte enthalten, z. B. Schriften 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 zum Beispiel nicht verwendete Schriftglyphen entfernen oder Bilder komprimieren. Informationen zu den unterstützten Komprimierungsoptionen finden Sie im Artikel PDF-Dokumente in C# und VB.NET komprimieren.
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 auch das Zusammenführen eines Teils eines PDF-Dokuments. Dafür gibt es verschiedene Möglichkeiten. Sie können zum Beispiel ein hinzugefügtes PDF-Dokument aufteilen und extrahierte Seiten anhängen. Die folgende C#-Hilfsmethode 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 vollständiges PDF-Dokument anhängen und nicht benötigte 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 andere Lösung betrifft die PDF-Imposition. Informationen dazu finden Sie im entsprechenden Abschnitt.
PDF voranstellen
Die Methoden Append hängen Seiten immer an das Ende des aktuellen Dokuments an. Wie führt man PDF-Dateien in einer anderen Reihenfolge zusammen? Manchmal können Sie die Reihenfolge der Append-Aufrufe ändern. Verwenden Sie also
pdf.Append("first.pdf");
pdf.Append("second.pdf");
statt
pdf.Append("second.pdf");
pdf.Append("first.pdf");
Oder Sie ordnen Seiten nach dem Zusammenführen neu an. 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);
Weitere Informationen zum Neuanordnen von PDF-Seiten finden Sie unter:
PDF auf einer Seite anordnen
Docotic.Pdf ermöglicht es, mehrere PDF-Seiten auf einer einzelnen Seite zu kombinieren. Verwenden Sie die Methode PdfDocument.CreateXObject(PdfPage), um ein PdfXObject-Objekt auf Grundlage einer vorhandenen Seite zu erstellen. Zeichnen Sie dieses Objekt anschließend 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.
Als Anhang einbinden
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");
Zugehörige Codebeispiele finden Sie in der Gruppe PDF-Anhänge auf GitHub.
Parallel in Threads zusammenführen
Beim Zusammenführen vieler PDF-Dateien kann der Code parallelisiert werden. Die Klasse PdfDocument ist nicht thread-safe. Daher müssen in verschiedenen Threads separate PdfDocument-Objekte verwendet werden. Weitere Details finden Sie im Codebeispiel PDF-Dokumente in parallelen Threads zusammenführen.
Dieser Code zeigt, wie Sie PDF-Streams parallel zusammenführen 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 // Beschleunigt 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 die Eingabedokumente in Gruppen der Größe rangeSize auf. Anschließend führt der Code jede Gruppe parallel zu Zwischendokumenten zusammen. Der Prozess läuft weiter, bis die Anzahl der Eingabedokumente klein genug für die einfache Zusammenführung ist.
Die parallele Lösung ist nicht zwangsläufig schneller als die einthreadige Version. Die Ergebnisse können je nach Anzahl der Eingabedokumente und deren Größe variieren. Im Beispielcode kann der optimale Wert des Parameters rangeSize größer oder kleiner sein. Sie sollten Ihre Anwendung benchmarken, um die effektivste Implementierung zu finden.
Abschluss
Sie können die Docotic.Pdf library verwenden, um PDF-Dokumente in C# und VB.NET zusammenzuführen. Damit können Sie 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 außerdem dabei, die resultierenden Dateien zu komprimieren und Speicherplatz zu sparen.
Probieren Sie Codebeispiele aus dem Docotic.Pdf samples repository auf GitHub aus. Sie können auf der Docotic.Pdf download page einen Evaluierungslizenzschlüssel erhalten und die Bibliothek herunterladen.