مهم
اعتبارًا من 31 مايو ، 2024 ، تمت إعادة كتابة الخدمة باستخدام Kotlin و Spring Boot.
إذا كنت ترغب في استخدام رمز المصدر القديم أو النظر إليه ، فيمكنك القيام بذلك عن طريق التحقق من فرع nodejs
.
تقوم هذه الأداة بتحويل مستندات Microsoft Word (DOCX) إلى تنسيق PDF.
على الرغم من وجود وفرة من الأدوات لـ DOCX إلى تحويل PDF ، فإن العديد من التحديات التي تواجه مثل:
مزيد من تعقيد الأمور ، تتطلب العديد من هذه الأدوات بيئات محددة ولديها طبقات متعددة ، غالبًا ما تكون زائدة ، من التجريد.
لماذا يعد تحويل DOCX دقيقًا صعبًا للغاية؟ يكمن جذر المشكلة في مواصفات DOCX ، والمعروفة باسم OOXML .
بالنظر إلى هذه التعقيدات ، لا يزال إنشاء DOCX لا تشوبه شائبة إلى محول PDF تحديًا شاقًا ، مع عدم وجود حل كامل في الأفق. ليس في أي وقت قريب.
سعت Libreoffice ، وهو جناح مكتبي قوي مفتوح المصدر ، باستمرار لتعزيز التوافق مع تنسيقات Microsoft Office ، وخاصة تنسيق .Docx. هذا أمر بالغ الأهمية لضمان انتقال المستخدمين من Microsoft Office إلى Libreoffice يمكنه مواصلة العمل مع مستنداتهم بسلاسة.
إنه يوفر واجهات برمجة التطبيقات المدمجة ووضع الخادم ، مما يتيح للمستخدمين من الواجهة برمجيًا من خلال واجهة برمجة تطبيقات الشبكة الشاملة (UNO).
على الرغم من أنه ليس مثاليًا ، إلا أنه لا يزال أفضل حل متاح مجانًا لتقديم تنسيقات DOCX.
تم تصميم هذه الخدمة في Java ، باستخدام SPRING BOOT ، وفضح واجهة برمجة تطبيقات بسيطة تأخذ ملف DOCX كمدخل ويستجيب مرة أخرى بملف application/pdf
.
إنه يحقق هذا من خلال إطلاق خادم libreoffice في الخلفية أثناء التهيئة ، ثم يبدأ التواصل مع الخادم من خلال واجهات برمجة التطبيقات UNO التي توفرها OpenOffice (OO) إلى:
ثم تدفق الاستجابة مرة أخرى إلى المستخدم.
يمكنك سحب أحدث صورة Docker المصممة من 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 ، تأكد من توفرها في نظامك من خلال متغير المسار $.
$ 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 ، فلن تبدو النتيجة PDFs هي نفسها ملف DOCX الأصلي.
تم تصميم هذه الأداة مع وضع الأداء في الاعتبار.
تقوم الإعدادات الافتراضية بتشغيل الخدمة مع عامل محول واحد فقط. إذا كان لديك ما يكفي من موارد النظام المتاحة وتحتاج إلى زيادة حجم تجمع العمال ، فيمكنك القيام بذلك من خلال توفير pool.size
متغير البيئة.
أو يمكنك القيام بذلك عن طريق إزالة خط pool.size
في ملف الخصائص.
يتم الاختبار من خلال متصفح الويب و javaScript ، index.html & regn.js على التوالي.
لقد اختبرت هذه الخدمة مع طلبات متزامنة مع ملف DOCX بسيط للغاية (مثال 1) ، وهنا النتائج:
عدد الطلبات المتزامنة | عدد العمال | حان الوقت لخدمة جميع الطلبات |
---|---|---|
50 | 1 | 5.594s |
50 | 4 | 1.880s |
50 | 8 | 1.277s |
50 | 16 | 1.081s |
ضع في اعتبارك أن تعقيد ملفات الإدخال يهم كثيرًا عندما يتعلق الأمر بأداء التحويل.
إذا كان لديك أي ملاحظات أداء ، فلا تتردد في فتح مشكلة وإبلاغها.
رخصة معهد ماساتشوستس للتكنولوجيا
محمد الحدرار