Page 1 of 1
Unir archivos PDF
Posted: Thu Jul 25, 2019 7:34 pm
by mariordz
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"
Code: Select all | Expand
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
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 2:39 am
by Enrrique Vertiz
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
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 4:49 pm
by mariordz
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:
Code: Select all | Expand
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?
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 6:19 pm
by mariordz
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
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?
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 7:03 pm
by karinha
Mira si ayuda,
Code: Select all | Expand
#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
Re: Unir archivos PDF
Posted: Fri Jul 26, 2019 7:41 pm
by cnavarro
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
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'
Re: Unir archivos PDF (RESUELTO)
Posted: Fri Jul 26, 2019 10:00 pm
by mariordz
El código quedó así:
Code: Select all | Expand
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.
Re: Unir archivos PDF
Posted: Sat Jul 27, 2019 12:55 am
by jnavas
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.
Re: Unir archivos PDF
Posted: Mon Jul 29, 2019 2:23 pm
by mariordz
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)
Code: Select all | Expand
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: Select all | Expand
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.