Impresion de PDF's desde VB6
Publicado por Alfonso Perez Manrique (1 intervención) el 29/01/2012 06:43:26
Necesito imprimir varios PDF’s desde mi aplicación, después de mucho buscar encontré algunas alternativas, sin embargo ninguna me funciona al cien por ciento. Espero me puedan ayudar, y me explicaran cual es mi falla:
Alternativa 1: Uso la función SHELL en donde ejecuto la siguiente línea de comando
que es descrita en la bibliografía de ADOBE y según esta suprime el cuadro de dialogo de Impresión y termina Reader.
Sin embargo, por cada archivo abre una ventana de acrobat y no logro cerrarlo. Imaginen que el usuario mande imprimir 50 archivos.
Alternativa 2: Usando Shell con api’s
El inconveniente de esta alternativa es que es que se queda ciclado el DO hasta que manualmente el usuario cierra el Reader.
Alternativa 3: Uso la función de API ShellExecute
Esta alternativa se brinca el DO por ende se abren tantos Reader como archivos se hayan impreso.
Alternativa 4: Usar la librería de Adobe Acrobat
El inconveniente de esta alternativa es que al ejecutar la línea que contiene PrintPages o PrintPagesSilent nada pasa, solo se ejecuta pero nada imprime, no manda error alguno.
Agradezco de antemano su atención, y le envió saludos cordiales
Alfonso
Alternativa 1: Uso la función SHELL en donde ejecuto la siguiente línea de comando
1
Acrobat.exe /t filename.pdf printername drivername portname
que es descrita en la bibliografía de ADOBE y según esta suprime el cuadro de dialogo de Impresión y termina Reader.
1
2
3
4
5
6
Private Sub cmdImpShell_Click()
Dim NumArch As Integer
For NumArch = 1 To 9
Shell "C:\Program Files\Adobe\Adobe Acrobat 7.0\Acrobat\Acrobat.exe /t C:\Prueba0" & NumArch & ".pdf", vbMinimizedNoFocus
Next NumArch
End Sub
Sin embargo, por cada archivo abre una ventana de acrobat y no logro cerrarlo. Imaginen que el usuario mande imprimir 50 archivos.
Alternativa 2: Usando Shell con api’s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, _
lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STATUS_PENDING = &H103&
Private Const SYNCHRONIZE = &H100000
Private Sub cmdShellAPI_Click()
Dim NumArch As Integer
For NumArch = 1 To 9
EjecutarShell "C:\Program Files\Adobe\Adobe Acrobat 7.0\Acrobat\Acrobat.exe /t C:\Prueba0" & NumArch & ".pdf"
Next NumArch
End Sub
Public Function EjecutarShell(pvcComandoEjecutar As String) As Boolean
Dim vlnHandleProceso As Long
Dim vlnProcesoID As Long
Dim vlnCodigoSalida As Long
vlnProcesoID = Shell(pvcComandoEjecutar, vbHide)
vlnHandleProceso = OpenProcess(PROCESS_QUERY_INFORMATION, False, vlnProcesoID)
Do
Call GetExitCodeProcess(vlnHandleProceso, vlnCodigoSalida)
DoEvents
Loop While STATUS_PENDING = vlnCodigoSalida
Call CloseHandle(vlnHandleProceso)
EjecutarShell = True
End Function
El inconveniente de esta alternativa es que es que se queda ciclado el DO hasta que manualmente el usuario cierra el Reader.
Alternativa 3: Uso la función de API ShellExecute
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, _
lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STATUS_PENDING = &H103&
Private Const SYNCHRONIZE = &H100000
Private Sub cmdImpShellExe_Click()
Dim NumArch As Integer
For NumArch = 1 To 9
ImprimirShellExe Me.hwnd, "C:\Prueba0" & NumArch & ".pdf"
Next NumArch
End Sub
Public Function ImprimirShellExe(pvnHandle As Long, pvcArchivo As String) As Boolean
Dim vlnHandleProceso As Long
Dim vlnProcesoID As Long
Dim vlnCodigoSalida As Long
vlnProcesoID = ShellExecute(pvnHandle, "Print", pvcArchivo, 0&, 0&, 1)
vlnHandleProceso = OpenProcess(PROCESS_QUERY_INFORMATION, False, vlnProcesoID)
Do
Call GetExitCodeProcess(vlnHandleProceso, vlnCodigoSalida)
DoEvents
Loop While STATUS_PENDING = vlnCodigoSalida
Call CloseHandle(vlnHandleProceso)
ImprimirShellExe = True
End Function
Esta alternativa se brinca el DO por ende se abren tantos Reader como archivos se hayan impreso.
Alternativa 4: Usar la librería de Adobe Acrobat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub cmdImpAcrobat_Click()
AcrobatPrint
End Sub
Public Sub AcrobatPrint()
Dim AcroExchApp As Acrobat.CAcroApp
Dim AcroExchAVDoc As Acrobat.CAcroAVDoc
Dim AcroExchPDDoc As Acrobat.CAcroPDDoc
Dim NumPag As Integer
Dim ArchPDF As String
ArchPDF = "C:\prueba01.pdf"
Set AcroExchApp = CreateObject("AcroExch.App")
Set AcroExchAVDoc = CreateObject("AcroExch.AVDoc")
AcroExchAVDoc.Open ArchPDF, ""
Set AcroExchPDDoc = AcroExchAVDoc.GetPDDoc
NumPag = AcroExchPDDoc.GetNumPages
Call AcroExchAVDoc.PrintPages(0, NumPag, 1, True, True)
Call AcroExchAVDoc.PrintPagesSilent(0, NumPag, 1, True, True)
‘ AcroExchApp.Show ‘Esto lo puse como comentario pues no quiero que se vea el PDF
AcroExchApp.Exit
AcroExchAVDoc.Close (True)
AcroExchPDDoc.Close
End Sub
El inconveniente de esta alternativa es que al ejecutar la línea que contiene PrintPages o PrintPagesSilent nada pasa, solo se ejecuta pero nada imprime, no manda error alguno.
Agradezco de antemano su atención, y le envió saludos cordiales
Alfonso
Valora esta pregunta


0