FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Unir archivos PDF
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Unir archivos PDF
Posted: Thu Jul 25, 2019 07:34 PM
Buenas tardes compa帽eros del foro, despues de estar investigando y a煤n no dar con la respuesta les pido su ayuda.

Estoy desarrollando un m贸dulo en mi sistema que generar谩 las cotizaciones de los equipos que vendemos en esta empresa, aparte de la hoja con los datos del cliente, el modelo del equipos y los precios que se est谩n cotizando es indispensable a帽adir algunas hojas con informaci贸n t茅cnica, especifica para cada modelo de equipo a cotizar, actualmente las personas encargadas de las cotizaciones hacen la cotizaci贸n a mano y envian al cliente 3 archivos, una propiamente la cotizaci贸n, una con los datos t茅cnicos y otro m谩s con las caracteristicas t茅cnicas del sitio de instalaci贸n.

Mi m贸dulo ya genera la primera de las 3 p谩ginas mediante el objeto "print"
cFilepdf:=cRutaa+"\temps\"+alltrim(cNocoti)+".pdf"
Print oPrn title "Cotizaci贸n de equipo" file cFilepdf
Mi duda es si es posible adjuntarle otro archivo de tipo PDF o DOC y generar un solo archivo de salida que contenga toda la informaci贸n necesaria sin tener que mandar 3 archivos independientes.

Cualquier ayuda ser谩 bien recibida.

Uso FWH 16.04 + BCC77 + Harbour
Posts: 582
Joined: Fri Oct 07, 2005 02:17 PM
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 02:39 AM

Saludos Mario

Yo uso PDFTK , es un EXE con un DLL externo, pero se invoca sin problemas desde la aplicacion y sirve para concatenar archivos, es la misma logica la que usamos, la factura del proveedor, mas la orden de compra mas la cotizacion, todo en un unico PDF

Enrrique Vertiz Pitta

Lima-Peru

xHb 1.23.1026X, Fwh 25.01, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 04:49 PM
Enrique, muchas gracias por la info, ya instal茅 el pdftk, copie el .exe y el .dll a la carpeta donde esta mi ejecutable, ahora desde mi aplicaci贸n, siguiendo los ejemplos del site de pdftk hago lo siguiente:
cFilepdf:=cRutaa+"\temps\"+alltrim(cNocoti)+".pdf" 聽 聽(Defino la ruta donde gener茅 mi archivo PDF)
cFichatec:=Pathr+"\formatos\"+alltrim(cMod1)+".PDF" 聽 聽 (Defino la ruta donde esta la ficha t茅cnica)
cDirinfo=cGetdir("Selecciona el directorio para guardar la cotizaci贸n") 聽 聽 聽 (Le pido al usuario me indique el directorio donde desea gaurdar su PDF final)
if !empty(cDirinfo)
聽 聽cFiledest:=cDirinfo+"\Cotizacion equipo "+alltrim(cNocoti)+".pdf"
聽 聽waitrun("pdftk &cFilepdf &cFichatec cat output &cFiledest") //Invoco al pdftk y le paso las variables con macrosustituci贸n
聽 聽ShellExecute( ,"open", cFiledest,,,3 )
endif
Sin embargo aparece una ventana de DOS y muy r谩pidamente desaparece y no me genera el archivo de salida. 驴Que estoy haciendo mal?

Tienes un ejemplo de como lo manejas?
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 06:19 PM
Bueno, en caso de que a alguien m谩s le haya pasado, resulta que no me generaba el archivo de salida porque en la ruta que yo eleg铆 hab铆a espacios
Code (fw): Select all Collapse
(C:\users\juan perez\desktop\cotizacio 1234abcd.pdf)


Solo quite los espacios y ya me gener贸 el archivo de salida completo, si el usuario elije una carpeta destino que contenga espacios, como debo indicarle al pdftk? Alguna idea?
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 07:03 PM
Mira si ayuda,
#include "FiveWin.ch"

FUNCTION Main()

聽 聽LOCAL cRuta, cPDFFile

聽 聽cPDFFile := "PROP15.PDF"

