Newsgroup: it.comp.lang.visual-basic
Titolo: Stampa File PDF

Salve a tutti ho un problema, vorrei stampare alcuni file .pdf da
un'applicazione di vb utilizzando acrobat readers 7.0
Ho visto che caricando la libreria di acrobat ho due possibilità per
effettuare la stampa, utilizzando la classe "AcroAVDoc" o altrimenti
utilizzando la classe "AcroPDF".
Purtroppo entrambi mi danno dei problemi, la prima funziona
perfettamente con acrobat professional ma non funziona con il readers,
pur essendo presente la classe. la seconda non mi da errori però la
stampa non viene eseguita.
sapete darmi qualche indicazione?
Ciao e Grazie

 sapete darmi qualche indicazione?
Prova il codice sopra, oppure posta il tuo e lo provo io.
Bye, G. 


Ciao, grazie per avermi risposto, ho provato ad utilizzare questo ocx
ma utilizzandolo in un ciclo for next non mi stampa tutti i file ed
inoltre andando a verificare nei processi rimane aperto acrobat.exe,
dopodichè se non termino tale processo non viene eseguita nessuna
stampa senza sollevare errori.
ciao e grazie

 stampa senza sollevare errori.
ShellExecute(0, "print", sPathFilePDF, 0&, 0&, 1)
Troppo rozzo?
Ciao
Fritz


Ciao ti ringrazio della risposta, avevo già tentato questa soluzione
ma ho avuto dei problemi nel stampare più di un file eseguento un
loop, cioè nel senso che alcuni file non vengono stampati, e poi mi
rimane acrobat.exe aperto come processo. Ho provato anche il comando
Shell ma non fa al caso mio perchè devo far stampare gli utenti da più
PC che non hanno tutti la stessa versione di acrobat.
ciao e grazie

 PC che non hanno tutti la stessa versione di acrobat.
