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.
Docotic.Pdf wird mit kostenlosen und kostenpflichtigen Lizenzen geliefert. Holen Sie sich die Bibliothek und einen kostenlosen zeitlich begrenzten Lizenzschlüssel auf der Seite Laden Sie die C# .NET PDF-Bibliothek herunter.
9.5.17615-dev 14,813 bestanden NuGet-Downloads insgesamt 4,924,084Grundlagen 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);
Weitere Informationen zum Neuordnen von PDF-Seiten finden Sie hier:
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.