Unir archivos PDF

Unir archivos PDF

Postby mariordz » Thu Jul 25, 2019 7: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"

Code: Select all  Expand view
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
User avatar
mariordz
 
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México

Re: Unir archivos PDF

Postby Enrrique Vertiz » Fri Jul 26, 2019 2: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 23.04, MySQL 8.0.X, SQLLIB 1.9m, SQLRDD
Enrrique Vertiz
 
Posts: 514
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru

Re: Unir archivos PDF

Postby mariordz » Fri Jul 26, 2019 4: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:

Code: Select all  Expand view
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?
User avatar
mariordz
 
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México

Re: Unir archivos PDF

Postby mariordz » Fri Jul 26, 2019 6: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: Select all  Expand view
(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?
User avatar
mariordz
 
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México

Re: Unir archivos PDF

Postby karinha » Fri Jul 26, 2019 7:03 pm

Mira si ayuda,

Code: Select all  Expand view

#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
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Unir archivos PDF

Postby cnavarro » Fri Jul 26, 2019 7: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: Select all  Expand view
(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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Unir archivos PDF (RESUELTO)

Postby mariordz » Fri Jul 26, 2019 10:00 pm

El código quedó así:

Code: Select all  Expand view
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.
User avatar
mariordz
 
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México

Re: Unir archivos PDF

Postby jnavas » 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.
User avatar
jnavas
 
Posts: 472
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela

Re: Unir archivos PDF

Postby mariordz » Mon Jul 29, 2019 2: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)
Code: Select all  Expand view
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 view
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.
User avatar
mariordz
 
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 81 guests

cron