Recent

Author Topic: [Resuelto] Márgenes en componente TRichmemo  (Read 6203 times)

rretamar

  • New Member
  • *
  • Posts: 39
[Resuelto] Márgenes en componente TRichmemo
« on: October 05, 2023, 07:05:53 pm »
Hola colegas usuarios de Lazarus.

Tengo la siguiente cuestión con el componente TRichmemo: cuando quiero guardar el contenido a un archivo .rtf el documento tiene un margen alrededor de 1 pulgada, que es demasiado, pero no encuentro la manera dentro del componente de configurar los márgenes. Se que el formato lo admite, porque si abro ese documento o creo uno nuevo con el todopoderoso LibreOffice, puedo configurar los márgenes (inferior, superior, derecho, izquierdo) sin problemas.

Si no puedo resolverlo con alguna propiedad, la única opción que me quedaría es insertar dentro del documento los tags de rtf con los valores de los márgenes antes de guardar a un archivo.

Saludos.
« Last Edit: October 06, 2023, 04:17:19 pm by rretamar »

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2770
    • havefunsoft.com
Re: Márgenes en componente TRichmemo
« Reply #1 on: October 06, 2023, 04:05:04 am »
Si no puedo resolverlo con alguna propiedad, la única opción que me quedaría es insertar dentro del documento los tags de rtf con los valores de los márgenes antes de guardar a un archivo.
RichMemo no ofrece muchas posibilidades para formatear el texto para el diseño en papel.
Entonces usted tiene que insertar los tags.

Tal vez quiere a probar https://wiki.freepascal.org/KControls (KMemo) tambien.
« Last Edit: October 06, 2023, 04:06:45 am by skalogryz »

rretamar

  • New Member
  • *
  • Posts: 39
Re: Márgenes en componente TRichmemo
« Reply #2 on: October 06, 2023, 04:16:56 pm »
Gracias por la respuesta. Estuve revisando el componente TKmemo pero a la hora de mostrar los RTF (que tienen cierta complejidad en el contenido, no son sólo texto) tengo ciertos elementos que no se ven correctamente y en el Richmemo sí. Al final lo solucioné agregando las marcas con los valores de los márgenes dentro del contenido del rtf ants de guardar el documento, y funcionó perfecto, por ejemplo un valor de 300 "twips" para los 4 márgenes lo hago insertando estas marcas:

\margl300\margr300\margt300\margb300

Me ayudó mucho el libro online "The RTF Cookbook":

https://metacpan.org/dist/RTF-Writer/view/lib/RTF/Cookbook.pod#Document_Formatting

Ya voy a armar un post explicando cómo convertir ese RTF em PDF usando LibreOffice desde la línea de comandos.

Saludos y gracias.
« Last Edit: October 06, 2023, 05:04:56 pm by rretamar »

paweld

  • Hero Member
  • *****
  • Posts: 1028
Re: [Resuelto] Márgenes en componente TRichmemo
« Reply #3 on: October 06, 2023, 04:43:28 pm »
Una vez que necesité convertir a PDF, lo resolví de la siguiente manera:
Code: Pascal  [Select][+][-]
  1. uses
  2.   Process, LCLIntf;
  3.  
  4. procedure TForm1.Button1Click(Sender: TObject);
  5. var
  6.   pkon: TProcess;
  7.   lopath: String;
  8. begin
  9.   if not OpenDialog1.Execute then
  10.     exit;
  11.   lopath := 'C:\Program Files\LibreOffice\program\soffice.exe';
  12.   if not FileExists(lopath) then
  13.   begin
  14.     ShowMessage('Enter the path to LibreOffice executable (soffice.exe)');
  15.     exit;
  16.   end;
  17.   if (LowerCase(ExtractFileExt(Opendialog1.FileName)) <> '.rtf') and (LowerCase(ExtractFileExt(Opendialog1.FileName)) <> '.doc') and
  18.     (LowerCase(ExtractFileExt(Opendialog1.FileName)) <> '.odt') then
  19.   begin
  20.     ShowMessage('Select correct file type');
  21.     exit;
  22.   end;
  23.   if FileExists(ChangeFileExt(Opendialog1.FileName, '.pdf')) then
  24.   begin
  25.     ShowMessage('PDF file with that name already exists!');
  26.     exit;
  27.   end;
  28.   pkon := TProcess.Create(nil);
  29.   pkon.Options := pkon.Options + [poWaitOnExit];
  30.   pkon.Executable := lopath;                     //path to LO
  31.   pkon.Parameters.Add('--convert-to');
  32.   pkon.Parameters.Add('pdf');
  33.   pkon.Parameters.Add('--outdir');
  34.   pkon.Parameters.Add(ExcludeTrailingPathDelimiter(ExtractFilePath(OpenDialog1.FileName)));   //path to save pdf
  35.   pkon.Parameters.Add(Opendialog1.FileName);
  36.   pkon.Execute;
  37.   pkon.Free;
  38.   if FileExists(ChangeFileExt(Opendialog1.FileName, '.pdf')) then
  39.     OpenDocument(ChangeFileExt(Opendialog1.FileName, '.pdf'))
  40.   else
  41.     ShowMessage('Failed to convert file');
  42. end;  
  43.  
Best regards / Pozdrawiam
paweld

rretamar

  • New Member
  • *
  • Posts: 39
Re: [Resuelto] Márgenes en componente TRichmemo
« Reply #4 on: October 06, 2023, 07:05:46 pm »
Gracias colega, mi código es muy similar, "sucio y desprolijo"  :)

Function Rtf_a_PDF( Origen: String): String;
Var
  Ejecutable_LibreOffice, Archivo_PDF: String;
  Proceso: TProcess;
Begin
  // "C:\Program Files\LibreOffice\program\soffice.exe" --headless --invisible --norestore --convert-to pdf c:\estudios\informe.rtf
  Result := '';
  If Not fileExists( Origen ) Then Exit;
  //
  Ejecutable_LibreOffice := 'C:\Program Files\LibreOffice\program\soffice.exe';
  //
  If Not FileExists( Ejecutable_LibreOffice, False) Then Exit;
  //
  Archivo_PDF := ExtractFilePath( ParamStr(0)) + ChangeFileExt( ExtractFileName( Origen),'.pdf');
  //
  If FileExists( Archivo_PDF ) Then                // Eliminar PDF temporal
    If Not DeleteFile( Archivo_PDF ) Then
      Begin
        MessageDlg('No se pudo eliminar el archivo PDF antes de crearlo:' + Archivo_PDF, mtError, [mbOK, mbCancel], 0);
        Exit;
      end;
  //
  Screen.Cursor := crHourGlass;
  //
  Proceso := TProcess.Create(nil);
  Proceso.CommandLine := Ejecutable_LibreOffice + ' --headless --invisible --norestore --convert-to pdf ' + Origen;
  Proceso.Options := Proceso.Options + [poWaitOnExit];;
  Proceso.Execute;
  Proceso.Free;
  //
  Screen.Cursor := CrDefault;
  //
  If FileExists( Archivo_PDF ) Then result := Archivo_PDF;
end;

Saludos !

 

TinyPortal © 2005-2018