聽 聽cRuta := cShortName( "C:\USUARIO\juan perez\ARCHIVOS\"+cPDFFile )

聽 聽? cRuta

RETURN NIL

/*
聽*聽 SPN.PRG
聽*
聽*聽 cShortName() - FilePath Long to Short (GetShortPathNameA())
聽*
聽*聽 Soporte a Funciones del Api de Windows
聽*
聽*聽 Andrade A. Daniel - 2002
聽*聽 Rosario, Argentina
聽*
聽*聽 Libre Distribuci贸n
聽*/

/*
聽*聽 cShortName()
聽*/

FUNCTION cShortName( cLong )



聽 聽 Local 聽 cShort 聽:= Space(164) + Chr(0)
聽 聽 Local 聽 nBuffer := 164
聽 聽 Local 聽 nLen

聽 聽 nLen 聽 聽:= GetSPName( cLong, @cShort, nBuffer )

聽 聽 cShort 聽:= Left( cShort, nLen )

RETURN( cShort )

// Windows Api
DLL32 STATIC FUNCTION GetSPName( lpszLongPath AS STRING, lpszShortPath AS STRING, lBuffer AS LONG ) ;
聽 聽 聽 AS LONG PASCAL FROM "GetShortPathNameA" LIB "kernel32"
Salu2
Jo茫o Santos - S茫o Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 07:41 PM
mariordz wrote:Bueno, en caso de que a alguien m谩s le haya pasado, resulta que no me generaba el archivo de salida porque en la ruta que yo eleg铆 hab铆a espacios
Code (fw): Select all Collapse
(C:\users\juan perez\desktop\cotizacio 1234abcd.pdf)


Solo quite los espacios y ya me gener贸 el archivo de salida completo, si el usuario elije una carpeta destino que contenga espacios, como debo indicarle al pdftk? Alguna idea?


Puedes probar poni茅ndolo entre comillas


'C:\users\juan perez\desktop\cotizacio 1234abcd.pdf'
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo

El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Unir archivos PDF (RESUELTO)
Posted: Fri Jul 26, 2019 10:00 PM
El c贸digo qued贸 as铆:
if !empty(cDirinfo)
聽 聽cFiledest0:=cDirinfo+"\"+alltrim(cNocoti)+".pdf"
聽 聽cFiledest:='"&cFiledest0"'
聽 聽waitrun("pdftk &cFilepdf &cFichatec cat output &cFiledest")
聽 聽ShellExecute( ,"open", cFiledest,,,3 )
聽 聽delete file &cFilepdf
endif
Y ya genera mi PDF sin problemas.

Gracias a todos por sus valiosos aportes.
Posts: 492
Joined: Wed Nov 16, 2005 12:03 PM
Re: Unir archivos PDF
Posted: Sat Jul 27, 2019 12:55 AM

Saludos,
Excelente, mi duda, envias correos desde tu aplicaci贸n o un binario externo, desde hace a帽os utilizo blat.exe, desde hace un par de a帽os no envia ningun tipo de correo.

Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Unir archivos PDF
Posted: Mon Jul 29, 2019 02:23 PM
Yo lo hago as铆:

genero un array con las direcciones a donde lo deseo mandar (si las separo por coma no me funciona, tengo que mandar a cada direcci贸n de forma idependiente)
aCorreoa:={"correo1@dominio.com.mx","correo2@dominio.com.mx","correo3@dominio.com.mx"}
聽 聽 for uncorr:=1 to len(aCorreoa)
聽 聽 聽 聽 cCorreoa:=aCorreoa[uncorr] 聽//uno para cada elemento del array aCorreoa
聽 聽 聽 聽 cCorreo:=firmail 聽//El nombre de la persona que lo esta enviando, este lo obtengo de la tabla de empleados
聽 聽 聽 聽 cText:=cBod //El cuepo del mensaje
聽 聽 聽 聽 cDesti:=cCorreoa //El correo destino
聽 聽 聽 聽 cSubj:=cSubj 聽//El titulo del correo
聽 聽 聽 聽 cRemite:=cCorreo //El nombre del remitente
聽 聽 聽 聽 aAttach :={} //Si quieres enmviar archivos adjuntos en este array deberas agregarlos, incluida su ruta completa
聽 聽 聽 聽 cLeymen:="El correo fue enviado exitosamente a "+alltrim(aCorreoa[uncorr])+" 聽"+alltrim(str(uncorr))+" de "+alltrim(str(len(aCorreoa))) 聽//Si quieres puedes poner esta leyenda que te indica que el correo fue enviado
聽 聽 聽 聽 envia_email(cSubj,cDesti,cText,cRemite,cLeymen,aAttach) //Invocas a la funci贸n "envia-email
聽 聽next
Code (fw): Select all Collapse
Function envia_email()
聽 聽Local oEmailCfg,oEmailMsg
聽 聽 TRY
聽 聽 聽 聽oEmailCfg := CREATEOBJECT( "CDO.Configuration" )
聽 聽 聽 WITH OBJECT 聽oEmailCfg:Fields
聽 聽 聽 聽 聽:Item( "http://schemas.microsoft.com/cdo/configuration/smtpserver" ):Value := 聽 "nombre_servidor_correo_SMTP.com.mx"
聽 聽 聽 聽 聽:Item( "http://schemas.microsoft.com/cdo/configuration/smtpserverport" ):Value := 聽26 //Puerto de salida
聽 聽 聽 聽 聽:Item( "http://schemas.microsoft.com/cdo/configuration/sendusing" ):Value := 2 聽 // Remote SMTP = 2, local = 1
聽 聽 聽 聽 聽:Item( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ):Value := 聽 .T.
聽 聽 聽 聽 聽:Item( "http://schemas.microsoft.com/cdo/configuration/smtpusessl" ):Value := 聽.F.
聽 聽 聽 聽 聽:Item( "http://schemas.microsoft.com/cdo/configuration/sendusername" ):Value := 聽"cuentaenviadora@dominio.com.mx"
聽 聽 聽 聽 聽:Item( "http://schemas.microsoft.com/cdo/configuration/sendpassword" ):Value := 聽"passwordcuenta"
聽 聽 聽 聽 聽:Item( "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout"):Value := 30
聽 聽 聽 聽 聽:Update()
聽 聽 聽 END WITH
聽 聽 CATCH oError
聽 聽 聽 MsgInfo( "Could not create message configuration" + ";" 聽+ ;
聽 聽 聽 聽 聽 聽 聽"Error: " + TRANSFORM(oError:GenCode, NIL) + ";" + ;
聽 聽 聽 聽 聽 聽 聽"SubC: " + TRANSFORM(oError:SubCode, NIL) + ";" + ;
聽 聽 聽 聽 聽 聽 聽"OSCode: " + TRANSFORM(oError:OsCode, NIL) + ";" + ;
聽 聽 聽 聽 聽 聽 聽"SubSystem: " + TRANSFORM(oError:SubSystem, NIL) + ";" + ;
聽 聽 聽 聽 聽 聽 聽"Message: " + oError:Description )
聽 聽 聽 聽Return .F.
聽 聽 END
聽 聽 oError:=NIL


聽 聽 TRY
聽 聽 聽oEmailMsg := CREATEOBJECT ( "CDO.Message" )
聽 聽 聽WITH OBJECT oEmailMsg
聽 聽 聽 聽 :Configuration = 聽oEmailCfg
聽 聽 聽 聽 :From = chr(34)+cRemite // This will be displayed in the From (The email id does not appear)
聽 聽 聽 聽 :To = cDesti 聽 聽// <----- 聽 Place the TO email address
聽 聽 聽 聽 :Subject = 聽cSubj
聽 聽 聽 聽 :ReplyTo = 聽""
聽 聽 聽 聽 :Sender = 聽cRemite 聽// Read Receipt message is send to this
聽 聽 聽 聽 :Organization = 聽"Empresa en M茅xico, S.A. de C.V." 聽 聽// "My Company Name"
聽 聽 聽 聽 :HTMLBody = 聽cText
聽 聽 聽 聽 if len(aAttach)>0
聽 聽 聽 聽 聽 聽 聽 聽 for nEle:=1 to len(aAttach)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 :AddAttachment(alltrim(aAttach[nEle]))
聽 聽 聽聽 聽聽 聽 聽 聽 next
聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 :Send()
聽 聽 聽END WITH
聽 聽 聽SysRefresh()
聽 聽 CATCH oError
聽 聽 聽 聽
聽 聽 聽 聽MsgInfo( "Could not send message" + ";" 聽+ CRLF+ ;
聽 聽 聽 聽 聽"Error: " + TRANSFORM(oError:GenCode, NIL) + ";" + CRLF+;
聽 聽 聽 聽 聽"SubC: " + TRANSFORM(oError:SubCode, NIL) + ";" + CRLF+ ;
聽 聽 聽 聽 聽"OSCode: " + TRANSFORM(oError:OsCode, NIL) + ";" + CRLF +;
聽 聽 聽 聽 聽"SubSystem: " + TRANSFORM(oError:SubSystem, NIL) + ";" +CRLF+ ;
聽 聽 聽 聽 聽"Message: " + oError:Description )
聽 聽 聽 聽Return .F.
聽 聽
聽 聽 END
聽 聽 MsgInfo(cLeymen)
Return
Repito, uso FWH 16.04, BCC77 y Harbour

Ojala a alguien le sea 煤til.

Continue the discussion