Visual Basic - Impresion de PDF's desde VB6

Life is soft - evento anual de software empresarial
   
Vista:

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

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Impresion de PDF's desde VB6

Publicado por Paolo Santos (74 intervenciones) el 30/01/2012 18:24:36
ummmm, cuando instalas el creador de pdf de acrobat o incluso de terceros, por ejemplo cutepdf, el instala una impresora que es la que convierte a pdf cualquier documento, pues bien no has intentado mandar a imprimir lo que necesitas seleccionando en tiempo de diseño la impresora que convierte a pdf, como si fueras a imprimir a una impresora normal, la ventaja es que hasta lo puedes direccionar a donde quieres guardar el archivo, es mas puedes programarlo para que pregunte donde lo quiere el usuario, si asi es el requerimiento, sin programar nada, yo tengo algunas aplicaciones asi y eso es lo que hago y no me quiebro la cabeza..

espero esta solucion te sirva de algo..

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Impresion de PDF's desde VB6

Publicado por Omar (1 intervención) el 17/10/2014 16:57:11
Hola Paolo, yo utilizo el pdfCreator en vb6 teniendo la referencia marcada como "pdfCreator.exe". Pero mi problema es que me da un error porque en algunos equipos el pdfCreator se instala en ArchivosDePrograma y en otros en ProgramFile, depende del windows de la pc.
Hay alguna forma de utilizarlo sin tener que referenciarlo? o de detectar donde esta el pdfCreator.exe?
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Impresion de PDF's desde VB6

Publicado por Christian (666 intervenciones) el 30/01/2012 18:36:48
Alternativa 5:

Lo programe yo y anda.

1. Tener disponible office 2007 (no lo probe con otra version)
2. Bajar el plugin desde la pagina de Microsoft
http://www.microsoft.com/download/en/details.aspx?id=9943
3. Agregar la referencia desde Visual Basic - Microsoft Word 12.0 Object Library.
4. Copiar el siguiente codigo

Private Sub cmdImpAcrobat_Click()

Dim oWord As New Word.Application
Dim oDoc As Word.Document
Dim oSelection As Word.Selection

Set oDoc = oWord.Documents.Add()
Set oSelection = oWord.Selection

oSelection.TypeText "Hola Mundo"


oDoc.ExportAsFixedFormat OutputFileName:= _
"C:\Hola Mundo.pdf", ExportFormat:= _
wdExportFormatPDF, OpenAfterExport:=True, OptimizeFor:= _
wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False

oDoc.SaveAs "c:\word.tmp"
oWord.Quit
Set oWord = Nothing
Kill "c:\word.tmp"

End Sub

Lo bueno que puedes crear cualquier tipo de documento (con tablas, graficos, etc) que todo lo va a guardar en pdf.

Probado !!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Impresion de PDF's desde VB6

Publicado por Miguel Garcia (1 intervención) el 23/02/2012 21:53:54
Hola Alfonso
No te puedo ayudar ya que me encuentro en la misma guerra, he seguido pasos semejantes y el problema varia; en una maquina me abre tantos acrobat como mensaje, pero no imprime; me da error, en cambio en otra maquina, imprime. No he podido establecer causa efecto, pero creo que es la version del Acrobat...
Si encuentras una solucion, te agradeceria que la pasaras, me queda por probar el intentar esperar a que acabe la impresion de uno, y forzar el cierre de acrobat....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Impresion de PDF

Publicado por gilberto (1 intervención) el 31/01/2013 20:33:49
en la linea de comandos despues del .exe ponte /p /h

ejemplo

"RutaDelAcrobat" /p /h "RutadelArchivo"

te imprimira todo sin abrir pdfs
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jsmosar

Impresion de PDF

Publicado por jsmosar (1 intervención) el 20/05/2014 23:31:37
"RutaDelAcrobat" /p /h "RutadelArchivo" ME funciona excelente, pero como hago para imprimir dos copias de cada hoja?

De antemano mil gracias, saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Impresion de PDF

Publicado por ricardo (1 intervención) el 12/06/2014 19:23:50
Hola en que versión de Acrobat ¿?. Siempre me deja una acrobat abierto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Impresion de PDF

Publicado por Den OP (1 intervención) el 20/09/2014 08:43:40
Muchas gracias por el aporte de Word.Application.
Con esto pude exportar un grid a PDF sin ninguna librería externa desde Visual Basic 6. El usuario siempre verá un reporte en pdf sin llamar pdfcreator o impresora pdf.

les adjunto el código implementando un flexgrid, tambien por la cantidad de columnas se pone la impresion en horizontal.

esto lo pueden agregar a un Command de VB6

'Variable de tipo Aplicación de Word
Dim o_Word As New Word.Application
'Variable de tipo documento de Word
Dim Documento As Word.Document
' variable para hacer referencia al párrafo
Dim oSelection As Word.Selection
Dim Parrafo As Table
'F es para recorrer la Fila y C para la Columna

Dim F, C As Double
'Nuevo instancia del objeto
' Set o_Word = New Word.Application
'Agrega un Nuevo documento de word
Set Documento = o_Word.Documents.Add()
Set oSelection = o_Word.Selection


'Creamos una tabla dentro del nuevo documento
Set Parrafo = Documento.Tables.Add(Documento.Range(0, 0), _
grid.Rows, grid.Cols)

Documento.PageSetup.Orientation = wdOrientLandscape

'Recorremos el Flexgrid para agregar las columnas y filas a nuestra tabla
For C = 0 To grid.Cols - 1
'Agregar columnas
Parrafo.Cell(0, C + 1).Range.Text = grid.TextMatrix(0, C)
'Agregar filas
For F = 0 To grid.Rows - 1
Parrafo.Cell(F + 1, C + 1).Range.Text = grid.TextMatrix(F, C)
Next F
Next C
Parrafo.Columns.Item(1).Width = o_Word.InchesToPoints(2)
Parrafo.Columns.Item(3).Width = o_Word.InchesToPoints(1.2)
Parrafo.al
'Hacemos visible el word
o_Word.Visible = True


'Documento.PrintPreview

Documento.ExportAsFixedFormat OutputFileName:= _
"C:\Hola Mundo.pdf", ExportFormat:= _
wdExportFormatPDF, OpenAfterExport:=True, OptimizeFor:= _
wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False

Documento.SaveAs "c:\word.tmp"
o_Word.Quit
Set o_Word = Nothing
Kill "c:\word.tmp"



'Eliminamos los objetos
Set o_Word = Nothing
Set Documento = Nothing
Set Parrafo = Nothing

ps.ReSetOrientation
Exit Sub

'error
ErrSub:

MsgBox Err.Description

On Error Resume Next

Set o_Word = Nothing
Set Documento = Nothing
Set Parrafo = Nothing
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar