Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - convertire file esterno da pdf a tiff
Forum - C# / VB.NET - convertire file esterno da pdf a tiff

Avatar
cekko82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 20:29
Domenica, 28/06/2009
Ciao a tutti,

vorrei convertire un file esterno da pdf a tiff, senza aprire il file o visualizzare alcuna applicazione,
in parte ci sono riuscito richiamando questa sub ed impostando come stampante predefinita Microsoft Office Document Image Writer :

Public Sub StampaFile(ByVal Path As String)
Dim printp As New Process
printp.StartInfo.FileName = Path
printp.StartInfo.Verb = "Print"
printp.Start()
End Sub

In questo modo (utilizzando una stampante virtuale), mi apre ogni volta la finestra in cui devo specificare nome e destinazione del file tiff.

In pratica vorrei passare ad una sub come variabili il file di origine, il file di destinazione ed i relativi percorsi;
qualcuno sa darmi qualche indicazione per migliorare la soluzione che ho indicato?

Grazie anticipatamente,
ciao
Francesco

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 12:24
Lunedì, 29/06/2009
allora, io il problema l'ho risolto in questo modo usando due librerie esterne gratuite: GflAx e Ghostscript

il codice:
Codice sorgente - presumibilmente C#

  1. public static string PdfToPng(string nomeFile, string pathImg)
  2.         {
  3.             GflAx.GflAx image = new GflAxClass();
  4.  
  5.             string saves;
  6.  
  7.             image.EpsDpi = 352;
  8.             image.Page = 1;
  9.             image.LoadBitmap(nomeFile);
  10.             image.SaveFormat = GflAx.AX_SaveFormats.AX_PNG;
  11.             saves = pathImg + @"\" + ListaFile.EstraiNomeFile(nomeFile) + "tmp.png";
  12.             image.SaveBitmap(saves);
  13.  
  14.             return saves;
  15.         }



ListaFile è una mia classe ma il metodo estrae dal path il solo nome del file senza .pdf

poi faccio:

Codice sorgente - presumibilmente C#

  1. public static string PngToTiff(string nomeFile, string pathImg)
  2.         {
  3.             string saves = PdfToPng(nomeFile, pathImg);
  4.             System.Drawing.Image bm = System.Drawing.Image.FromFile(saves);
  5.             saves = pathImg + @"\" + ListaFile.EstraiNomeFile(nomeFile) + ".tiff";
  6.             bm.Save(saves,
  7.                 System.Drawing.Imaging.ImageFormat.Tiff);
  8.             bm.Dispose();
  9.  
  10.             return saves;
  11.         }



mi funziona...anche se ho dovuto applicare dei filtri bianco-nero per diminuire la grandezza del file visto che altrimenti il fax impiegava parecchio tempo ad inviare il documento.

Ultima modifica effettuata da lorenzo il 29/06/2009 alle 13:38
PM Quote
Avatar
cekko82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 12:21
Martedì, 30/06/2009
Ciao Lorenzo,

intanto grazie per la risposta,
nel pomeriggio provo a lavorarci su.
Piu' darti ti faccio sapere cosa sono riuscito a combinare!

Grazie
Ciao

PM Quote
Avatar
cekko82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 0:36
Mercoledì, 01/07/2009
Ciao Lorenzo,

mi sono imbattuto subito in un problema legato alle librerie.

Ho scaricato da http://www.xnview.com/en/download_gfl.html
la libreria di GflaAx, ho "installato" il file eseguibile (penso che abbia solamente creato una cartella in c:\program files\GflSDK\ecc.. con dentro tutte le risorse, tra cui GflAx.dll).

Utilizzo Visual Basic 2008 express edition e non riesco a capire come referenziare questa libreria all'interno del mio progetto.
Se provo dal Menu->Progetto->Nuovo riferimento-> sfoglia, mi da un errore quando seleziono il file GflAx.dll.

Come avrai intuito, sono proprio alle prime armi!!
:-|

Grazie
ciao

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 9:35
Mercoledì, 01/07/2009
non preoccuparti, anche io all'inizio non trovavo il file giusto.
allora, come hai detto ti viene creata una cartella con dentro tutti i file.
da prompt dei comandi(start->esegui->cmd) posizionati con il comando cd nel percorso GflAx\Lib\std dela cartella che l'installazione ti ha creato

poi esegui il comando regsvr32 GflAx.dll

Dopo che ti viene data conferma, non aggiungere la dll manualmente e invece di fare sfoglia da visual studio vai nell'elenco dei componenti COM dove dovrebbe esserci GflAx se non ricordo male :k:

Ultima modifica effettuata da lorenzo il 01/07/2009 alle 9:36
PM Quote
Avatar
cekko82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 13:02
Mercoledì, 01/07/2009
Ciao Lorenzo,

Le tue idicazioni erano corrette, ma avendo io windows vista..ho incontrato qualche difficoltà con i permessi, comunque ho risolto il caricamento della di Gflax.dll in questo modo:

1) bisogna eseguire cmd.exe come amministratore,
C:\Windows\System32\cmd.exe->tasto destro con il mouse ed indicare "Esegui come Amministratore"

