Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Convertir RTF (o Word) a PDF desde línea de comandos (https://www.clubdelphi.com/foros/showthread.php?t=96432)

rretamar 06-10-2023 17:13:34

Convertir RTF (o Word) a PDF desde línea de comandos
 
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 !

Casimiro Notevi 06-10-2023 18:29:33

^\||/^\||/^\||/

Neftali [Germán.Estévez] 09-10-2023 09:32:32

^\||/^\||/^\||/
Gracias por el código.


La franja horaria es GMT +2. Ahora son las 22:01:24.

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