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
sin imagen de perfil
Val: 4
Ha aumentado su posición en 25 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Impresion de PDF's desde VB6

Publicado por Paolo Santos (76 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
sin imagen de perfil
Val: 119
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Impresion de PDF's desde VB6

Publicado por Christian (713 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

Impresion de PDF

Publicado por Claudio (33 intervenciones) el 12/04/2022 16:42:51
Hola buen dia , me pidieron modificar un programa viejo en VB6 , me hace falta exportar a PDF y estoy viendo el ejemplo con WORD pero no encuentro esta libreria http://www.microsoft.com/download/en/details.aspx?id=9943 la pagina esta caida.
Alguien la tiene ?
Desde ya muchas 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
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Impresion de PDF

Publicado por Antoni Masana (558 intervenciones) el 12/04/2022 19:43:39
Las últimas versiones de Windows incorporan una impresora virtual para generar ficheros PDF.
Si no la tienes existen programas gratuitos para instalar la impresora de ficheros PDF.
En windows 10 se llama Microsoft Print to PDF

Una vez instalada la impresora virtual en el programa debes seleccionar la impresora para dejarla com activa por defecto e imprimir normalmente.

Código para seleccionar la impresora PDF:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub ...
 
    ' </> ---&--- </>   Busca la impresora PDF
 
    PRN_Actual = Printer.DeviceName
 
    If Orpas.Out_PDF.Value Then
       PDF = False
       For Each Prt In Printers
           If InStr(Prt.DeviceName, "PDF") > 0 Then
              Set Printer = Prt
              PDF = True
           End If
       Next
 
       If Not PDF Then
           Opc = MsgBox("No se localiza ninguna Impresora para crear PDF." & _
                        vbCrLf & _
                        vbCrLf & _
                        "Desea realizar la impresión en PAPEL.", _
                        vbCritical + vbYesNo + vbDefaultButton2, _
                          "Listado de ORPAS en PDF")

Una vez finalizada la impresión restauras la impresora activa por defecto.

1
2
3
4
5
6
7
'   ' </> ---&--- </>   Activa la impresora predeterminada
 
    For Each Prt In Printers
        If Prt.DeviceName = PRN_Actual Then
           Set Printer = Prt
        End If
    Next

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 Claudio (33 intervenciones) el 13/04/2022 16:03:30
Muchas gracias por la respuesta Antoni, sabes de alguna forma de que sea desatendido ? osea .... que desde vb6 le pase nombre de archivo y carpeta y que no me lo pregunte ?
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
sin imagen de perfil
Val: 145
Ha aumentado 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Impresion de PDF

Publicado por Sah1d Ra (191 intervenciones) el 13/04/2022 17:57:12
HOla, que tal si lo intentas de la siguiente manera con el SheII

1
"C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe" /p /h "%1"

la ruta del ad0be puede variar, checalo y me dices como te va.

saludos y felices líneas de programa10n.
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 Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Impresion de PDF

Publicado por Antoni Masana (558 intervenciones) el 13/04/2022 18:09:33
Cuando empecé a crear los listados en PDF tenia Windows XP y no tenía implícita la opción de crear PDF.
En ese momento utilice el BullZip, te hablo de hace 12 años y no recuerdo como se hacía para poner el nombre del fichero.
Seguro que se puede pero no puedo investigarlo por que ya no tengo Visual Basic.

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 Claudio (33 intervenciones) el 14/04/2022 15:09:09
Sah1dRa:
'Command 2 declarar esta función en declaraciones generales
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 Sub Command1_Click()
Shell "C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe"
End Sub

Private Sub Command2_Click()
Dim lValDev As Long
lValDev = ShellExecute(Me.hwnd, "Open ", "C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe", "\", "\", 1)
End Sub

Ninguna de las dos opciones me abre el acrobat , no da error tampoco, abre cualquier otra aplicacion como por ejemplo calc.exe pero el acrobat no :( , de todos modos les agradezco mucho su tiempo.
Seguire investigando !!!!
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