lunedì 1 febbraio 2016

.Net rilevare le immagini in un file Pdf C# e VB.Net

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_net-estrapolare-immagini-da-un-file-pdf-_1437.aspx


A volte può capitare che dobbiamo estrapolare delle immagini da un file PDF, in questo articolo vedremo tramite il linguaggio di programmazione Visual Basic .Net e C#, come rilevare e salvare sul proprio pc file di tipo jpeg, contenente l’immagine che si trova nel file PDF.
Per la gestione dei file PDF, utilizzeremo la libreria gratuita ITextSharp che permette un ottima gestione dei file PDF.
Si crea un progetto di tipo “Windows Application” tramite il linguaggio di vostro interesse, a questo punto nella form inseriamo un pulsante, nell’evento click del pulsante andremo ad elaborare il file PDF.
Aggiungiamo al progetto il riferimento alla libreria ItextSharp.
Stesura del codice
Passiamo in visualizzazione codice, in modo che possiamo elaborare il file “Pdf”.
Aggiungiamo i riferimenti per la gestione dei file Pdf ed immagine.



VB.Net

Imports iTextSharp

Imports iTextSharp.text.pdf

Imports System.IO

Imports System.Drawing.Imaging

Imports iTextSharp.text.pdf.parser

 

 

C#

using iTextSharp;

using iTextSharp.text.pdf;

using System.IO;

using System.Drawing.Imaging;

using iTextSharp.text.pdf.parser;


Nell’evento click scriviamo il nome della funzione nel quale si trova il codice per l’elaborazione del file.
Qui di seguito il frammento di codice.



VB.Net

Private Sub BtnEstrai_Click(sender As System.Object, e As System.EventArgs) Handles BtnEstrai.Click

        EstraiImmagine("E:\MioFilePDF.pdf")

    End Sub

 

 

C#

private void BtnEstrai_Click(object sender, EventArgs e)

        {

            EstraiImmagine(@"E:\MioFilePDF.pdf");

 

        }



Naturalmente va cambiato il percorso e nome del file che si vuole elaborare.
La funzione “EstraiImmagine” avrà lo scopo di elaborare il file PDF, tramite le classi “PdfDictionary”, “PdfReader” in particolare rilevare la risorsa nella prima pagina che viene indicato nel metodo “GetPageN”.
Tramite la classe “ImageRenderInfo” otteniamo il riferimento all’immagine, o meglio l’oggetto che possiamo salvare nel nostro pc.
Qui di seguito le suddette operazioni per entrambi i linguaggi.




VB.Net

Private Sub EstraiImmagine(percorsoFilePdf As String)

        Try

            Dim FilePdf As PdfReader = New PdfReader(percorsoFilePdf)

            'Leggo la prima pagina

            Dim pagina As PdfDictionary = FilePdf.GetPageN(1)

            'estrapolo gli oggetti

            Dim risorsa As PdfDictionary = CType(PdfReader.GetPdfObject(pagina.Get(PdfName.RESOURCES)), PdfDictionary)

 

            Dim oggetti As PdfDictionary = CType(PdfReader.GetPdfObject(risorsa.Get(PdfName.XOBJECT)), PdfDictionary)

 

            Dim NomeFile As String = "immagine"

            'Ciclo per ogni immagine ed estrapolo tutte le immagini della prima pagina

            Dim contatore As Integer = 1

 

            For Each nome As PdfName In oggetti.Keys

 

                Dim Immagine As PdfObject = oggetti.Get(nome)

                If Immagine.IsIndirect() Then

 

                    Dim pdfDictionary As PdfDictionary = CType(PdfReader.GetPdfObject(Immagine), PdfDictionary)

 

                    Dim width As String = pdfDictionary.Get(PdfName.WIDTH).ToString()

                    Dim height As String = pdfDictionary.Get(PdfName.HEIGHT).ToString()

                    Dim ImmagineOttenuta As ImageRenderInfo = ImageRenderInfo.CreateForXObject(New Matrix(Single.Parse(width), Single.Parse(height)),

                        CType(Immagine, PRIndirectReference), pdfDictionary)

                    SalvaImmagine(ImmagineOttenuta, NomeFile & contatore & ".jpeg")

                    contatore += 1

                End If

 

 

            Next

 

 

 

 

 

        Catch ex As Exception

            MessageBox.Show("Errore: " + ex.Message)

        End Try

    End Sub

 

