Naprawdę może mi brakować czegoś, ale zrobiłem coś znacznie prostszego. Przyznam, że to rozwiązanie prawdopodobnie nie zaktualizuje zakładek (jak na razie w najlepszej odpowiedzi), ale działa bezbłędnie. Od czasu scalania dokumentów z formularzami wypełnianymi użyłem PdfCopyFields zamiast PdfCopy.
Oto kod (ja odpędza wszystkie obsługi błędów, aby rzeczywisty kod bardziej widoczne, dodaj try..finally aby zamknąć otwarte zasoby, jeśli planujesz za pomocą kodu):
void MergePdfStreams(List<Stream> Source, Stream Dest)
{
PdfCopyFields copy = new PdfCopyFields(Dest);
foreach (Stream source in Source)
{
PdfReader reader = new PdfReader(source);
copy.AddDocument(reader);
}
copy.Close();
}
można przekazać dowolny strumień, czy to FileStream, MemoryStream (przydatne podczas czytania plików PDF z baz danych, nie ma potrzeby pliki tymczasowe itp)
Przykładowe użycie:
void TestMergePdfStreams()
{
List<Stream> sources = new List<Stream>()
{
new FileStream("template1.pdf", FileMode.Open),
new FileStream("template2.pdf", FileMode.Open),
new MemoryStream((byte[])someDataRow["PDF_COLUMN_NAME"])
};
MergePdfStreams(sources, new FileStream("MergedOutput.pdf", FileMode.Create));
}
strona numery 1 oparte –