VB & .NET - Mario De Ghetto

Visual Basic & .NET: programmare che passione!

#14 Aprire un file PDF

Pubblicato da Mario De Ghetto su 21 Gennaio 2008

Per aprire un file PDF in VB6/VBA, con il programma predefinito (solitamente Acrobat Reader), è possibile utilizzare il seguente codice:

' Sezione dichiarazioni
Public Declare Function ShellExecute _
  Lib "shell32.dll" Alias "ShellExecuteA" _
  (ByVal hwnd As Long, ByVal lpszOp As String, _
  ByVal lpszFile As String, ByVal lpszParams As String, _
  ByVal LpszDir As String, ByVal FsShowCmd As Long) As Long   

Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Sub ApriPDF(NomeFile As String)
  Const SW_SHOWNORMAL As Long = 1
  Const ERROR_BAD_FORMAT As Long = 11
  Const SE_ERR_ACCESSDENIED As Long = 5
  Const SE_ERR_ASSOCINCOMPLETE As Long = 27
  Const SE_ERR_DDEBUSY As Long = 30
  Const SE_ERR_DDEFAIL As Long = 29
  Const SE_ERR_DDETIMEOUT As Long = 28
  Const SE_ERR_DLLNOTFOUND As Long = 32
  Const SE_ERR_FNF As Long = 2         '  file non trovato
  Const SE_ERR_NOASSOC As Long = 31
  Const SE_ERR_PNF As Long = 3         '  percorso non trovato
  Const SE_ERR_OOM As Long = 8         '  memoria esaurita
  Const SE_ERR_SHARE As Long = 26   

  Dim Scr_hDC As Long
  Dim ret As Long
  Dim sMsg As String
  Dim risposta As Long   

  Scr_hDC = GetDesktopWindow()
  ret = ShellExecute(Scr_hDC, "Open", _
      App.Path & "\RELAZIONI\" & _
      NomeFile, "", App.Path & _
      "\RELAZIONI", SW_SHOWNORMAL)   

  If ret <= 32 Then  ' Si è verificato un errore
    Select Case ret
      Case SE_ERR_FNF
          sMsg = "File non trovato"
      Case SE_ERR_PNF
          sMsg = "Percorso non trovato"
      Case SE_ERR_ACCESSDENIED
          sMsg = "Accesso negato"
      Case SE_ERR_OOM
          sMsg = "Memoria esaurita"
      Case SE_ERR_DLLNOTFOUND
          sMsg = "DLL non trovata"
      Case SE_ERR_SHARE
          sMsg = "Violazione di condivisione"
      Case SE_ERR_ASSOCINCOMPLETE
          sMsg = "Associazione di file " & _
              incompleta o non valida"
      Case SE_ERR_DDETIMEOUT
          sMsg = "DDE Time out"
      Case SE_ERR_DDEFAIL
          sMsg = "DDE transazione fallita"
      Case SE_ERR_DDEBUSY
          sMsg = "DDE occupato"
      Case SE_ERR_NOASSOC
          sMsg = "Nessuna associazione per " & _
              "l'estensione del file"
      Case ERROR_BAD_FORMAT
          sMsg = "File EXE non valido o errore " & _
              "nell'immagine EXE"
      Case Else
          sMsg = "Errore sconosciuto"
    End Select   

    If ret = 31 Then
      ' non è installato Acrobat Reader
      risposta = MsgBox("ATTENZIONE: in questo sistema " & _
          "non è installato Acrobat Reader, necessario " & _
          "per visualizzare documenti PDF." & vbCrLf & vbCrLf & _
          "Per installare Acrobat Reader (vers. 5.1 italiana): " & _
          "premere SI" & vbCrLf & "Per annullare l'apertura " & _
          "del documento PDF: premere NO", _
          vbYesNo Or vbCritical, "Installare Acrobat Reader?")
      If risposta = vbYes Then
        ' risposta = SI
        ' ATTENZIONE: se il programma di setup di Acrobat Reader
        ' si trova in un altro percorso, modificare l'istruzione
        ' seguente
        Shell App.Path & "\SETUP\AdbeRdr60_ita_full_WinXP.exe", _
            vbNormalFocus
      Else
        ' risposta = NO
        MsgBox "Apertura documento PDF annullata.", vbInformation
      End If
    Else
      ret = MsgBox("ERRORE: n. " & ret & " - " & _
          sMsg, vbCritical, "ApriPDF")
    End If
  End If
End Sub

8 Risposte a “#14 Aprire un file PDF”

  1. Walter Dice:

    Ti ringrazio per il codice. Avevo un sacco di problemi con l’utilizzo delle DLL di acrobat per la sola visualizzazione di pdf (cambiano le dll al cambiare della versione) e il tuo codice mi ha risolto il problama in modo pulito.

    Ciao e Grazie.

  2. Mario De Ghetto Dice:

    Sono felice che questo articolo ti sia stato utile e grazie per avermelo fatto sapere! :-)

  3. diego Dice:

    Scusa ma inserendo il codice su VS 2005 mi da errore su App dicendomi che non è definita…. devo includere qualche libreria in particolare?

  4. Mario De Ghetto Dice:

    Il codice pubblicato in questo post si riferisce a VB 6.0 oppure a VBA (es. in Access) non a Visual Basic .NET/2005/2008, come specificato all’inizio del post stesso.
    Per aprire un PDF in VB.NET è molto più semplice: basta utilizzare Process.Start, passandogli un oggetto ProcessStartInfo opportunamente inizializzato.
    Per esempio per stampare un file PDF puoi utilizzare una procedura come quella spiegata qui:
    http://www.eggheadcafe.com/software/aspnet/30193766/printing-pdf-from-vbnet.aspx

    :-)

  5. diego Dice:

    Grazie per la risposta e per il link ma soprattutto per la celerità!!!

    Scusa per l’ignoranza ma sopra al titolo del tuo post c’è la dicitura:

    Flash Control for ASP.NET 2.0

    Ancora grazie mille!!

    Ciao.

  6. Mario De Ghetto Dice:

    Quello è il link all’articolo precedente (in ordine cronologico) :-)
    Nella riga dopo vedi “#14 Aprire un file PDF”
    Poi “Pubblicato da …”
    … e infine “Per aprire un file PDF in VB6/VBA …”

    :-)
    Ciao

  7. wladipedia Dice:

    Ho messo in un modulo il tuo codice, poi nel form principale creato un tasto con il seguente codice:

    Private Sub Command1_Click()
    Dim Nome As String
    Nome = App.Path & “\prova.pdf”
    MsgBox Nome
    ApriPDF(Nome)
    End Sub

    Quando premo il tasto, mi dice:
    “Errore di compilazione: prevista variabile o routine e non modulo”

    Uso VB6 e ho imparato con il “fai da te” potresti aiutarmi?

  8. wladipedia Dice:

    Ho risolto, con questo comando applicato ad un bottone, apro tutti i file che mi interessano con il programma predefinito di windows!

    Private Sub BT_SchedaTecnica_Click()

    Shell “rundll32.exe url.dll,FileProtocolHandler ” & (TXT_FileTecnica), vbMaximizedFocus

    End Sub

Lascia una Risposta

XHTML: Puoi usare questi tag: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>