C#

   private void EstraiImmagine(string percorsoFilePdf)

        {

          

            try

            {

 

                

                PdfReader FilePdf = new PdfReader(percorsoFilePdf);

                //Leggo la prima pagina

                PdfDictionary pagina = FilePdf.GetPageN(1);

                //estrapolo gli oggetti

                PdfDictionary risorsa = (PdfDictionary)PdfReader.GetPdfObject(pagina.Get(PdfName.RESOURCES));

                PdfDictionary oggetti = (PdfDictionary)PdfReader.GetPdfObject(risorsa.Get(PdfName.XOBJECT));

                string NomeFile = "immagine";

                //Ciclo per ogni immagine ed estrapolo tutte le immagini della prima pagina

                int contatore = 1;

                foreach (PdfName nome in oggetti.Keys)

                {

                    

                        PdfObject Immagine = oggetti.Get(nome);

                        if (Immagine.IsIndirect())

                        {

                            PdfDictionary pdfDictionary = (PdfDictionary)PdfReader.GetPdfObject(Immagine);

                            string width = pdfDictionary.Get(PdfName.WIDTH).ToString();

                            string height = pdfDictionary.Get(PdfName.HEIGHT).ToString();

                            ImageRenderInfo ImmagineOttenuta = ImageRenderInfo.CreateForXObject(new Matrix(float.Parse(width), float.Parse(height)),

                                (PRIndirectReference)Immagine, pdfDictionary);

                            SalvaImmagine(ImmagineOttenuta, NomeFile + contatore + ".jpeg");

                            contatore += 1;

                        }

                }

 

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

 

            

        }





Siamo giunti alla conclusione del nostro articolo, dobbiamo scrivere il metodo che permette di salvare sul nostro pc l’immagine che abbiamo rilevato dal file Pdf.
Tramite la classe PdfimageObject potremmo gestire l’immagine che abbiamo rilevato dal file PDF, mentre la classe MemeryStream ci permette di trasformare l’oggetto in stream di dati che tramite la classe bitmap possiamo salvare nel nostro pc con il metodo “Save”.
Qui di seguito il frammento di codice di tale operazioni






Vb.Net

Sub SalvaImmagine(renderInfo As ImageRenderInfo, NomeFileDaSalvare As String)

 

        Dim immagineDaPdf As PdfImageObject = renderInfo.GetImage()

        Using immagineDaSalvare As Image = immagineDaPdf.GetDrawingImage()

 

            If immagineDaSalvare IsNot Nothing Then

                Using ms As New MemoryStream()

                    immagineDaSalvare.Save(ms, ImageFormat.Jpeg)

                    Dim Bitmap As Bitmap = New Bitmap(immagineDaSalvare)

                    Bitmap.Save("E:\\" + NomeFileDaSalvare)

                End Using

 

            End If

        End Using

 

 

    End Sub

 

 

C#

private void SalvaImmagine(ImageRenderInfo renderInfo, string NomeFileDaSalvare)

        {

            PdfImageObject immagineDaPdf = renderInfo.GetImage();

            using (Image immagineDaSalvare = immagineDaPdf.GetDrawingImage())

            {

                if (immagineDaSalvare != null)

                {

                    using (MemoryStream ms = new MemoryStream())

                    {

                        immagineDaSalvare.Save(ms, ImageFormat.Jpeg);

                        Bitmap bitMap = new Bitmap(immagineDaSalvare);

                        bitMap.Save("E:\\" + NomeFileDaSalvare);

 

                    }

                }

 

 

                

            }

       

        }






Conclusioni
In questo articolo abbiamo visto come con poche righe di codice possiamo estrae le informazioni contenute in un file Pdf, sul nostro pc. L’articolo può divenire anche una base per la realizzazione di un Software per gestire i file Pdf.
Tramite la parola “Download” è possibile scaricare il file di questo articolo.

Nessun commento: