重要的
截至2024年5月31日,該服務已使用Kotlin和Spring Boot重寫。
如果您想使用或查看舊的源代碼,則可以通過檢查nodejs
分支來做到這一點。
該工具將Microsoft Word文檔(DOCX)轉換為PDF格式。
儘管DOCX有很多用於PDF轉換的工具,但許多面臨的挑戰,例如:
進一步使事情變得複雜,其中許多工具需要特定的環境,並且具有多個(通常是多餘的)抽象層。
為什麼準確的DOCX轉換如此具有挑戰性?該問題的根源在於DOCX規範,稱為OOXML 。
鑑於這些複雜性,為PDF轉換器創建完美無瑕的DOCX仍然是一個艱鉅的挑戰,看不到完整的解決方案。不會很快。
Libreoffice是一個強大的開源辦公室套件,一直致力於增強與Microsoft Office格式的兼容性,尤其是.docx格式。這對於確保從Microsoft Office過渡到Libreoffice的用戶可以繼續無縫地使用其文檔。
它提供內置的API和服務器模式,使用戶能夠通過通用網絡對象(UNO)API通過編程方式進行編程接口。
雖然不是完美的,但它仍然是免費提供DOCX格式的最佳解決方案。
此服務是在Java中構建的,使用Spring Boot揭示了一個簡單的API,該API將DOCX文件作為輸入並用application/pdf
文件響應。
它通過在初始化期間在後台啟動Libreoffice服務器來實現這一目標,然後開始通過OpenOffice(OO)提供的UNO API與服務器通信:
然後將響應流回給用戶。
您可以從Dockerhub獲取最新的Docker映像:
docker pull moalhaddar/docx-to-pdf:latest
然後,您可以運行服務:
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
一些細節:
pool.size
:如果您需要更多的工人。如果不需要,請省略。在“性能”部分中閱讀更多。/usr/share/fonts/custom
:如果您需要自定義字體。如果不需要,請省略。在“字體”部分中閱讀更多內容。 要在本地運行此服務,您將需要以下內容:
Java 17
小牛
$ export PATH= $PATH :/path/to/folder/apache-maven-3.9.4/bin
$ mvn -v
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
libreoffice,確保通過$路徑變量在系統中可用。
$ libreoffice --version
LibreOffice 7.5.6.2 50(Build:2)
克隆此存儲庫,然後從主目錄運行服務
$ mvn spring-boot:run
期望該服務默認情況下在端口8080上運行。
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)
服務啟動並運行後,您可以嘗試在/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 ) ) ;
以下示例文件在此存儲庫中包含
您將在系統中未包含的DOCX文檔中使用字體。在這種情況下,將需要通過以下方式包括上述字體
/usr/share/fonts/
Directory中的任何地方來做到這一點。例子$ cp ./fonts/DroidKufi-Bold.ttf /usr/share/fonts/
那麼您將需要重新啟動服務。
如果該字體不包含在系統/Docker映像中,則結果PDF將看起來與原始DOCX文件相同。
該工具的設計考慮了性能。
默認設置僅使用一個轉換器工人運行服務。如果您有足夠的系統資源,並且需要增加工作池的大小,則可以通過提供環境變量pool.size
來實現。
或者,您可以通過刪除池中的池中的pool.size
線。
該測試分別通過Web瀏覽器和JavaScript進行結帳index.html&werse.js。
我已經用同時的請求使用非常簡單的1頁DOCX文件(示例1)測試了這項服務,這是結果:
並發請求的數量 | 工人人數 | 是時候服務所有請求了 |
---|---|---|
50 | 1 | 5.594 |
50 | 4 | 1.880 |
50 | 8 | 1.277 |
50 | 16 | 1.081 |
請記住,對於轉換性能,輸入文件複雜性非常重要。
如果您有任何績效觀察,請隨時開放並報告一個問題。
麻省理工學院許可證
穆罕默德·阿爾哈達達(Mohammad Alhaddar)