Mi scuso se sono stato lontao dai Blog per qualche gg.. gli eventi in Microsoft, la continua mancanza di una qualsiasi connessione ad internet in casa mia, ed i clienti che NON mi permettono di navigare se non sui siti interni hanno creato non pochi problemi :)
In questi giorni di follia, comunque, mi sono capitati come al solito parecchi problemi, ma l'ultimo piu insidioso è dovuto all'ottimo componennte iTextSharp che permette di creare PDF e salvarli o mandarli direttamente al client.
Questa seconda opzione, per quanto semplice sia, mi ha datto qualche problema in quanto ho trovato in giro degli esempi non completi: lo stesso esempio nel tutorial (http://itextsharp.sourceforge.net/examples/Chap0105.cs) è incompleto in quando istanzia un PdfWriter senza valorizzarne le proprietà, lasciandolo quindi ai valori di Default. Il che andrebbe benissimo se non fosse che, non ho ben capito se èer un problema dell'ultima build (che è di aprile) o per una imprecisione, il PdfWriter ha una proprietà CloseStream che ha come valore di default "True". Ovviamente, questo va benissimo se si parla di FileStream, così il file viene finalizzato e scritto su disco, ma quando si parla di MemoryStream, per rispedirlo al client, la faccenda diventa brutta, perchè mi si chiude il MemoryStream e non riesco piu a prenderne i Byte per rimandarli al client. Oltretutto, lo stream viene chiuso quando io chiamo document.Close() (dove "document" è un istanza di iTextSharp.text.Document) e se non chiamo il Close, il documento non viene scritto correttamente nello stream. Quindi la mia prima idea di non chiudere il document per rispedire indietro lo stream è fallita miseramente!
Soluzione: istanziare il writer e cambiarne la proprietà CloseStream in questo modo
PdfWriter writer = PdfWriter.GetInstance(document, m);
writer.CloseStream = false;
Così si può chiamare il .Close() del documento, ed avere nel proprio memoryStream "m" il contenuto completo del file per mandarlo al client.