Unir archivos PDF

Post Reply
User avatar
mariordz
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México

Unir archivos PDF

Post 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
Enrrique Vertiz
Posts: 552
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru
Been thanked: 3 times
Contact:

Re: Unir archivos PDF

Post 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
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23.1026X, Fwh 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
User avatar
mariordz
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México

Re: Unir archivos PDF

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

Re: Unir archivos PDF

Post 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

Code: Select all | Expand

(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
karinha
Posts: 7940
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Been thanked: 3 times
Contact:

Re: Unir archivos PDF

Post 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
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
cnavarro
Posts: 6557
Joined: Wed Feb 15, 2012 8:25 pm
Location: España
Been thanked: 3 times

Re: Unir archivos PDF

Post 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

Code: Select all | Expand

(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
mariordz
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México

Re: Unir archivos PDF (RESUELTO)

Post 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.
User avatar
jnavas
Posts: 482
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Been thanked: 2 times
Contact:

Re: Unir archivos PDF

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

Re: Unir archivos PDF

Post 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.
Post Reply