Mi può davvero mancare qualcosa, ma ho fatto qualcosa di molto più semplice. Concedo che questa soluzione probabilmente non aggiornerà i segnalibri (come nella migliore risposta qui finora), ma funziona perfettamente per me. Poiché stavo unendo i documenti con moduli compilabili, ho usato PdfCopyFields anziché PdfCopy.
Ecco il codice (che ho messo a nudo tutta la gestione per rendere il codice vero e proprio più visibile errore, aggiungere un try..finally per chiudere le risorse aperti se si pensa di utilizzare il codice):
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();
}
è possibile passare qualsiasi flusso, sia esso un FileStream, un MemoryStream (utile quando la lettura del PDF da banche dati, senza bisogno di file temporanei, ecc)
Esempio utilizzo:
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));
}
numeri di pagina sono a base 1 –