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:
Posta un commento