Wichtig
Zum 31. Mai 2024 wurde der Dienst mit Kotlin und Spring Boot umgeschrieben.
Wenn Sie den alten Quellcode verwenden oder betrachten möchten, können Sie dies tun, indem Sie den nodejs
-Zweig überprüfen.
Dieses Tool verwandelt Microsoft Word -Dokumente (DOCX) in PDF -Format.
Obwohl es eine Fülle von Werkzeugen für DOCX bis zur PDF -Konvertierung gibt, stehen viele Herausforderungen wie:
Weitere komplizierende Angelegenheiten erfordern viele dieser Werkzeuge bestimmte Umgebungen und haben mehrere, oft überflüssige Abstraktionsschichten.
Warum ist eine genaue DOCX -Konvertierung so herausfordernd? Die Wurzel des Problems liegt in der DOCX -Spezifikation, die als OOXML bekannt ist.
Angesichts dieser Komplexität bleibt die Schaffung eines makellosen DOCX-zu-PDF-Konverters eine entmutigende Herausforderung, ohne dass eine vollständige Lösung in Sichtweite ist. Nicht bald.
LibreOffice, eine leistungsstarke Open-Source Office-Suite, hat sich durchweg bemüht, die Kompatibilität mit Microsoft Office-Formaten, insbesondere das .DOCX-Format, zu verbessern. Dies ist entscheidend, um sicherzustellen, dass Benutzer, die von Microsoft Office nach Libreoffice wechseln, nahtlos mit ihren Dokumenten zusammenarbeiten können.
Es bietet integrierte APIs und einen Servermodus, sodass Benutzer über die UNO-API (UNO) der Universal Network Objects (UNO) programmatisch mit ihm verkaufen können.
Obwohl es nicht perfekt ist, ist es immer noch die beste verfügbare Lösung für kostenlose DOCX -Formate.
Dieser Dienst ist in Java mit Spring Start eingebaut und enthält eine einfache API, die eine DOCX -Datei als Eingabe aufnimmt und mit einer application/pdf
-Datei reagiert.
Dies erreicht dies durch Start eines LibreOffice -Servers im Hintergrund während der Initialisierung und kommuniziert dann über die von OpenOffice (OO) bereitgestellten UNO -APIs mit dem Server:
Und dann die Antwort an den Benutzer zurück.
Sie können das neueste erstellte Docker -Bild von DockerHub ziehen:
docker pull moalhaddar/docx-to-pdf:latest
Dann können Sie den Service ausführen:
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
Einige Details:
pool.size
: Falls Sie mehr Arbeiter benötigen. Weglassen, wenn nicht erforderlich. Lesen Sie mehr im Leistungsbereich./usr/share/fonts/custom
: Falls Sie benutzerdefinierte Schriftarten benötigen. Weglassen, wenn nicht erforderlich. Lesen Sie mehr im Abschnitt Schriftarten. Um diesen Service lokal auszuführen, benötigen Sie Folgendes:
Java 17
Maven
$ export PATH= $PATH :/path/to/folder/apache-maven-3.9.4/bin
$ mvn -v
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
LibreOffice, stellen Sie sicher, dass es über die $ Path -Variable in Ihrem System erhältlich ist.
$ libreoffice --version
LibreOffice 7.5.6.2 50(Build:2)
Klonen Sie dieses Repository und führen Sie dann vom Home -Verzeichnis den Dienst aus
$ mvn spring-boot:run
Erwarten Sie standardmäßig, dass der Dienst auf Port 8080 ausgeführt wird.
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)
Sobald der Service in Betrieb ist, können Sie versuchen, den Service am /pdf
-Endpunkt zu treffen.
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 ) ) ;
Die folgenden Beispieldateien sind hier in diesem Repository enthalten
Es wird passieren, dass Sie eine Schriftart im DOCX -Dokument verwenden, das nicht in Ihrem System enthalten ist. In diesem Fall muss die genannte Schriftart entweder einbezogen werden von:
/usr/share/fonts/
Verzeichnis auf irgendwohin kopieren. Beispiel $ cp ./fonts/DroidKufi-Bold.ttf /usr/share/fonts/
Dann müssen Sie den Service neu starten.
Wenn die Schriftart nicht im System/Docker -Bild enthalten ist, sieht das Ergebnis PDFS nicht mit der ursprünglichen DOCX -Datei gleich aus.
Dieses Tool wurde unter Berücksichtigung der Leistung entworfen.
In den Standardeinstellungen wird der Dienst nur mit einem Konverterarbeiter ausgeführt. Wenn Sie über genügend Systemressourcen zur Verfügung stehen und die Größe der Arbeiterpool erhöhen müssen, können Sie dies tun, indem Sie den pool.size
zur Verfügung stellen. Geben Sie den Service an.
Oder Sie können dies tun, indem Sie die Zeile der pool.size
in der Eigenschaftendatei überzeugen.
Der Test erfolgt über einen Webbrowser und einen JavaScript, den Checkout index.html & stresse.js.
Ich habe diesen Service mit gleichzeitigen Anfragen mit einer sehr einfachen 1-seitigen DOCX-Datei (Beispiel 1) getestet. Hier sind die Ergebnisse:
Anzahl der gleichzeitigen Anfragen | Anzahl der Arbeiter | Zeit, alle Anfragen zu dienen |
---|---|---|
50 | 1 | 5.594s |
50 | 4 | 1,880S |
50 | 8 | 1.277s |
50 | 16 | 1.081s |
Denken Sie daran, dass die Komplexität der Eingabedatei bei der Konvertierungsleistung sehr wichtig ist.
Wenn Sie Leistungsbeobachtungen haben, zögern Sie nicht, ein Problem zu öffnen und zu melden.
MIT -Lizenz
Mohammad Alhaddar