Page 1 of 2

Imprimir texto enriquecido variable

PostPosted: Mon Nov 13, 2017 9:41 pm
by TOTOVIOTTI
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!!!

Re: Imprimir texto enriquecido variable

PostPosted: Mon Nov 13, 2017 11:31 pm
by cmsoft
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: Select all  Expand view


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()
 

Re: Imprimir texto enriquecido variable

PostPosted: Tue Nov 14, 2017 11:15 am
by TOTOVIOTTI
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

Re: Imprimir texto enriquecido variable

PostPosted: Tue Nov 14, 2017 11:38 am
by cmsoft
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: Select all  Expand view

*************************************************
** 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

Re: Imprimir texto enriquecido variable

PostPosted: Tue Nov 14, 2017 7:06 pm
by TOTOVIOTTI
Hola!
Siii, creo que me sirve.. solo que no sé que envías en "Merge(oRs,cDocu)", que seria
el "oRs"?

Muchas gracias!
Roberto

Re: Imprimir texto enriquecido variable

PostPosted: Tue Nov 14, 2017 10:48 pm
by cmsoft
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.

Re: Imprimir texto enriquecido variable

PostPosted: Wed Nov 15, 2017 12:14 pm
by TOTOVIOTTI
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

Re: Imprimir texto enriquecido variable

PostPosted: Wed Nov 15, 2017 7:35 pm
by cmsoft
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: Select all  Expand view
*************************************************
** 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

Re: Imprimir texto enriquecido variable

PostPosted: Thu Nov 16, 2017 11:59 am
by TOTOVIOTTI
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

Re: Imprimir texto enriquecido variable

PostPosted: Thu Nov 16, 2017 1:04 pm
by acuellar
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: Select all  Expand view

 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

Re: Imprimir texto enriquecido variable

PostPosted: Thu Nov 16, 2017 1:52 pm
by TOTOVIOTTI
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

Re: Imprimir texto enriquecido variable

PostPosted: Thu Nov 16, 2017 2:11 pm
by acuellar
Es exactamente lo que necesitas.

Solo debes guardar el documento con el nombre del alumno.

Re: Imprimir texto enriquecido variable

PostPosted: Thu Nov 16, 2017 2:24 pm
by TOTOVIOTTI
Adhemar,
necesito un único documento con TODOS los alumnos. Quizá no me expresé correctamente.
Gracias!
Roberto

Re: Imprimir texto enriquecido variable

PostPosted: Thu Nov 16, 2017 2:50 pm
by joseluisysturiz
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...

Re: Imprimir texto enriquecido variable

PostPosted: Thu Nov 16, 2017 6:57 pm
by TOTOVIOTTI
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...