Penting
Pada tanggal 31 Mei 2024, layanan ini telah ditulis ulang menggunakan Kotlin dan Spring Boot.
Jika Anda ingin menggunakan atau melihat kode sumber lama, Anda dapat melakukannya dengan memeriksa cabang nodejs
.
Alat ini mengubah Microsoft Word Documents (DOCX) menjadi format PDF.
Meskipun ada banyak alat untuk konversi DOCX ke PDF, banyak menghadapi tantangan seperti:
Hal -hal yang lebih rumit, banyak dari alat -alat ini menuntut lingkungan tertentu dan memiliki banyak, lapisan abstraksi.
Mengapa konversi DOCX yang akurat begitu menantang? Akar masalah ini terletak pada spesifikasi DOCX, yang dikenal sebagai OOXML .
Mengingat kompleksitas ini, menciptakan DOCX yang sempurna untuk konverter PDF tetap menjadi tantangan yang menakutkan, tanpa solusi tahan penuh yang terlihat. Tidak dalam waktu dekat.
LibreOffice, suite kantor open-source yang kuat, secara konsisten berupaya meningkatkan kompatibilitas dengan format Microsoft Office, terutama format .docx. Ini sangat penting untuk memastikan bahwa pengguna beralih dari Microsoft Office ke LibreOffice dapat terus bekerja dengan dokumen mereka dengan mulus.
Menawarkan API bawaan dan mode server, memungkinkan pengguna untuk berinteraksi secara terprogram dengannya melalui API Objek Jaringan Universal (UNO).
Meskipun tidak sempurna, ini masih merupakan solusi terbaik yang tersedia secara gratis untuk merender format DOCX.
Layanan ini dibangun di Java, menggunakan Spring Boot, memperlihatkan API sederhana yang mengambil file DOCX sebagai input dan merespons kembali dengan file application/pdf
.
Ini mencapai ini dengan meluncurkan server LibreOffice di latar belakang selama inisialisasi, kemudian mulai berkomunikasi dengan server melalui API UNO yang disediakan oleh OpenOffice (OO) ke:
Dan kemudian streaming respons kembali ke pengguna.
Anda dapat menarik gambar Docker terbaru yang dibangun dari Dockerhub:
docker pull moalhaddar/docx-to-pdf:latest
Maka Anda dapat menjalankan layanan:
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
Beberapa detail:
pool.size
: Jika Anda membutuhkan lebih banyak pekerja. Hilangkan jika tidak diperlukan. . Baca lebih banyak di bagian Kinerja./usr/share/fonts/custom
: Jika Anda memerlukan font khusus. Hilangkan jika tidak diperlukan. Baca lebih lanjut di bagian Fonts. Untuk menjalankan layanan ini secara lokal, Anda akan membutuhkan yang berikut:
Java 17
Maven
$ export PATH= $PATH :/path/to/folder/apache-maven-3.9.4/bin
$ mvn -v
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
LibreOffice, pastikan itu tersedia di sistem Anda melalui variabel $ path.
$ libreoffice --version
LibreOffice 7.5.6.2 50(Build:2)
Klon Repositori ini dan kemudian dari Direktori Home Run Layanan
$ mvn spring-boot:run
Harapkan layanan akan berjalan di port 8080 secara default.
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)
Setelah layanan berjalan dan berjalan, Anda dapat mencoba menekan layanan di titik akhir /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 ) ) ;
Contoh file di bawah ini disertakan dalam repositori ini di sini
Ini akan terjadi bahwa Anda menggunakan font dalam dokumen DOCX yang tidak termasuk dalam sistem Anda. Dalam hal ini, font tersebut perlu dimasukkan baik oleh:
/usr/share/fonts/
direktori Anda. Contoh $ cp ./fonts/DroidKufi-Bold.ttf /usr/share/fonts/
Maka Anda perlu memulai kembali layanan.
Jika font tidak termasuk dalam gambar Sistem/Docker, maka hasil PDF tidak akan terlihat sama dengan file DOCX asli.
Alat ini dirancang dengan mempertimbangkan kinerja.
Pengaturan default menjalankan layanan dengan satu pekerja konverter saja. Jika Anda memiliki sumber daya sistem yang cukup yang tersedia dan perlu meningkatkan ukuran kumpulan pekerja, Anda dapat melakukannya dengan menyediakan pool.size
UNTUK LAYANAN.
Atau Anda dapat melakukannya dengan membuka komentar pool.size
di file Properties.
Tes dilakukan melalui browser web dan JavaScript, checkout index.html & stress.js masing -masing.
Saya telah stres menguji layanan ini dengan permintaan bersamaan dengan file docx 1-halaman yang sangat sederhana (Contoh 1), berikut adalah hasilnya:
Jumlah permintaan bersamaan | Jumlah pekerja | Saatnya melayani semua permintaan |
---|---|---|
50 | 1 | 5.594S |
50 | 4 | 1.880 -an |
50 | 8 | 1.277 |
50 | 16 | 1.081S |
Perlu diingat bahwa kompleksitas file input sangat penting dalam hal kinerja konversi.
Jika Anda memiliki pengamatan kinerja, jangan ragu untuk membuka dan melaporkan masalah.
Lisensi MIT
Mohammad Alhaddar