Forum > Spanish

[Resuelto] Márgenes en componente TRichmemo

(1/1)

rretamar:
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.

skalogryz:

--- Quote from: rretamar on October 05, 2023, 07:05:53 pm ---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.

--- End quote ---
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.

rretamar:
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.

paweld:
Una vez que necesité convertir a PDF, lo resolví de la siguiente manera:
--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---uses  Process, LCLIntf; procedure TForm1.Button1Click(Sender: TObject);var  pkon: TProcess;  lopath: String;begin  if not OpenDialog1.Execute then    exit;  lopath := 'C:\Program Files\LibreOffice\program\soffice.exe';  if not FileExists(lopath) then  begin    ShowMessage('Enter the path to LibreOffice executable (soffice.exe)');    exit;  end;  if (LowerCase(ExtractFileExt(Opendialog1.FileName)) <> '.rtf') and (LowerCase(ExtractFileExt(Opendialog1.FileName)) <> '.doc') and    (LowerCase(ExtractFileExt(Opendialog1.FileName)) <> '.odt') then  begin    ShowMessage('Select correct file type');    exit;  end;  if FileExists(ChangeFileExt(Opendialog1.FileName, '.pdf')) then  begin    ShowMessage('PDF file with that name already exists!');    exit;  end;  pkon := TProcess.Create(nil);  pkon.Options := pkon.Options + [poWaitOnExit];  pkon.Executable := lopath;                     //path to LO  pkon.Parameters.Add('--convert-to');  pkon.Parameters.Add('pdf');  pkon.Parameters.Add('--outdir');  pkon.Parameters.Add(ExcludeTrailingPathDelimiter(ExtractFilePath(OpenDialog1.FileName)));   //path to save pdf  pkon.Parameters.Add(Opendialog1.FileName);  pkon.Execute;  pkon.Free;  if FileExists(ChangeFileExt(Opendialog1.FileName, '.pdf')) then    OpenDocument(ChangeFileExt(Opendialog1.FileName, '.pdf'))  else    ShowMessage('Failed to convert file');end;   

rretamar:
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 !

Navigation

[0] Message Index

Go to full version