PDA

Ver la Versión Completa : Tip: Convertir .doc o .rtf a pdf GRATIS


rretamar
05-10-2023, 21:55:34
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.


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/en-US/text/shared/guide/pdf_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
^\||/^\||/^\||/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.