FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Imprimir texto enriquecido variable
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM

Imprimir texto enriquecido variable

Posted: Mon Nov 13, 2017 09:41 PM

Hola Amigos!
Estoy necesitando imprimir con TPrinter, un texto variable, que pueda contener palabras
remarcadas en negritas o con diferentes tamaños de fonts, o itálica o subrayado.
Es posible realizarlo?
O bien, que alternativa debería utilizar....

Muchas gracias!!!

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM

Re: Imprimir texto enriquecido variable

Posted: Mon Nov 13, 2017 11:31 PM
Con Tprinter puedes hacerlo, pero tenes que poner cada linea que tenga un font distinto en un Say distinto, indicando en cada caso que font quieres utilizar.
Tambien puedes usar la clase RichEdi5 que tiene esas funcionalidades.
Con Tprinter
Code (fw): Select all Collapse
PRINT oRep NAME "Formu" PREVIEW MODAL
      *oRep:SetLandscape()
      nRow = oRep:nVertRes() / 160
      nCol = oRep:nHorzRes() / 70
      DEFINE FONT oFont1 NAME "COURIER NEW" SIZE -nRow*0.85,nCol*1.5
      DEFINE FONT oFont2 NAME "COURIER NEW" SIZE -nRow*1.00,nCol*2.0 BOLD
      PAGE
        oRep:SayImage(0,0,"FORMU.JPG",oRep:nHorzRes(),oRep:nVertRes())
        oRep:Say(nRow*24,nCol*40,+STR(aVar[01],10),oFont1)
        oRep:Say(nRow*28,nCol*40,DTOC(aVar[2]),oFont1)
        oRep:Say(nRow*32,nCol*40,DTOC(aVar[4])+ " - " + aVar[5],oFont1)

        oRep:Say(nRow*36,nCol*40,STR(aVar[6],10,2),oFont1)
        oRep:Say(nRow*40,nCol*40,STR(aVar[7],10,2),oFont1)
        oRep:Say(nRow*44,nCol*40,STR(aVar[6]+aVar[7],10,2),oFont2)        
...        
      ENDPAGE
   ENDPRINT
oFont1:End()
oFont2:End()
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM

Re: Imprimir texto enriquecido variable

Posted: Tue Nov 14, 2017 11:15 AM

Hola!
Si si... así es como hago... pero no lo puedo justificar ni nada.. cuando son longitudes variables de textos, no queda
bien.
Alguien me puede indicar si con la clase Richedit5 puedo lograr lo que necesito?
Muchas gracias!
Roberto

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM

Re: Imprimir texto enriquecido variable

