#14 Aprire un file PDF

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
About these ads

Pubblicato il 21 gennaio 2008, in Tips con tag , , . Aggiungi il permalink ai segnalibri. 11 commenti.

  1. 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. Sono felice che questo articolo ti sia stato utile e grazie per avermelo fatto sapere! :-)

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

  4. 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. 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. 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. 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. 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

  9. Se posso vorrei fare una domanda, se ho archiviato in Access dei file PDF (tramite campo OLE)come posso fare per visualizzare i file PDF con vb.net.
    P.S. sto leggendo il tuo libro, ma sull’argomento database in genere non c’è molto.

  10. Ciao! Avrei la necessità di stampare un grande quantità di file PDF che risiedono su web (nello specifico una intranet aziendale) che codice vba per access o meglio excel potrei usare, tenendo conto che ho una tabella con tutti i link?
    Grazie

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 844 follower

%d blogger cliccano Mi Piace per questo: