Converter arquivos do Office em PDF com LibreOffice e Python
Uma hora ou outra um desenvolvedor vai precisar transformar algum tipo de documento, seja ele Word, Excel, CSV em PDF. Existem muitas bibliotecas e ferramentas disponíveis para executar esse tipo de ação. Em alguns tipos de documentos é necessário fazer vários malabarismos para conseguir transformá-lo em outro, por exemplo, transformar um documento X em HTML para depois fazê-lo virar um PDF.
Hoje irei abordar como utilizar a linha de comando do LibreOffice, que fornece recursos para transformar de forma fácil vários tipos de documentos para o formato PDF juntamente com o Python, mas que pode ser adaptada para a linguagem de sua preferência.
Let’s go então :D
Ferramentas e Tecnologias utilizadas:
- Kubuntu 20.04
- Python 3.8
- LibreOffice 7.3.2
Primeiramente vamos fazer o download e instalar o LibreOffice, que pode ser obtido pelo comando “apt” ou pelo site oficial libreoffice.org. Após instalar é preciso da localização do diretório até o executável “soffice”, que será chamado para fazer a conversão. O LibreOffice oferece um recurso CLI (command-line interface) que pode ser acessado pelo shell do seu S.O e executar diversas tarefas.
No meu caso o soffice ficou na pasta “/opt/libreoffice7.3/program/”, você também pode criar um link simbólico para o diretório caso deseje. No Ubuntu após instalar a aplicação também ficou disponível o comando “libreoffice”, mas aqui iremos utilizar o caminho completo.
No shell do seu S.O. você pode digitar o comando –help para mostrar os recursos que estão disponíveis na linha de comando ou pode acessar a documentação oficial.
/opt/libreoffice7.3/program/soffice --help
ou
libreoffice --help
O LibreOffice oferece vários filtros para conversão de documentos. Nós utilizaremos a forma mais simples do comando de conversão:
/opt/libreoffice7.3/program/soffice --headless --convert-to pdf --outdir /tmp arquivo.docx
ou
libreoffice --headless --convert-to pdf --outdir /tmp arquivo.docx
Parâmetros utilizados:
--headless - Inicia no "modo headless" que permite usar o aplicativo sem interface de usuário.--convert-to - Converte arquivos para um filtro selecionado, no nosso caso “pdf”--outdir - Indica a pasta destino do arquivo convertido.
arquivo.docx - O caminho para o arquivo a ser convertido.
Após executar o comando será criado um arquivo com o mesmo nome do arquivo de original porém na extensão .pdf e será mostrada uma mensagem de sucesso ou erro, como essa:
convert /home/tarik/docs/arquivo.docx -> /tmp/arquivo.pdf using filter : writer_pdf_Export
No retorno da conversão ele mostra o arquivo a ser convertido, o destino do arquivo após a conversão e o filtro utilizado. Infelizmente não é possível alterar o nome do arquivo destino neste tipo de conversão.
Agora que sabemos como utilizar o CLI do LibreOffice no shell do S.O, vamos implementar uma funcionalidade em Python para usar esse comando e retornar o caminho do PDF.
Para esta tarefa vamos utilizar o módulo disponível no Python chamado “subprocess” que permite a execução de aplicativos externos juntamente com a função run():
Nosso código para conversão ficará conforme abaixo:
import subprocess # Importamos o módulo subprocess
import os # Iremos utilizar a função exists() desse módulo para saber se o arquivo foi criado.def convert_file_to_pdf(file_path, output_dir):
subprocess.run(
f'/opt/libreoffice7.3/program/soffice \
--headless \
--convert-to pdf \
--outdir {output_dir} {file_path}', shell=True)
pdf_file_path = f'{output_dir}{file_path.rsplit("/", 1)[1].split(".")[0]}.pdf'
if os.path.exists(pdf_file_path):
return pdf_file_path
else:
return None
##########file_path = '/home/tarik/docs/arquivo.docx'
output_dir = '/tmp/'file = convert_file_to_pdf(file_path, output_dir)
if file:
print(f'Arquivo convertido para {file}')
else:
print('Não foi possível converter o arquivo')
A função convert_file_to_pdf recebe 2 parâmetros, a localização do arquivo a ser convertido e a pasta de saída para o pdf, então chama a função call() do módulo subprocess com nosso comando, e com o parâmetro a opção shell=True, para que o comando possa utilizar os recursos do shell do S.O. É criada uma string com o caminho do destino do arquivo convertido para verificar se realmente o arquivo foi convertido, então retorna uma string com caminho do arquivo PDF. O resultado final esperado é o mesmo da imagem abaixo:
Espero que tenham gostado, esse foi meu primeiro artigo depois de muito tempo, qualquer dúvida estou a disposição.
Referências: