重要的
截至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)