สำคัญ
ณ วันที่ 31 พฤษภาคม 2567 บริการได้รับการเขียนใหม่โดยใช้ Kotlin และ Spring Boot
หากคุณต้องการใช้หรือดูซอร์สโค้ดเก่าคุณสามารถทำได้โดยตรวจสอบสาขา nodejs
เครื่องมือนี้แปลงเอกสาร Microsoft Word (DOCX) เป็นรูปแบบ PDF
แม้ว่าจะมีเครื่องมือมากมายสำหรับการแปลง DOCX เป็น PDF แต่ความท้าทายหลายประการเช่น:
เรื่องที่ซับซ้อนยิ่งขึ้นเครื่องมือเหล่านี้จำนวนมากต้องการสภาพแวดล้อมที่เฉพาะเจาะจงและมีหลายชั้นที่ซ้ำซ้อนและเป็นนามธรรม
เหตุใดการแปลง DOCX จึงมีความท้าทาย รากของปัญหาอยู่ในข้อกำหนดของ DOCX หรือที่เรียกว่า OOXML
ด้วยความซับซ้อนเหล่านี้การสร้าง Docx ที่ไร้ที่ติไปยังตัวแปลง PDF ยังคงเป็นความท้าทายที่น่ากลัว ไม่เร็ว ๆ นี้
Libreoffice ซึ่งเป็นชุดสำนักงานโอเพนซอร์ซที่ทรงพลังได้พยายามอย่างต่อเนื่องเพื่อเพิ่มความเข้ากันได้กับรูปแบบ Microsoft Office โดยเฉพาะรูปแบบ. DOCX นี่เป็นสิ่งสำคัญเพื่อให้แน่ใจว่าผู้ใช้เปลี่ยนจาก Microsoft Office เป็น Libreoffice สามารถทำงานกับเอกสารได้อย่างราบรื่น
มันมี APIs ในตัวและโหมดเซิร์ฟเวอร์ทำให้ผู้ใช้สามารถเชื่อมต่อกับโปรแกรมผ่านออบเจ็กต์เครือข่ายสากล (UNO) API
ในขณะที่ไม่สมบูรณ์แบบ แต่ก็ยังคงเป็นทางออกที่ดีที่สุดสำหรับการแสดงผลรูปแบบ DOCX
บริการนี้สร้างขึ้นใน Java โดยใช้ Spring Boot เปิดเผย API อย่างง่ายที่ใช้ไฟล์ DOCX เป็นอินพุตและตอบกลับด้วยไฟล์ application/pdf
มันประสบความสำเร็จโดยการเปิดตัวเซิร์ฟเวอร์ libreoffice ในพื้นหลังระหว่างการเริ่มต้นจากนั้นเริ่มสื่อสารกับเซิร์ฟเวอร์ผ่าน UNO API ที่จัดทำโดย OpenOffice (OO) ถึง:
จากนั้นสตรีมการตอบกลับกลับไปยังผู้ใช้
คุณสามารถดึงภาพนักเทียบท่าที่สร้างขึ้นล่าสุดจาก DockerHub:
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
: ในกรณีที่คุณต้องการแบบอักษรที่กำหนดเอง ละเว้นหากไม่จำเป็น อ่านเพิ่มเติมในส่วนฟอนต์ ในการเรียกใช้บริการนี้ในพื้นที่คุณจะต้องมีสิ่งต่อไปนี้:
ชวา 17
หนอง
$ export PATH= $PATH :/path/to/folder/apache-maven-3.9.4/bin
$ mvn -v
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
libreoffice ตรวจสอบให้แน่ใจว่ามีอยู่ในระบบของคุณผ่านตัวแปร $ path
$ 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/
จากนั้นคุณจะต้องรีสตาร์ทบริการ
หากตัวอักษรไม่รวมอยู่ในอิมเมจระบบ/นักเทียบท่าแล้วผลลัพธ์ PDFS จะไม่เหมือนไฟล์ DOCX ต้นฉบับ
เครื่องมือนี้ได้รับการออกแบบโดยคำนึงถึงประสิทธิภาพ
การตั้งค่าเริ่มต้นจะเรียกใช้บริการกับคนงานตัวแปลงหนึ่งคนเท่านั้น หากคุณมีทรัพยากรระบบเพียงพอและจำเป็นต้องเพิ่มขนาดสระว่ายน้ำของคนงานคุณสามารถทำได้โดยการจัดหา pool.size
ตัวแปรสภาพแวดล้อมให้กับบริการ
หรือคุณสามารถทำได้โดยการทำเครื่องหมาย pool.size
ในไฟล์คุณสมบัติ
การทดสอบทำได้ผ่านเว็บเบราว์เซอร์และ JavaScript, checkout index.html & stress.js ตามลำดับ
ฉันได้ทดสอบความเครียดบริการนี้ด้วยคำขอพร้อมกันด้วยไฟล์ docx 1 หน้าง่ายมาก (ตัวอย่าง 1) นี่คือผลลัพธ์:
จำนวนคำขอพร้อมกัน | จำนวนคนงาน | ถึงเวลาให้บริการคำขอทั้งหมด |
---|---|---|
50 | 1 | 5.594S |
50 | 4 | 1.880s |
50 | 8 | 1.277S |
50 | 16 | 1.081s |
โปรดทราบว่าความซับซ้อนของไฟล์อินพุตมีความสำคัญมากเมื่อพูดถึงประสิทธิภาพการแปลง
หากคุณมีการสังเกตประสิทธิภาพใด ๆ อย่าลังเลที่จะเปิดและรายงานปัญหา
ใบอนุญาต MIT
โมฮัมหมัดอัลฮาดาร์