Come spesso mi capita di dire nel forum, una delle migliori librerie per lavorare con files PDF da codice .net, è sicuramente ITextSharp.
Perciò, quando tempo fa ho avuto l'esigenza di convertire un formato TIFF (
Tagged Image File Format) in PDF tramite codice C#, ho pensato da subito a combinare un po' di possibilità del namespace "
System.Drawing" di .net per le immagini, e quelle fornite da
ITextSharp per i files PDF.
Il codice che ne è venuto fuori è abbastanza semplice, infatti la cosa complicata era estrapolare le immagini che formano il tiff, qui mi viene in aiuto la classe "FrameDimension" e il metodo "GetFrameCount" :
private static List<Image> GetPagine(string file)
{
List<Image> pagine = new List<Image>();
Image image = Bitmap.FromFile(file);
FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]);
for (int i = 0; i < image.GetFrameCount(dimension); i++)
{
image.SelectActiveFrame(dimension, i);
pagine.Add(image.Clone() as Image);
}
return pagine;
}
Quando sono riuscito ad avere la lista delle immagini, è stato semplice con ItextSharp creare una pagina di un PDF formata dall'immagine, e farne una per pagina:
public static void GeneraPdf(string pathTiff, string outputFile)
{
//--- safety code
if (File.Exists(outputFile))
File.Delete(outputFile);
//--- genero un doc A4
iTextSharp.text.Document document = new iTextSharp.text.Document();
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFile, FileMode.CreateNew));
document.Open();
foreach (Image img in GetPagine(pathTiff))
{
//--- disegno un'immagine alla volta per pagina
iTextSharp.text.Image immagine = iTextSharp.text.Image.GetInstance(img, img.RawFormat);
//--- spazio utile
float larghezza = document.PageSize.Width - (document.LeftMargin + document.RightMargin);
float altezza = document.PageSize.Height - (document.TopMargin + document.BottomMargin);
//--- se pi larga la scalo e la incastro nella pagina
if (immagine.Width > larghezza)
immagine.ScaleToFit(larghezza, altezza);
//--- il Top rispetto al basso
immagine.SetAbsolutePosition(document.LeftMargin, document.TopMargin);
//--- disegno l'immagine nella pagina
writer.DirectContent.AddImage(immagine);
document.NewPage();
}
document.Close();
}
Conclusioni:
La cosa simpatica è che il codice funziona anche per la singola immagine normale, non serve che sia per forza TIFF quindi "multi-immagine", infatti il metodo "GetPagine" nel caso di "jpeg, gif, bmp etc..." torna solamente l'immagine principale (se stessa), e quindi il PDF sarà formato da una sola pagina.
* Come si vede dal codice,se l'immagine è grande viene ridimensionata per essere incastrata in un formato A4, valutare se è un comportamento corretto.