2) eseguire il comando "C:\Program Files\GflSDK\GflAx\Lib\std\regsvr32 GflAx.dll"
(il percorso in cui c'è la dll dipende da dove si scarica la cartella con i file)

Poi ho riscritto in vb il codice che hai postato, ma anche qui mi sono bloccato su image.LoadBitmap(nomeFile)
non accetta file con estensione pdf, ho questo errore:

"Eccezione first-chance di tipo 'System.Runtime.InteropServices.COMException'"

ho provato a passare un jpg, ma ho dovuto comunque assegnare alla variabile nomeFile tutto il percorso del file.
Effettivamente così non si blocca e mi salva il file .png

Per semplicità non ho crato una mia classe come hai fatto tu, ma ricavo il nome del file senza estesione con un espressione ed assegno il valore ad una variabiel nomeFile2.

Riporto il codice :
    Public Function PdfToPng(ByVal nomeFile As String, ByVal pathImg As String)

        Dim image As New GflAxClass()
        Dim saves As String
        Dim nomeFile2 As String

        nomeFile2 = Mid(nomeFile, 1, (Len(nomeFile) - 4))

        image.EpsDpi = 352
        image.Page = 1
        image.LoadBitmap(pathImg & "\" & nomeFile)
        image.SaveFormat = GflAx.AX_SaveFormats.AX_PNG
        saves = pathImg + "\" + nomeFile2 + "tmp.png"
        image.SaveBitmap(saves)
        Return saves
    End Function

Hai qualche idea del motivo per cui non mi prende i file .pdf?
Ciao,grazie

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 13:28
Mercoledì, 01/07/2009
hai installato ghostscript?
è la combinazione delle due librerie che permette la conversione, visto che ghostscript fa vedere i pdf come bitmap alla libreria

per installare ghostscript basta che fai andare l'eseguibile, non c'é bisogno di registrare librerie, fa tutto da solo
e non devi nemmeno referenziarla ne chiamarla nel codice, basta solo che sia installata sul pc

PM Quote
Avatar
cekko82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 19:16
Mercoledì, 01/07/2009
Ciao Lorenzo,

funziona!!
mi mancava l'installazione di ghostscrip t:k:

Sto facendo delle prove e non capisco, perchè fai un doppio passaggio pdf->png->tiff ?
Ho provato usando la prima funzione a passarlgi il parametro
Codice sorgente - presumibilmente Plain Text

  1. image.SaveFormat = GflAx.AX_SaveFormats.AX_TIFF


e converte da pdf a tiff.

Mi converte solo la prima pagina del file .pdf, ho provato a modificare la proprietà .page, ma mi da errore, esiste un modo per estrare piu' pagine? esiste una proprietà per impostare il tipo di compressione del tiff?

Intanto posto per tutti il codice vb.net che ho scritto grazie a te:

Funzione per convertire da .pdf a .png
Codice sorgente - presumibilmente VB.NET

  1. Public Function PdfToPng(ByVal nomeFile As String, ByVal pathImg As String)
  2.  
  3.         Dim image As New GflAxClass()
  4.         Dim saves As String
  5.         Dim nomeFile2 As String
  6.         Dim npages As Integer
  7.  
  8.         nomeFile2 = Mid(nomeFile, 1, (Len(nomeFile) - 4))
  9.  
  10.         npages = image.NumberOfPages
  11.  
  12.         image.EpsDpi = 352
  13.         image.Page = 1
  14.         image.LoadBitmap(pathImg & "\" & nomeFile)
  15.         npages = image.NumberOfPages
  16.         image.SaveFormat = GflAx.AX_SaveFormats.AX_PNG 'AX_PNG
  17.         saves = pathImg + "\" + nomeFile2 + "tmp.png" '"tmp.png"
  18.         image.SaveBitmap(saves)
  19.  
  20.         Return saves
  21.  
  22.     End Function



Funzione per convertire da .png .tiff

Codice sorgente - presumibilmente VB.NET

  1. Public Function PngToTiff(ByVal nomeFile As String, ByVal pathImg As String)
  2.         Dim bm As System.Drawing.Image
  3.         Dim saves As String
  4.         Dim nomeFile2 As String
  5.  
  6.         nomeFile2 = Mid(nomeFile, 1, (Len(nomeFile) - 4))
  7.         saves = PdfToPng(nomeFile, pathImg)
  8.         bm = System.Drawing.Image.FromFile(saves)
  9.  
  10.         saves = pathImg + "\" + nomeFile2 + ".tiff"
  11.         bm.Save(saves, System.Drawing.Imaging.ImageFormat.Tiff)
  12.         bm.Dispose()
  13.  
  14.         Return saves
  15.     End Function



Provo a guardare un po' meglio, magari riesco a farti una domanda piu' precisa,
per ora grazie mille Lorenzo.
;)

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 19:57
Mercoledì, 01/07/2009
non ne sono sicuro, è passato del tempo, però mi sembra che la versione free di GflAx non permette di passare da pdf a tiff
non prenderlo per oro colato però dovrebbe essere per questo motivo

e poi:
image.EpsDpi = 352

sistemalo come vuoi tu
più è alto più tempo impiega a convertire
a me andava bene perché così risparmiavo tempo al fax, però si può anche abbassare

Ultima modifica effettuata da lorenzo il 01/07/2009 alle 20:00
PM Quote