Ma l'usare il comando Shell era appunto la soluzione più indipendente
dalla versione installata.
In alternativa (se hai solo dei Reader) io ho usato anche il DDE:
Public Sub StampaFileReader(sFile As String, tb As TextBox)
    '// Adobe Acrobat "Reader" only supports thist DDE messages:
    '// CloseAllDocs, DocClose, DocGoTo, DocGoToNameDest,
    '// DocOpen, FileOpenEx, FilePrintEx, FilePrintSilentEx,
    '// FilePrintToEx, and AppExit.
    Dim lngTID As Long
    '// Open Acrobat Reader
    lngTID = Shell(GVAcrobatPath, vbHide)
    '// Print in silent mode my pdf file
    tb.LinkMode = vbLinkNone
    tb.LinkTopic = "acroview|control"
    tb.LinkMode = vbLinkManual
    tb.LinkTimeout = 32767
    tb.LinkExecute "[FilePrintSilent(""" & sFile & """)]"
    '// Close Acrobat Reader and that's it, we've finished!!!
    tb.LinkMode = vbLinkNone
    tb.LinkTopic = "acroview|control"
    tb.LinkMode = vbLinkManual
    tb.LinkTimeout = 32767
    tb.LinkExecute "[AppExit]"
    '(Text1 is a simple TexBox Control, in VB we use this control
    ' to send DDE messages to other aplications)
End Sub


Il codice che mi hai mandato funziona perfettamente però ad essere
pignoli io devo far girare il programma sia su macchine che hanno il
readers che su macchine che hanno il professional. Hai qualche idea
per non mettere il percorso dell'eseguibile di acrobat?
Grazie ancora

 per non mettere il percorso dell'eseguibile di acrobat?
No, ma il percorso dell'eseguibile lo recuperi dal registry:
HKEY_CLASSES_ROOT\Software\Adobe\Acrobat\Exe
Ciao
Fritz


Ti ringrazio ancora, potresti farmi vedere come leggere il registry?
ciao e grazie

Ti ringrazio ancora, potresti farmi vedere come leggere il registry?
Spero ci sia tutto, comunque le funzioni sono sGetAcrobatPath (legge
il percorso e il nome dell'eseguibile Acrobat) e sGetAcrobatVer (legge
la versione di Acrobat) ed entrambe usano la QueryValueEx che legge
dal registry:
Global Const HKEY_CLASSES_ROOT = &H80000000
Global Const REG_ROOTDIR_ACROBAT = "Software\Adobe\Acrobat\Exe"
Global Const REG_ROOTDIR_ACROBAT_VER = "AcroExch.App\AcrobatVersion"
'Action constants for registry functions
Global Const SYNCHRONIZE = &H100000
Global Const READ_CONTROL = &H20000
Global Const STANDARD_RIGHTS_ALL = &H1F0000
Global Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
Global Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Global Const STANDARD_RIGHTS_REQUIRED = &HF0000
Global Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Global Const KEY_CREATE_LINK = &H20
Global Const KEY_CREATE_SUB_KEY = &H4
Global Const KEY_ENUMERATE_SUB_KEYS = &H8
Global Const KEY_EVENT = &H1
Global Const KEY_NOTIFY = &H10
Global Const KEY_SET_VALUE = &H2
Global Const KEY_QUERY_VALUE = &H1
Global Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE
Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or
KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
Global Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or
KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Global Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or
KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
Global Const KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))
Public Function sGetAcrobatPath() As String
   Dim sValue As String
 
   sValue = QueryValueEx(HKEY_CLASSES_ROOT, REG_ROOTDIR_ACROBAT, "")
   If sValue = "-1" Then
      sGetAcrobatPath = ""
      Exit Function
   Else
      sGetAcrobatPath = sValue
   End If
 
End Function
Public Function sGetAcrobatVer() As String
   Dim sValue As String
 
   sValue = QueryValueEx(HKEY_CLASSES_ROOT, REG_ROOTDIR_ACROBAT_VER,
"")
   If sValue = "-1" Then
      sGetAcrobatVer = ""
      Exit Function
   Else
      sGetAcrobatVer = sValue
   End If
 
End Function
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA"
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As
Long, ByVal samDesired As Long, phkResult As Long) As Long
'API functions for registry manipulation
Function QueryValueEx(lPrimKey As Long, sSubKey As String, sValueName
As String) As Variant
Dim result As Long
Dim hKey As Long
Dim vValue As Variant
Dim sValue As String * 80
Dim lValue As Long
Dim lpType As Long
Dim lpcbData As Long
On Error GoTo QueryValueExErr
  ' APERTURA DELLA CHIAVE
  result = RegOpenKeyEx(lPrimKey, RTrim(sSubKey), 0, KEY_READ, hKey)
  If result <> ERROR_NONE Then
    ' Percorso non trovato
    GoTo QueryValueExErr
  End If
  lpcbData = 80
  ' LETTURA DEL TIPO DELLA CHIAVE
  result = RegQueryValueEx(hKey, sValueName, 0, lpType, ByVal 0, ByVal
0)
  If result <> ERROR_NONE Then
    ' Chiave non trovata
    GoTo QueryValueExErr
  End If
 
  Select Case lpType
    Case REG_SZ, REG_EXPAND_SZ
      ' LETTURA DEL VALORE DELLA CHIAVE
      result = RegQueryValueEx(hKey, sValueName, 0, lpType, ByVal
sValue, lpcbData)
      If result <> ERROR_NONE Then
        GoTo QueryValueExErr
      ElseIf lpcbData = 0 Then
        QueryValueEx = ""
      Else
        QueryValueEx = Left(sValue, lpcbData - 1)
      End If
    Case REG_DWORD
      ' LETTURA DEL VALORE DELLA CHIAVE
      result = RegQueryValueEx(hKey, sValueName, 0, lpType, lValue, 4)
      If result <> ERROR_NONE Then
        GoTo QueryValueExErr
      Else
        QueryValueEx = lValue
      End If
    Case Else
      GoTo QueryValueExErr
 
  End Select
  ' CHIUSURA DELLA CHIAVE
  RegCloseKey (hKey)
  Exit Function
QueryValueExErr:
  ' Errore generico
  RegCloseKey (hKey)
  QueryValueEx = "-1"
  Exit Function
End Function
Ciao
-- 
Fritz
Togli *ERASE* per rispondere in e-mail.

 Il Fri, 23 Jan 2009 08:38:02 -0800 (PST), 
r.sod...@kedrion.com
 ha

Ancora una volta grazie, funziona tutto perfettamente. Però vorrei
disturbarti ancora, secondo te è possibile fare tutto questo invece
che da un eseguibile da una dll? perchè ti spiego con l'eseguibile
funziona perfettamente ma io vorei creare una dll per essere
utiulizzata da qualsiasi tipo di programma. (es. access, excel, word)
A quanto ho capito non si può fare, infatti mi viene sollevato un
errore però volevo una conferma.
ciao e grazie ancora

 errore però volevo una conferma.
Se funziona con l'eseguibile,
dovrebbe funzionare anche sotto forma di libreria,
a cui poi fai riferimento nelle macro di office.
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

che da un eseguibile da una dll?
Spiacente ma non ho esperienza con le DLL.
Ciao
Fritz