ASP.NET C# - Come unire GIF, PNG, JPG, TIFF, PDF in un singolo file PDF con iTextSharp Una piccola libreria open-source per ASP.NET C# che consente di unire uno o più file GIF, PNG, JPG, TIFF e/o PDF in un singolo file PDF con iTextSharp

How to handle multipage TIFF files with ASP.NET C# (GDI+ alternative)

Oggi ho deciso di riproporre in italiano un vecchio articolo, pubblicato in lingua inglese qualche anno fa, che descriveva una libreria ASP.NET C# per convertire uno o più file immagine (in formato GIF, PNG, JPG, TIFF, PDF) in un unico file PDF multi-pagina. Una procedura che all'epoca si rivelò essere molto meno semplice del previsto per via di una serie di complicazioni e problematiche relative alle interfacce GDI+ che ASP.NET utilizza dietro le quinte per gestire le operazioni di lettura, conversione e scrittura dei formati immagine più diffusi. In dettaglio, ho dovuto scontrarmi con:

  • Una serie di problematiche legate alla gestione dei file TIFF multi-pagina (per maggiori informazioni, leggete qui).
  • Una serie di problematiche legate al resize/resample di ciascuna immagine, così da farla entrare in una pagina PDF predeterminata (nel nostro caso, A4).

Poiché gestire entrambe le problematiche utilizzando unicamente le interfacce GDI+ sarebbe stato oltremodo faticoso, ho deciso di avvalermi di un'ottima libreria open-source chiamata iTextSharp, disponibile gratuitamente attraverso NuGetSourceForge, grazie alla quale ho potuto risparmiarmi gran parte dei grattacapi.

IMPORTANTE: La versione di iTextSharp utilizzata nel codice presente in questo articolo è la 5.5.13.1, attualmente in EOL: il codice non funzionerà con le versioni successive (7+). Se siete interessati a una versione aggiornata di questo articolo con supporto per iText 7+, scriveteci una richiesta nei commenti!

Ecco il codice completo del metodo da me realizzato: come potrete vedere non si può certo definire un one-liner, ma se non altro consente di raggiungere lo scopo con una gestione piuttosto ottimizzata della memoria, cosa fondamentale quando si lavora con immagini potenzialmente di grandi dimensioni.

Questo è il codice che definisce la classe ByteArrayInfo, utilizzata come parametro di input: come si può facilmente comprendere, lo scopo di questa classe é quello di trasmettere al metodo MergeIntoPDF sia il nome file che il byte array di ciascuno dei file che si desidera "unire".

Il codice del metodo principale MergeIntoPDF è piuttosto autoesplicativo: noterete senz'altro la presenza di una grande quantità di blocchi using nidificati e non, piuttosto inevitabile quando si lavora con tipi di immagine GDI + (quasi tutti IDisposable, quindi da rimuovere manualmente dalla memoria) ; il codice presenta anche un gran numero di trasformazioni (quasi sempre di tipo MemoryStream > Image > Bitmap), anch'esse necessarie per gestire correttamente l'allocazione della memoria dei molteplici oggetti temporanei necessari per "separare" le varie pagine/immagini di input e copiarle all'interno del byte array di destinazione. Il metodo restituisce infatti un array di byte, così da consentire il salvataggio del file risultante sia su FileSystem (con il metodo System.IO.File.WriteAllBytes) o altri sistemi analoghi) che all'interno di una colonna BLOB di un qualsiasi Database.

Inutile dire che il codice è pubblicato soltanto a titolo esemplificativo: sentitevi liberi di modificare l'implementazione e/o cambiare il tipo di dati restituito a seconda delle esigenze specifiche della vostra applicazione.

Per il momento è tutto: buona conversione!

AGGIORNAMENTO: nel caso in cui, implementando e/o modificando il codice di cui sopra, doveste imbattervi in un  errore GDI + generico (o altra eccezione similare) durante la gestione di file TIFF multi-pagina, vi consigliamo di dare un'occhiata a questo articolo per vedere se il problema da voi riscontrato è lo stesso di cui ci siamo occupati noi e, in caso affermativo, utilizzare il nostro workaround.

 

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.