Differenze tra le versioni di "Estrarre immagini da un file PDF con le risorse del API di libpoppler-glib e di libcairo"

Da Gambas-it.org - Wikipedia.
 
(8 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Se un file PDF possiede delle immagini, queste possono essere estratte.
 
Se un file PDF possiede delle immagini, queste possono essere estratte.
  
E' necessario avere installata nel sistema e richiamare nel programma Gambas le librerie dinamiche condivise: "''libpoppler-glib.so.8.15.0''" e "''libcairo.so.2.11600.0''"
+
E' necessario avere installate nel sistema e richiamare nel programma Gambas le librerie condivise: "''libpoppler-glib.so.8.26.0'' " e "''libcairo.so.2.11800.0'' ".
 
 
  
 
Mostriamo un semplice esempio:
 
Mostriamo un semplice esempio:
  Library "libpoppler-glib:8.15.0"
+
Private Const URI As String = "file://"
 +
 +
 +
  Library "<FONT Color=blue>libpoppler-glib:8.26.0</font>"
 
   
 
   
 
  Private poppler_error As String[] = [Null, "INVALID", "ENCRYPTED", "OPEN_FILE", "BAD_CATALOG", "DAMAGED"]
 
  Private poppler_error As String[] = [Null, "INVALID", "ENCRYPTED", "OPEN_FILE", "BAD_CATALOG", "DAMAGED"]
Riga 26: Riga 28:
 
   
 
   
 
   
 
   
  Library "libcairo:2.11600.0"
+
  Library "<FONT Color=darkorange>libcairo:2.11800.0</font>"
 
   
 
   
 
  Private cairo_format As String[] = ["CAIRO_FORMAT_ARGB32", "CAIRO_FORMAT_RGB24", "CAIRO_FORMAT_A8",
 
  Private cairo_format As String[] = ["CAIRO_FORMAT_ARGB32", "CAIRO_FORMAT_RGB24", "CAIRO_FORMAT_A8",
Riga 52: Riga 54:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
   Dim uri, percorso, en As String
+
   Dim percorso, en As String
 
   Dim p, doc, pag, cai As Pointer
 
   Dim p, doc, pag, cai As Pointer
 
   Dim w, h, frm, err As Integer
 
   Dim w, h, frm, err As Integer
 
+
    
   uri = "file://"
+
   percorso = "<FONT Color=darkgreen>''/percorso/del/file.pdf''</font>"
   percorso = "<FONT Color=gray>''/percorso/del/file.pdf''</font>"
 
 
    
 
    
 
  <FONT Color=gray>' ''Carica il file PDF:''</font>
 
  <FONT Color=gray>' ''Carica il file PDF:''</font>
   doc = poppler_document_new_from_file(uri & percorso, Null, VarPtr(p))
+
   doc = poppler_document_new_from_file(URI & percorso, Null, VarPtr(p))
   If doc == 0 Then Error.Raise("Error: " & poppler_error[CInt(String@(p))])
+
   If doc == 0 Then Error.Raise("Errore: " & poppler_error[Val(String@(p))])
 
    
 
    
 
  <FONT Color=gray>' ''Prende in considerazione la prima pagina (indice 0) del file pdf:''</font>
 
  <FONT Color=gray>' ''Prende in considerazione la prima pagina (indice 0) del file pdf:''</font>
 
   pag = poppler_document_get_page(doc, 0)
 
   pag = poppler_document_get_page(doc, 0)
   If pag == 0 Then Error.Raise("Error !")
+
   If pag == 0 Then Error.Raise("Errore !")
 
    
 
    
  <FONT Color=gray>' ''Estrae la prima immagine (indice 0) presente nella pagina del file pdf:''</font>
+
  <FONT Color=gray>' ''Estrae la '''prima''' immagine (indice 0) presente nella pagina del file pdf:''</font>
 
   cai = poppler_page_get_image(pag, 0)
 
   cai = poppler_page_get_image(pag, 0)
   If cai == 0 Then Error.Raise("Error !")
+
   If cai == 0 Then Error.Raise("Errore !")
 
    
 
    
 
  <FONT Color=gray>'''''''''''''''''''''</font>
 
  <FONT Color=gray>'''''''''''''''''''''</font>
Riga 89: Riga 90:
 
    
 
    
 
  <FONT Color=gray>' ''Salva i dati dell'immagine estratta in un'immagine di tipo PNG:''</font>
 
  <FONT Color=gray>' ''Salva i dati dell'immagine estratta in un'immagine di tipo PNG:''</font>
   err = cairo_surface_write_to_png(cai, "/tmp/immagine.png")
+
   err = cairo_surface_write_to_png(cai, "<FONT Color=darkgreen>/tmp/immagine.png</font>")
 
   If err > 0 Then Error.Raise("Errore nella creazione del file immagine .png !")
 
   If err > 0 Then Error.Raise("Errore nella creazione del file immagine .png !")
 
    
 
    
Riga 97: Riga 98:
 
   g_object_unref(doc)
 
   g_object_unref(doc)
 
    
 
    
  '''End'''
+
  End
  
  

Versione attuale delle 15:40, 20 gen 2024

Se un file PDF possiede delle immagini, queste possono essere estratte.

E' necessario avere installate nel sistema e richiamare nel programma Gambas le librerie condivise: "libpoppler-glib.so.8.26.0 " e "libcairo.so.2.11800.0 ".

Mostriamo un semplice esempio:

Private Const URI As String = "file://"


Library "libpoppler-glib:8.26.0"

Private poppler_error As String[] = [Null, "INVALID", "ENCRYPTED", "OPEN_FILE", "BAD_CATALOG", "DAMAGED"]

' popplerDocument *poppler_document_new_from_file (const char *uri, const char *password, GError **error)
' Creates a new PopplerDocument.
Private Extern poppler_document_new_from_file(uri As String, password As String, GError As Pointer) As Pointer

' PopplerPage * poppler_document_get_page (PopplerDocument *document, int index)
' Returns the PopplerPage indexed at index.
Private Extern poppler_document_get_page(document As Pointer, index As Integer) As Pointer

' cairo_surface_t * poppler_page_get_image (PopplerPage *page, gint image_id)
' Returns a cairo surface for the image of the page.
Private Extern poppler_page_get_image(page As Pointer, image_id As Integer) As Pointer

' void g_object_unref (gpointer object)
' Decreases the reference count of object.
Private Extern g_object_unref(gobject As Pointer)


Library "libcairo:2.11800.0"

Private cairo_format As String[] = ["CAIRO_FORMAT_ARGB32", "CAIRO_FORMAT_RGB24", "CAIRO_FORMAT_A8",
                                    "CAIRO_FORMAT_A1", "CAIRO_FORMAT_RGB16_565", "CAIRO_FORMAT_RGB30"]

' int cairo_image_surface_get_width (cairo_surface_t *surface)
' Get the width of the image surface in pixels.
Private Extern cairo_image_surface_get_width(surface As Pointer) As Integer

' int cairo_image_surface_get_height (cairo_surface_t *surface)
' Get the height of the image surface in pixels.
Private Extern cairo_image_surface_get_height(surface As Pointer) As Integer

' cairo_format_t cairo_image_surface_get_format (cairo_surface_t *surface)
' Get the format of the surface.
Private Extern cairo_image_surface_get_format(surface As Pointer) As Integer

' cairo_status_t cairo_surface_write_to_png(cairo_surface_t *surface, const char *filename)
' Writes the contents of surface to a new file filename as a PNG image.
Private Extern cairo_surface_write_to_png(cairo_surface As Pointer, filename As String) As Integer

' void cairo_surface_destroy (cairo_surface_t *surface)
' Decreases the reference count on surface by one.
Private Extern cairo_surface_destroy(cairo_surface As Pointer)


Public Sub Main()

 Dim percorso, en As String
 Dim p, doc, pag, cai As Pointer
 Dim w, h, frm, err As Integer
 
 percorso = "/percorso/del/file.pdf"
  
' Carica il file PDF:
 doc = poppler_document_new_from_file(URI & percorso, Null, VarPtr(p))
 If doc == 0 Then Error.Raise("Errore: " & poppler_error[Val(String@(p))])
  
' Prende in considerazione la prima pagina (indice 0) del file pdf:
 pag = poppler_document_get_page(doc, 0)
 If pag == 0 Then Error.Raise("Errore !")
  
' Estrae la prima immagine (indice 0) presente nella pagina del file pdf:
 cai = poppler_page_get_image(pag, 0)
 If cai == 0 Then Error.Raise("Errore !")
  
''''''''''''''''
   
' Ottiene alcune informazioni sull'immagine estratta:
 w = cairo_image_surface_get_width(cai)
 h = cairo_image_surface_get_height(cai)
 Print "Informazioni sull'immagine estratta"
 Print "Dimensioni: "; w; " x "; h; " pixel"
 frm = cairo_image_surface_get_format(cai)
 If frm = -1 Then
   en = "CAIRO_FORMAT_INVALID"
 Else
   en = cairo_format[frm]
 Endif
 Print "Formato:    "; en
  
' Salva i dati dell'immagine estratta in un'immagine di tipo PNG:
 err = cairo_surface_write_to_png(cai, "/tmp/immagine.png")
 If err > 0 Then Error.Raise("Errore nella creazione del file immagine .png !")
 
' Al termine libera la memoria precedentemente occupata:
 cairo_surface_destroy(cai)
 g_object_unref(pag)
 g_object_unref(doc)
  
End


Riferimenti