Importante
Em 31 de maio de 2024, o serviço foi reescrito usando Kotlin e Spring Boot.
Se você deseja usar ou olhar para o código -fonte antigo, pode fazê -lo verificando a filial nodejs
.
Esta ferramenta transforma os documentos do Microsoft Word (DOCX) em formato PDF.
Embora exista uma abundância de ferramentas para o DOCX para a conversão em PDF, muitos enfrentam desafios como:
Complicando ainda mais, muitas dessas ferramentas exigem ambientes específicos e têm várias camadas de abstração.
Por que a conversão do DOCX precisa é tão desafiadora? A raiz da questão está na especificação DOCX, conhecida como ooxml .
Dadas essas complexidades, a criação de um conversor DOCX para PDF impecável continua sendo um desafio assustador, sem solução à vista à vista. Não tão cedo.
A LibreOffice, uma poderosa suíte de escritório de código aberto, constantemente se esforçou para melhorar a compatibilidade com os formatos do Microsoft Office, particularmente o formato .docx. Isso é crucial para garantir que os usuários fizessem a transição do Microsoft Office para o LibreOffice possam continuar trabalhando com seus documentos sem problemas.
Oferece APIs embutidas e um modo de servidor, permitindo que os usuários interajam programaticamente com ele através da API da Universal Network Objects (UNO).
Embora não seja perfeito, ainda é a melhor solução disponível gratuitamente para renderizar formatos DOCX.
Este serviço é incorporado em Java, usando a Spring Boot, expondo uma API simples que pega um arquivo DOCX como uma entrada e responde de volta com um arquivo application/pdf
.
Ele alcança isso lançando um servidor LibreOffice em segundo plano durante a inicialização e depois começa a se comunicar com o servidor através das APIs UNO fornecidas pelo OpenOffice (OO) para:
E depois transmitindo a resposta de volta ao usuário.
Você pode puxar a imagem mais recente do Docker Built do DockerHub:
docker pull moalhaddar/docx-to-pdf:latest
Então você pode executar o serviço:
docker run
--rm --name docx-to-pdf
-p 8080:8080
-e " pool.size=1 "
-v ./fonts:/usr/share/fonts/custom
moalhaddar/docx-to-pdf:latest
Alguns detalhes:
pool.size
: Caso você precise de mais trabalhadores. Omita se não for necessário. . Leia mais na seção de desempenho./usr/share/fonts/custom
: Caso você precise de fontes personalizadas. Omita se não for necessário. Leia mais na seção Fontes. Para executar este serviço localmente, você precisará do seguinte:
Java 17
Maven
$ export PATH= $PATH :/path/to/folder/apache-maven-3.9.4/bin
$ mvn -v
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
LibreOffice, verifique se está disponível no seu sistema através da variável $ PATH.
$ libreoffice --version
LibreOffice 7.5.6.2 50(Build:2)
Clone este repositório e depois do diretório inicial execute o serviço
$ mvn spring-boot:run
Espere que o serviço esteja em execução na porta 8080 por padrão.
2023-10-06T22:36:06.922+03:00 INFO 1513874 --- [ main] d.a.d.DocxToPdfKotlinApplicationKt : No active profile set, falling back to 1 default profile: "default"
2023-10-06T22:36:07.414+03:00 INFO 1513874 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-10-06T22:36:07.419+03:00 INFO 1513874 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-10-06T22:36:07.419+03:00 INFO 1513874 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.13]
2023-10-06T22:36:07.463+03:00 INFO 1513874 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-10-06T22:36:07.464+03:00 INFO 1513874 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 513 ms
2023-10-06T22:36:07.554+03:00 INFO 1513874 --- [atcher-worker-1] d.a.docxtopdf.server.LibreOfficeServer : [LibreOffice/0] Starting server instance..
2023-10-06T22:36:07.788+03:00 INFO 1513874 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator'
2023-10-06T22:36:07.813+03:00 INFO 1513874 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-10-06T22:36:07.821+03:00 INFO 1513874 --- [ main] d.a.d.DocxToPdfKotlinApplicationKt : Started DocxToPdfKotlinApplicationKt in 1.071 seconds (process running for 1.22)
Depois que o serviço estiver em funcionamento, você pode tentar acertar o serviço no terminal /pdf
.
curl --output output.pdf
--location ' http://localhost:8080/pdf '
--form ' document=@"/home/moalhaddar/example.docx" '
var formdata = new FormData ( ) ;
formdata . append ( "document" , fileInput . files [ 0 ] , "file.docx" ) ;
var requestOptions = {
method : 'POST' ,
body : formdata ,
} ;
fetch ( "http://localhost:8080/pdf" , requestOptions )
. then ( response => response . text ( ) )
. then ( result => console . log ( result ) )
. catch ( error => console . log ( 'error' , error ) ) ;
Os arquivos de exemplo abaixo estão incluídos neste repositório aqui
Acontece que você usa uma fonte no documento DOCX que não está incluído no seu sistema. Nesse caso, a fonte referida precisará ser incluída por:
/usr/share/fonts/
diretório. Exemplo $ cp ./fonts/DroidKufi-Bold.ttf /usr/share/fonts/
Então você precisará reiniciar o serviço.
Se a fonte não estiver incluída na imagem do sistema/docker, o resultado PDFS não parecerá o mesmo que o arquivo DOCX original.
Esta ferramenta foi projetada com o desempenho em mente.
As configurações padrão executam o serviço apenas com um trabalhador de conversor. Se você tiver recursos suficientes disponíveis e precisar aumentar o tamanho do pool de trabalhadores, pode fazê -lo fornecendo o pool.size
de variável de ambiente.
Ou você pode fazer isso descomando da linha pool.size
no arquivo Properties.
O teste é feito através de um navegador da Web e JavaScript, Checkout Index.html & Stress.js, respectivamente.
Eu testei esse serviço com solicitações simultâneas com um arquivo DOCX de 1 página muito simples (Exemplo 1), aqui estão os resultados:
Número de solicitações simultâneas | Número de trabalhadores | Hora de atender a todos os pedidos |
---|---|---|
50 | 1 | 5.594s |
50 | 4 | 1.880s |
50 | 8 | 1.277s |
50 | 16 | 1.081s |
Lembre -se de que a complexidade do arquivo de entrada é muito importante quando se trata do desempenho da conversão.
Se você tiver alguma observações de desempenho, não hesite em abrir e relatar um problema.
MIT Licença
Mohammad Alhaddar