Posted: Tue Nov 14, 2017 11:38 AM
Si lo que queres es armar un texto con formato, basandote en una plantilla con formato , que dicho formato se lo puedas dar con un editor de texto tipo Word (WordPad en mi caso) y luego cambiar los datos variables en tiempo de ejecucion, lo que puedes hacer es un clasico merge.
En mi caso, le paso como parametros a mi funcion, el nombre del texto que quiero tomar como base, y una query con un solo registro que contiene los campos variables
Esta es mi funcion
Code (fw): Select all Collapse
*************************************************
** Armar documento rtf
*************************************************
PROCEDURE Merge(oRs,cDocu)
LOCAL oWord , oDoc, cText , cDoc , i
cDoc := hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf"
cText := MEMOREAD(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf")
IF !FILE(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf")
   MsgStop("El archivo base no existe"+chr(10)+cDoc,"Error")
   RETURN  
ENDIF
FOR i := 1 TO oRs:FCount()
    cText := STRTRAN(ctext,"<"+oRs:FieldName(i)+">",ALLTRIM(oRs:Fieldget(i)))
NEXT i
   memowrit( hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+" "+oRs:legajo+".rtf", cText )
   if   (oWord := WinWordObj() ) == nil
        MsgAlert( "MS Word no instalado" ,  "Alerta" )        
        else
        oDoc = oWord:Documents:Open(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+" "+oRs:legajo+".rtf") // Legajo es un campo de mi Query
        if oDoc == nil
           MsgAlert("Fallo crear documento, verifique que no este en uso" , "Alerta"  )           
         endif
   endif   
   oDoc:Application:Visible := .t.
RETURN

En el texto .rtf las variables estan encerradas entre < >, pero vos podes usar lo que quieras.
Espero te sirva
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM

Re: Imprimir texto enriquecido variable

Posted: Tue Nov 14, 2017 07:06 PM

Hola!
Siii, creo que me sirve.. solo que no sé que envías en "Merge(oRs,cDocu)", que seria
el "oRs"?

Muchas gracias!
Roberto

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM

Re: Imprimir texto enriquecido variable

Posted: Tue Nov 14, 2017 10:48 PM

oRs es una Query (porque para este caso particular uso dolphin con mysql) pero podria ser tambien un alias de una dbf, y utilizar las funciones de dbf para reemplazar los datos.

Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM

Re: Imprimir texto enriquecido variable

Posted: Wed Nov 15, 2017 12:14 PM

Excelente... me sirvió totalmente.... que pasa cuando querés hacer múltiples hojas del mismo
documento RTF?
Por ejemplo, tengo que rellenar los datos del documento (es un Certificado de Estudios) pero a la vez
de rellenarlo con los datos de un alumno, necesito hacerlo de un listado de alumnos. Se puede
generar un mismo archivo con varias hojas?

Mil gracias!
Roberto

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM

Re: Imprimir texto enriquecido variable

Posted: Wed Nov 15, 2017 07:35 PM
Si, en ese caso, la query contendrá varios registros (o la tabla dbf) y vas a tener que ir grabando y cerrando cada .rtf antes de hacer el skip para leer el próximo registro. O bien tambien puedes imprimirlo y descartarlo. Ahi van a ser documentos independientes por cada alumno.
Si queres hacer un solo documento, tenes que grabar con memowrite al final.

Seria algo asi (no lo probé)
Code (fw): Select all Collapse
*************************************************
** Armar documento rtf
*************************************************
PROCEDURE Merge(oRs,cDocu)
LOCAL oWord , oDoc, cText := "", cDoc , i
cDoc := hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf"
IF !FILE(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf")
   MsgStop("El archivo base no existe"+chr(10)+cDoc,"Error")
   RETURN  
ENDIF
DO WHILE !oRs:EOF()
    cText := cText + MEMOREAD(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf")
    FOR i := 1 TO oRs:FCount()
        cText := STRTRAN(ctext,"<"+oRs:FieldName(i)+">",ALLTRIM(oRs:Fieldget(i)))
    NEXT i
    oRs:Skip()
ENDDO
memowrit( hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+" "+oRs:legajo+".rtf", cText )
   if   (oWord := WinWordObj() ) == nil
        MsgAlert( "MS Word no instalado" ,  "Alerta" )        
        else
        oDoc = oWord:Documents:Open(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+" resultado.rtf") 
        if oDoc == nil
           MsgAlert("Fallo crear documento, verifique que no este en uso" , "Alerta"  )           
         endif
   endif   
   oDoc:Application:Visible := .t.
RETURN

Asegurate que el documento base tenga un salto de pagina al final del documento para que te lo haga en hojas separadas.
Saludos
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM

Re: Imprimir texto enriquecido variable

Posted: Thu Nov 16, 2017 11:59 AM
Gracias amigo!
Esto lo intenté... pero me graba una sola hoja.
Como sería esto: "Asegurate que el documento base tenga un salto de pagina al final del documento para que te lo haga en hojas separadas."
Sería una hoja en blanco??
Gracias!
Roberto
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM

Re: Imprimir texto enriquecido variable

Posted: Thu Nov 16, 2017 01:04 PM
TOTOVIOTTI

Lo que tiene que hacer es crear una plantilla en MS-WORD con texto enriquecido que desee, y los datos que va a cambiar los pone entre []
Ejemplo: NOMBRE: [NOM]
Lo guarda en formato RTF

Code (fw): Select all Collapse
 oWord:=TOleAuto():New( "Word.Application" )

 cTxtFile:=MemoRead("C:\SISTEMAS\PLANTILLA.RTF") 
 cTxtFile:= STRTRAN(cTxtFile, "[NOM]",AllTrim(oDBF:NOMBRE))

   memowrit("C:\SISTEMAS\CERTIFICADO.DOC", cTxtFile,.f.  )
   
    oWord:Documents:Open("C:\SISTEMAS\CERTIFICADO.DOC") 

    oWord:Visible:= .T.//;oWnd:Minimize()
    oWord:= NIL


Le pasa el control a MS-WORD
Saludos,



Adhemar C.
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM

Re: Imprimir texto enriquecido variable

Posted: Thu Nov 16, 2017 01:52 PM

Adhemar
eso está comprendido y funciona correctamente.
El tema es el siguiente: tengo un archivo maestro de UNA hoja, es un modelo de certificado para un alumno.
Y necesito replicar el archivo, tantas veces como alumnos tenga. O sea, en el nuevo archivo Word que quiero
generar, necesito que esté replicado varias veces el original con los datos de los respectivos alumnos.
Se entiende la idea?
Muchas gracias!!
Roberto

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM

Re: Imprimir texto enriquecido variable

Posted: Thu Nov 16, 2017 02:11 PM

Es exactamente lo que necesitas.

Solo debes guardar el documento con el nombre del alumno.

Saludos,



Adhemar C.
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM

Re: Imprimir texto enriquecido variable

Posted: Thu Nov 16, 2017 02:24 PM

Adhemar,
necesito un único documento con TODOS los alumnos. Quizá no me expresé correctamente.
Gracias!
Roberto

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM

Re: Imprimir texto enriquecido variable

Posted: Thu Nov 16, 2017 02:50 PM
TOTOVIOTTI wrote:Adhemar,
necesito un único documento con TODOS los alumnos. Quizá no me expresé correctamente.
Gracias!
Roberto

Saludos, si entiendo bien, lo que quieres es un libro, es decir una hoja por cada alumno en un solo archivo, para los REPLACE debes tener un archivo por cada alumno ya que la VAR a reemplazar seria la misma y lo que harias es repetir un nombre en todas las hojas, no se si entendi bien... Asi que lo correcto es guardar o crear un archivo por cada alumno, a menos que haya alguna forma de exportar o agregar los datos del archivo que usa Tword en un nuevo archivo pero sin las variables, es lo que se me ocurre, pero lo mas viable seria un archivo por alumno, saludos...
Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM

Re: Imprimir texto enriquecido variable

Posted: Thu Nov 16, 2017 06:57 PM

Si José Luis..
lo que necesitaría es como un libro, ya veré entonces como lo puedo solucionar...
Muchas gracias a todos....
Roberto

PD: Me gustaba la opción de CMSoft (perdón que no sé tu nombre), pero no se puede ir "sumando"
el archivo con el Memoread... al menos yo no pude...

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar