Freeteo


Pensieri e C#dice di Matteo Raumer

Convertire un'immagine TIFF in PDF

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.
 
Categoria: Tips
lunedì, 25 mag 2009 Ore. 11.32

Messaggi collegati






  • Views Home Page: 248.544
  • Views Posts: 427.114
  • Views Gallerie: 597.119
  • n° Posts: 163
  • n° Commenti: 148
Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Anno 2005
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003