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.