Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Tip: Convertir .doc o .rtf a pdf GRATIS (https://www.clubdelphi.com/foros/showthread.php?t=96427)

rretamar 05-10-2023 21:55:34

Tip: Convertir .doc o .rtf a pdf GRATIS
 
Hola gente.
Hace un tiempo tuve la necesidad de convertir un archivo RTF a PDF....¿ sabían que se puede hacer muy fácilmente desde nuestra aplicación usando el todopoderoso LibreOffice, que se puede controlar desde línea de comandos ? La conversión es muy rápida e incluso a través de distintos parámetros podemos ajustar el nivel de compresión, agregarle una firma digital basada en certificado y mucho más. Y también sirve para otros formatos, como .doc de MS Word.

Este es el código "sucio y desprolijo" que usé en Lazarus.

En la prueba le especifico el trayecto del ejecutable en un campo TEdit con la cadena 'C:\Program Files\LibreOffice\program\soffice.exe' aunque puede ser mejorado con una función que lo detecte automáticamente, a través de la lectura de una entrada del registro. :D

La función devuelve el trayecto+nombre del archivo PDF generado, si no se pudo generar devuelve un valor nulo. Por seguridad si existiera un archivo pdf con el mismo nombre este se elimina antes de ser creado.

Código Delphi [-]
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 := Form1.Edit1.Text;
  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;

El código funciona, aunque sí, es muy mejorable. Lo bueno es que sólo necesitamos tener LibreOFfice instalado y nada más. Aquí hay más parámetros de línea de comandos para personalizar más aún la conversión:

https://help.libreoffice.org/latest/...df_params.html

Saludos !

ElKurgan 06-10-2023 06:45:42

Interesante. Gracias por compartir la solución

Saludos

Casimiro Notevi 06-10-2023 10:39:17

^\||/^\||/^\||/Puedes ponerlo en el foro de Trucos.
Gracias por compartirlo.

rretamar 06-10-2023 17:07:48

Cita:

Empezado por Casimiro Notevi (Mensaje 552849)
^\||/^\||/^\||/Puedes ponerlo en el foro de Trucos.
Gracias por compartirlo.

Así lo haré, gracias.

rretamar 06-10-2023 17:15:04

Casimiro, creo que cometí un error, copié y pegué el codigo fuente pero se copió sin los saltos de línea, y no puedo editar el post de la parte de trucos para corregirlo.


La franja horaria es GMT +2. Ahora son las 01:28:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi