الأدلة التقنية

Collabora Online أم ONLYOFFICE؟ حزمة مكتبية في المتصفح

أي المحررين يتعامل مع النص العربي وملفات Word وExcel بشكل أفضل داخل Nextcloud، وماذا تسمح لك به رخصة كل منهما.

Collabora Online أم ONLYOFFICE؟ حزمة مكتبية في المتصفح

أول ما يسأل عنه الموظف عندما تخبره المؤسسة أنها ستنتقل من Microsoft 365 أو Google Workspace هو: هل سأفتح ملفات Word وExcel كما أفتحها اليوم؟ وهل سيبقى الجدول العربي من اليمين إلى اليسار، والأرقام في مكانها، والتعليقات وتتبع التغييرات كما هي عندما أرسل الملف إلى جهة ما زالت تستخدم Word؟ وفي خريطة البدائل ذكرنا أن تحرير المستندات في المتصفح له بديلان ناضجان مفتوحا المصدر هما Collabora Online وONLYOFFICE Docs، وفي هذا المقال سوف نضع الاثنين على مختبر واحد مع Nextcloud ونختبرهما بالملفات نفسها، والحكم فيه للمخرجات وليس لصفحات التسويق.

ولن نشرح هنا خطة الانتقال كاملة ولا نقل الملفات من OneDrive، فلها مقالات في مرحلة الانتقال من Microsoft 365 وGoogle Workspace، وسوف نناقش في هذا المقال ما يلي:

  • الفرق الجوهري بين المحررين: أين يرسم المستند، على السيرفر أم في المتصفح، ولماذا يفسر هذا أغلب النتائج.
  • التراخيص وحدود النسخ المجانية كما هي في الكود والتوثيق اليوم، بما فيها حد العشرين اتصالاً المشهور.
  • مختبر حقيقي: Nextcloud مع المحررين، والأخطاء التي واجهتنا في الربط.
  • تحرير النص العربي في المتصفح: الكتابة والاتجاه والأرقام والتواريخ.
  • اختبار الدقة Fidelity بملف DOCX وملف XLSX صنعناهما في Word وExcel: ما الذي يبقى بعد الحفظ، وكيف يظهر المستند مقارنة بعرضه في Word نفسه.
  • نقاط القوة ونقاط الضعف لكل محرر، ومتى تختار أياً منهما.

أين يرسم المستند؟

المحرران يعملان في المتصفح ويشبهان Word من بعيد، لكن طريقة عمل كل منهما مختلفة تماماً، وهذا الفرق يفسر أغلب ما سنراه في التجربة، والصورة التالية تبينه:

لوحتان: على اليمين Collabora Online حيث يفتح coolwsd وkit المستند بمحرك LibreOffice على السيرفر ويرسله إلى المتصفح مربعات صغيرة مرسومة عبر رسائل tile وtilecombine، وعلى اليسار ONLYOFFICE Docs حيث يحول Document Server الملف ويرسل بيانات المستند وملفات الخطوط إلى المتصفح، ومحررات JavaScript ترسم الصفحة في المتصفح
Collabora يرسم على السيرفر ويرسل صوراً، وONLYOFFICE يرسل البيانات والخطوط ويرسم في المتصفح
  • Collabora Online: مبني على محرك LibreOffice نفسه، فالمستند مفتوح في عملية على السيرفر، والسيرفر هو الذي يحسب تخطيط الصفحة ويرسم النص بالخطوط المثبتة عليه، ثم يرسل إلى المتصفح مربعات صغيرة مرسومة Tiles، والمتصفح يرسل ضغطات المفاتيح والنقرات، كما يصف بروتوكول الاتصال في الكود نفسه. ولهذا كل مستخدم يفتح مستنداً يستهلك من معالج السيرفر وذاكرته، وكل الخطوط التي تريدها يجب أن تكون على السيرفر.
  • ONLYOFFICE Docs: السيرفر يحول الملف ويدير التحرير المشترك، أما المحررات نفسها فمكتوبة ب JavaScript في مكتبة sdkjs وترسم الصفحة داخل المتصفح، فالحمل يقع على جهاز المستخدم، والخطوط ترسل إلى المتصفح من السيرفر.

وقد يتساءل البعض: أيهما أفضل إذن؟ والإجابة أن لكل طريقة ثمنها، فرسم السيرفر يعني أن المستند يظهر بالشكل نفسه على كل جهاز مهما كان ضعيفاً، لكنه يجعل السيرفر هو الحد عندما يكثر المستخدمون، ورسم المتصفح يخفف السيرفر ويجعل الكتابة سريعة الاستجابة، لكنه يحتاج جهازاً ومتصفحاً جيدين.

التراخيص وحدود النسخ المجانية

هنا أكثر ما يتداوله الناس عن المحررين، وأكثره قديم، ولذلك رجعنا إلى الكود والتوثيق والسجلات في الإصدارات التي شغلناها:

البندCollabora Online (النسخة المجانية CODE)ONLYOFFICE Docs (Community Edition)
الترخيصMPL-2.0AGPLv3 مع شروط إضافية بموجب المادة 7
الإصدار الذي اختبرناه26.04.4.29.4.0.129
حد الاتصالات والمستنداتسجل التشغيل عندنا: مليون مستند ومليون اتصال، أي لا يوجد حد عمليأزيل حد العشرين في الإصدار 9.4.0، وملف README ما زال يوصي بعشرين مستخدماً
التحرير من متصفح الجوالمتاح، والسيرفر يعلن hasMobileSupportغير متاح في نسخة Community بحسب جدول الإصدارات
موقف المورد من الإنتاج"not recommended for production environments"نسخة كاملة للفرق الصغيرة، والدعم في المجتمع
النسخة المدفوعةCollabora Online باشتراك، بتحديثات أمنية مختبرة ودعمEnterprise وDeveloper بترخيص تجاري

والتفاصيل كما يلي:

  • حد العشرين في ONLYOFFICE: لسنوات كانت نسخة Community تمنع أكثر من عشرين اتصالاً تحريرياً في الوقت نفسه، وكان الحد مكتوباً في الكود. وفي 6 مايو 2026 أزيل في تعديل عنوانه Remove Community 20-connection limit، وسجل تغييرات الإصدار 9.4.0 يذكر إزالة حد العشرين مستنداً مفتوحاً، بينما ما زال جدول الإصدارات في ملف README يقول إن العدد الموصى به إلى 20 مستخدماً. ولم نختبر في المختبر أكثر من عشرين مستخدماً في الوقت نفسه، فالحكم هنا من الكود وسجل التغييرات، وإذا كنت على إصدار أقدم من 9.4.0 فالحد ما زال موجوداً عندك.
  • الشروط الإضافية في ترخيص ONLYOFFICE: ملف الترخيص يضيف بموجب المادة 7 من AGPL شروطاً منها الإبقاء على إشعارات حقوق النشر والإشارة إلى أن البرنامج من تطوير Ascensio System، وأن تحمل النسخة المعدلة إشعاراً بأنها معدلة، فإذا كنت ستعدل الواجهة أو تزيل الشعار فاقرأ الملف قبل ذلك، وقد شرحنا معنى AGPL في ما هي البرمجيات مفتوحة المصدر وتراخيصها.
  • حد Collabora: ملف configure.ac في كود Collabora فيه خياران لتحديد عدد الاتصالات والمستندات عند البناء، والقيمة الافتراضية في الكود 9999، والنسخة التي شغلناها كتبت في سجلها عند التشغيل:
[ coolwsd ] INF  Maximum concurrent open Documents limit: 1000000
[ coolwsd ] INF  Maximum concurrent client Connections limit: 1000000

أما القيد الحقيقي في CODE فهو موقف المورد نفسه، فصفحة CODE تصفها بأنها مناسبة للتجربة والاستخدام المنزلي والفرق الصغيرة، ولا ينصح بها لبيئات الإنتاج، والسبب أنها نسخة تطوير تصدر شهرياً، بينما التحديثات الأمنية المختبرة والدعم في النسخة المدفوعة، وفي كل جلسة متصفح جديدة تظهر عند فتح المستند نافذة ترحيب تقول إن النسخة مجانية للاستخدام والتجربة.

المختبر: Nextcloud مع المحررين

المحرران لا يعملان وحدهما، فهما يحتاجان نظام ملفات يحفظ المستند ويقرر من يفتحه، وأكثر ما يستخدم معهما هو Nextcloud، ولذلك شغلنا ثلاثة Containers على شبكة Docker واحدة، وكلها تستمع على 127.0.0.1 فقط:

docker network create lab-office-net

docker run -d --name lab-office-nc --network lab-office-net -p 127.0.0.1:28100:80 \
  -e SQLITE_DATABASE=nc -e NEXTCLOUD_ADMIN_USER=admin -e NEXTCLOUD_ADMIN_PASSWORD=Lab-Office-2026 \
  -e NEXTCLOUD_TRUSTED_DOMAINS="127.0.0.1 lab-office-nc" -e OVERWRITECLIURL=http://127.0.0.1:28100 \
  nextcloud:35.0.1-apache

docker run -d --name lab-office-collabora --network lab-office-net -p 127.0.0.1:28101:9980 \
  -e aliasgroup1=http://lab-office-nc:80 -e server_name=127.0.0.1:28101 \
  -e "extra_params=--o:ssl.enable=false --o:ssl.termination=false" \
  -e username=admin -e password=Lab-Office-2026 collabora/code:26.04.4.2.1

docker run -d --name lab-office-onlyoffice --network lab-office-net -p 127.0.0.1:28102:80 \
  -e JWT_ENABLED=true -e JWT_SECRET=lab-office-jwt-secret-2026-long-value \
  onlyoffice/documentserver:9.4.0.1

في الإعداد أعلاه لاحظ التالي:

  • قاعدة SQLite في Nextcloud للمختبر فقط، أما في الإنتاج فاستخدم PostgreSQL أو MariaDB.
  • aliasgroup1 في Collabora هو قائمة السيرفرات المسموح لها أن تطلب منه فتح ملفات، فلا يفتح ملفاً من سيرفر غير مذكور فيها.
  • عطلنا HTTPS في Collabora لأن المختبر محلي، أما في الإنتاج فيكون المحرران خلف Reverse Proxy بشهادة، كما في Nginx Proxy Manager.
  • JWT_SECRET في ONLYOFFICE يوقع الطلبات بين Nextcloud والمحرر، فلا يقبل المحرر طلب فتح ملف دون توقيع صحيح، ولا تقم بتعطيله في الإنتاج.

ثم نثبت تطبيقي الربط في Nextcloud، وهما richdocuments لربط Collabora وonlyoffice لربط ONLYOFFICE، ونضبط العناوين:

occ() { docker exec -u www-data lab-office-nc php occ "$@"; }
occ app:install richdocuments
occ app:install onlyoffice
occ config:system:set allow_local_remote_servers --value=true --type=boolean
occ richdocuments:setup --wopi-url=http://lab-office-collabora:9980 --callback-url=http://lab-office-nc
occ config:app:set onlyoffice DocumentServerUrl --value=http://127.0.0.1:28102/
occ config:app:set onlyoffice DocumentServerInternalUrl --value=http://lab-office-onlyoffice/
occ config:app:set onlyoffice StorageUrl --value=http://lab-office-nc/
occ config:app:set onlyoffice jwt_secret --value=lab-office-jwt-secret-2026-long-value
occ onlyoffice:documentserver --check

والمخرج سوف يكون كما يلي:

richdocuments 12.0.1 installed
richdocuments enabled
onlyoffice 10.2.1 installed
onlyoffice enabled
...
Collabora URL (used for Nextcloud to contact the Collabora server):
  http://lab-office-collabora:9980
Collabora public URL (used in the browser to open Collabora):
  http://127.0.0.1:28101
Callback URL (used by Collabora to connect back to Nextcloud):
  http://lab-office-nc
...
Document server http://127.0.0.1:28102/ version 9.4.0.129 is successfully connected

والصورة التالية تبين كيف يربط كل تطبيق المحرر بالملف، فCollabora يستخدم بروتوكول WOPI الذي وضعته Microsoft لمحررات Office على الويب، وNextcloud فيه هو المضيف WOPI Host، أما ONLYOFFICE فيستلم إعدادات موقعة فيها رابط تنزيل الملف ورابط رجوع Callback يرسل إليه النسخة المعدلة عند الحفظ، كما في توثيق الحفظ:

المستخدم يفتح الملف في Nextcloud، ثم يتصل Nextcloud بمحرر Collabora عبر طلبات WOPI لمعلومات الملف وتحميله وحفظه، أو يرسل إلى ONLYOFFICE إعدادات فيها رابط الملف وتوقيع JWT، والمحرر ينزل الملف ويحوله ثم يرسل رابط النسخة المعدلة إلى callbackUrl، وملاحظة أن المحررين يحتاجان الوصول إلى Nextcloud على عنوان داخلي
الملف يبقى في Nextcloud، والمحرر يطلبه ويعيده، فيجب أن يصل كل منهما إلى الآخر

الأخطاء التي واجهتنا في الربط

  • العنوان العام لCollabora: في المحاولة الأولى شغلنا Collabora دون server_name، فقرأ Nextcloud عنوانه من ملف الاكتشاف Discovery الذي يرسله Collabora، وكان العنوان الداخلي http://lab-office-collabora:9980 هو العنوان العام أيضاً، وهذا اسم لا يعرفه المتصفح، فلا يفتح المحرر. والحل هو server_name بالعنوان الذي يصل منه المستخدم، ثم إعادة richdocuments:setup.
  • رابط الرجوع: Collabora يتصل ب Nextcloud ليحمل الملف ويحفظه، فإذا لم تضبط --callback-url استخدم العنوان الذي يتصفح منه المستخدم، وهو هنا 127.0.0.1، وهذا العنوان داخل Container Collabora يعني Collabora نفسه.
  • الملف المقفل: بعد أن أغلقنا مستنداً في ONLYOFFICE وحاولنا رفع نسخة جديدة منه عبر WebDAV رد Nextcloud ب 423، أي أن الملف مقفل Locked، والسبب أن جلسة التحرير لا تنتهي لحظة إغلاق الصفحة، وإنما بعد مهلة يحفظ فيها المحرر ويعيد الملف، فلا تقم بتعديل الملف من مكان آخر وهو مفتوح في المحرر.
  • تطبيقان لنوع واحد: التطبيقان يسجلان نفسيهما لفتح DOCX وXLSX، ففي المختبر فعلنا واحداً في كل مرة بالأمر occ app:disable، وفي الإنتاج تختار واحداً فقط.

تحرير النص العربي في المتصفح

فتحنا مستنداً فارغاً في كل محرر، وكتبنا السطرين نفسيهما، وفيهما خليط من العربي والإنجليزي والأرقام والتاريخ والنسبة المئوية والأقواس، وهي الحالات التي تكشف مشكلات الاتجاه Bidirectional Text:

تمت ترقية Nextcloud إلى الإصدار 35.0.1 يوم 2026-10-08 (تجربة).
سعر الاشتراك 1,250 ريال، أي 15% أقل.

والمستند الفارغ الذي استخدمناه أنشأته مكتبة python-docx بالإعدادات الافتراضية، أي بفقرات من اليسار إلى اليمين، وهذا ما يحدث أيضاً مع أي قالب لم يجهز للعربية، والنتيجة قبل تغيير اتجاه الفقرة في Collabora كانت كما يلي:

محرر Collabora في المتصفح وفيه السطران العربيان مكتوبان في فقرة من اليسار إلى اليمين، فيبدأ السطر الأول بعبارة تمت ترقية من اليسار، والجملة مرتبة بشكل غير صحيح، والنقطة في غير مكانها
نص عربي في فقرة من اليسار إلى اليمين: الكلمات صحيحة والترتيب خاطئ

وهذا ليس خطأ في المحرر، فWord يفعل الشيء نفسه في فقرة من اليسار إلى اليمين، والحل في المحررين واحد: تحديد النص ثم زر اتجاه الفقرة من اليمين إلى اليسار، وفي ONLYOFFICE هو قائمة بجانب زر علامة الفقرة فيها خياران. والصورتان التاليتان بعد تغيير الاتجاه:

محرر Collabora بعد تحويل الفقرتين إلى اليمين لليسار: السطر الأول تمت ترقية Nextcloud إلى الإصدار 35.0.1 يوم 08-10-2026 (تجربة)، والسطر الثاني سعر الاشتراك 1,250 ريال، أي 15% أقل
Collabora بعد تحويل الفقرة إلى اليمين لليسار
محرر ONLYOFFICE داخل Nextcloud بعد تحويل الفقرتين إلى اليمين لليسار: السطر الأول يظهر فيه التاريخ 2026-10-08 بترتيبه الأصلي، وكلمة تمت تظهر بفراغ بين التاء وبقية الكلمة، والسطر الثاني صحيح
ONLYOFFICE بعد تحويل الفقرة إلى اليمين لليسار

ولاحظ في الصورتين ما يلي:

  • الترتيب العام صحيح في المحررين بعد تغيير الاتجاه، والأقواس والنقطة والنسبة المئوية والفاصلة العربية في مكانها.
  • التاريخ نفسه الذي كتبناه 2026-10-08 ظهر في Collabora بالترتيب 08-10-2026، وفي ONLYOFFICE بترتيبه كما كتب، والنص المحفوظ واحد، والفرق في طريقة العرض، فإذا كانت التواريخ مهمة في مستنداتك فاكتبها بصيغة لا تحتمل اللبس، أو اختبر العرض في المحرر الذي اخترته.
  • في ONLYOFFICE ظهرت كلمة «تمت» في أول السطر بفراغ بين التاء وبقية الكلمة، وتكرر ذلك في كل محاولة، ولم يظهر في Collabora.
  • في المحررين لم يتغير اتجاه الفقرة تلقائياً عند الكتابة بالعربية، فجهز قوالب المؤسسة الفارغة بفقرات من اليمين إلى اليسار ولغة عربية من البداية، والسبب أن الموظف لن يبحث عن زر الاتجاه في كل مستند.

اختبار الدقة: الملفات نفسها في المحررين

الدقة Fidelity هنا سؤالان منفصلان: الأول هل يعرض المحرر الملف كما يعرضه Word؟ والثاني هل يحفظ المحرر الملف بحيث يعود إلى Word دون أن يفقد شيئاً؟ والسؤال الثاني أهم في الانتقال، لأن المؤسسة ستتبادل الملفات مع جهات ما زالت على Microsoft Office سنوات.

ولذلك صنعنا ملفي الاختبار في Word وExcel نفسيهما، أي Microsoft 365 بالإصدار 16.0.20430، عبر أتمتة Office على Windows، حتى يكون الملف كما يصنعه موظف حقيقي وليس كما تصنعه مكتبة برمجية:

  • policy.docx: صفحة سياسة عربية فيها عنوان وفقرات من اليمين لليسار مع أرقام وكلمات إنجليزية، وقائمة مرقمة، وجدول من اليمين لليسار بخلية مدمجة وعناوين مظللة، وحاشية سفلية Footnote، وتعليق Comment، وتتبع تغييرات Track Changes فيه إضافة وحذف، وترويسة بالعربية، وتذييل فيه حقلا رقم الصفحة وعدد الصفحات، وفقرة إنجليزية، وفقرة بخط Traditional Arabic غير الموجود على أي سيرفر Linux.
  • budget.xlsx: ورقة باسم عربي من اليمين لليسار، فيها عنوان مدمج، ومعادلات SUM وAVERAGE وIF بنتيجة عربية وSUMIF وXLOOKUP، وتنسيق عملة ر.س ونسبة مئوية وتاريخ، وتنسيق شرطي Conditional Formatting، وقائمة تحقق Data Validation، وجزء مثبت Frozen Pane، ورسم بياني.

ثم استخدمنا واجهة التحويل في كل محرر، لأنها تمر على المحرك نفسه الذي يفتح الملف ويحفظه، فحولنا كل ملف إلى صيغته نفسها، أي فتح ثم حفظ، وإلى PDF لنرى كيف يرسمه المحرك. وفي Collabora واجهة convert-to طلب واحد:

for f in pdf docx; do
  curl -s -o out/policy-collabora.$f -w "docx->$f %{http_code} %{size_download}B %{time_total}s\n" \
    -F "data=@files/policy.docx" http://127.0.0.1:28101/cool/convert-to/$f
done
docx->pdf 200 73008B 0.813683s
docx->docx 200 19344B 1.099105s
xlsx->pdf 200 36868B 2.676752s
xlsx->xlsx 200 12866B 1.571831s

أما واجهة التحويل في ONLYOFFICE فتطلب رابطاً ينزل منه السيرفر الملف، مع توقيع JWT بالسر نفسه، فكتبنا لها السكربت التالي:

// Calls the ONLYOFFICE conversion API (ConvertService) with a JWT-signed request and saves the result
import { createHmac } from 'node:crypto';
import { writeFileSync } from 'node:fs';
const [file, outType, outPath] = process.argv.slice(2);
const b64 = (o) => Buffer.from(JSON.stringify(o)).toString('base64url');
const body = { async: false, filetype: file.split('.').pop(), outputtype: outType, key: `${file}-${outType}-${Date.now()}`, title: file, url: `http://lab-office-nc/labfiles/${file}` };
const head = b64({ alg: 'HS256', typ: 'JWT' }), pay = b64(body);
const token = `${head}.${pay}.${createHmac('sha256', 'lab-office-jwt-secret-2026-long-value').update(`${head}.${pay}`).digest('base64url')}`;
const t0 = Date.now();
const res = await fetch('http://127.0.0.1:28102/converter', { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ ...body, token }) });
const json = await res.json();
if (!json.fileUrl) { console.log(file, '->', outType, 'error', JSON.stringify(json)); process.exit(1); }
const url = json.fileUrl.replace(/^https?:\/\/[^/]+/, 'http://127.0.0.1:28102');
const buf = Buffer.from(await (await fetch(url)).arrayBuffer());
writeFileSync(outPath, buf);
console.log(`${file} -> ${outType} ${buf.length}B ${((Date.now() - t0) / 1000).toFixed(2)}s`);
policy.docx -> pdf 93835B 8.19s
policy.docx -> docx 28620B 1.11s
budget.xlsx -> pdf 38267B 10.16s
budget.xlsx -> xlsx 12275B 1.16s

ولاحظ أن أول تحويل إلى PDF في ONLYOFFICE أخذ ثماني ثوان وعشراً، لأن المحرك يجهز الخطوط في أول طلب، والطلبات التالية أخذت ثانيتين. وقد وضعنا الملفات في مجلد يقدمه Apache داخل Container Nextcloud حتى يصل إليها ONLYOFFICE، وهذا في المختبر فقط.

ما الذي بقي بعد الفتح والحفظ؟

فتحنا الملفات الناتجة بسكربت Python يقرأ ملفات XML داخل كل DOCX وXLSX ويعد العناصر التي نختبرها:

# Counts the features of the test files that survive a round trip through each engine
import re, sys, zipfile
def docx(p):
    z = zipfile.ZipFile(p); n = z.namelist()
    d = z.read('word/document.xml').decode()
    hf = ''.join(z.read(x).decode() for x in n if re.match(r'word/(header|footer)\d*\.xml', x))
    fn = z.read('word/footnotes.xml').decode() if 'word/footnotes.xml' in n else ''
    cm = z.read('word/comments.xml').decode() if 'word/comments.xml' in n else ''
    return {
        'RTL paragraphs (w:bidi)': len(re.findall(r'<w:bidi(?:\s|/|>)', d)),
        'RTL table (bidiVisual)': len(re.findall(r'<w:bidiVisual', d)),
        'merged cell (gridSpan)': len(re.findall(r'<w:gridSpan', d)),
        'numbered items (numPr)': len(re.findall(r'<w:numPr>', d)),
        'footnotes': len([m for m in re.findall(r'<w:footnote [^>]*>', fn) if 'w:type' not in m]),
        'comments': len(re.findall(r'<w:comment ', cm)),
        'tracked insert text': ''.join(re.findall(r'<w:t[^>]*>([^<]*)</w:t>', ''.join(re.findall(r'<w:ins [^>]*>(.*?)</w:ins>', d)))).strip(),
        'tracked delete text': ''.join(re.findall(r'<w:delText[^>]*>([^<]*)</w:delText>', d)).strip(),
        'PAGE/NUMPAGES fields': ' '.join(sorted(set(re.findall(r'(?:instrText[^>]*>|fldSimple w:instr=")\s*(NUMPAGES|PAGE)[\s"<]', hf)))),
        'Traditional Arabic font': int('Traditional Arabic' in d),
    }
def xlsx(p):
    z = zipfile.ZipFile(p); n = z.namelist()
    wbx = z.read('xl/workbook.xml').decode()
    sh = [x for x in n if re.match(r'xl/worksheets/sheet\d+\.xml', x)][0]
    s = z.read(sh).decode()
    st = z.read('xl/styles.xml').decode()
    return {
        'Arabic sheet name': int('الميزانية' in wbx),
        'RTL sheet (rightToLeft)': int(bool(re.search(r'rightToLeft="(1|true)"', s))),
        'formulas': len(re.findall(r'<f[ >]', s)),
        'XLOOKUP kept': int('XLOOKUP' in s),
        'cached values (<v>)': len(re.findall(r'<v>', s)),
        'currency format ر.س': int('ر.س' in st),
        'conditional formats': len(re.findall(r'<conditionalFormatting', s)),
        'data validation': len(re.findall(r'<dataValidation ', s)),
        'merged cells': len(re.findall(r'<mergeCell ', s)),
        'frozen pane': int('state="frozen"' in s),
        'chart': int(any('charts/chart' in x for x in n)),
    }
files = sys.argv[1:]
f = docx if files[0].endswith('docx') else xlsx
res = [f(p) for p in files]
print('feature'.ljust(28) + ''.join(p.split('/')[-1][:22].ljust(24) for p in files))
for k in res[0]: print(k.ljust(28) + ''.join(str(r[k]).ljust(24) for r in res))
python features.py files/policy.docx out/policy-collabora.docx out/policy-onlyoffice.docx
python features.py files/budget.xlsx out/budget-collabora.xlsx out/budget-onlyoffice.xlsx
feature                     policy.docx             policy-collabora.docx   policy-onlyoffice.docx
RTL paragraphs (w:bidi)     20                      20                      20
RTL table (bidiVisual)      1                       1                       1
merged cell (gridSpan)      1                       1                       1
numbered items (numPr)      3                       3                       3
footnotes                   1                       1                       1
comments                    1                       1                       1
tracked insert text         خلال شهرين              خلال شهرين              خلال شهرين
tracked delete text         تشغيل                   تشغيل                   تشغيل
PAGE/NUMPAGES fields        NUMPAGES PAGE           NUMPAGES PAGE           NUMPAGES PAGE
Traditional Arabic font     1                       1                       1
feature                     budget.xlsx             budget-collabora.xlsx   budget-onlyoffice.xlsx
Arabic sheet name           1                       1                       1
RTL sheet (rightToLeft)     1                       1                       1
formulas                    15                      15                      15
XLOOKUP kept                1                       1                       1
cached values (<v>)         49                      49                      49
currency format ر.س         1                       1                       1
conditional formats         2                       2                       2
data validation             1                       1                       1
merged cells                1                       1                       1
frozen pane                 1                       1                       1
chart                       1                       1                       1

فالمحرران حفظا كل العناصر التي اختبرناها، حتى نص الإضافة والحذف في تتبع التغييرات واسم الخط غير الموجود على السيرفر. وفي النسخة الأولى من السكربت كان عد الحواشي وتتبع التغييرات والحقول في ملف Collabora أكبر من الأصل، فراجعنا XML ووجدنا أن الفرق في طريقة الكتابة وليس في المحتوى: Collabora يرقم الحواشي الفاصلة Separators بأرقام مختلفة، ويقسم الإضافة نفسها على جزأين، وينسخ الترويسة والتذييل للصفحة الأولى والصفحات الزوجية، ولذلك يقارن السكربت النص نفسه وليس عدد الوسوم.

ثم فتحنا الملفات الناتجة في Word وExcel مرة أخرى وصدرناها إلى PDF، فعادت كلها كما كانت تقريباً، والفرقان الوحيدان في ملف Collabora: عبارة GB16 في الجدول، وهي في Word الأصلي تظهر هكذا بسبب الاتجاه، أصبحت 16GB، والحاشية السفلية تغير موضع الرقم فيها، أي أن Collabora أضاف أو غير علامات اتجاه في هذين الموضعين.

كيف يرسم كل محرك الملف نفسه؟

الصورة التالية تضع عرض Word للمستند بجانب PDF الذي أخرجه كل محرك:

ثلاث نسخ من المستند نفسه: Microsoft Word على اليمين، وCollabora Online في الوسط بخط أكبر وأسطر تنكسر في مواضع مختلفة وجدول من اليمين لليسار صحيح، وONLYOFFICE على اليسار بأسطر تشبه Word لكن الجدول معكوس فعمود البند على اليسار وعمود التكلفة على اليمين
من اليمين: Word، ثم Collabora، ثم ONLYOFFICE، للملف نفسه
  • ONLYOFFICE قلب الجدول: الجدول في Word من اليمين لليسار، وعمود البند هو الأول من اليمين، وفي ONLYOFFICE ظهر الجدول من اليسار لليمين، فعمود البند في اليسار وعمود التكلفة في اليمين، مع أن الملف الذي حفظه ONLYOFFICE ما زال يحمل إعداد الجدول من اليمين لليسار كما رأينا في السكربت. وظهر الجدول مقلوباً بالشكل نفسه داخل المحرر في المتصفح، كما سيأتي في الصورة، فهي مشكلة عرض وليست مشكلة حفظ، لكنها أول ما سيلاحظه موظف يفتح جدولاً عربياً.
  • Collabora رسم الجدول صحيحاً، لكن بخطوط مختلفة: PDF الخاص به يستخدم خطوط DejaVu وLiberation وNoto، فالحروف العربية أكبر قليلاً والأسطر تنكسر في مواضع غير مواضع Word، أما ONLYOFFICE فكسر الأسطر في مواضع Word نفسها تقريباً في هذا الملف.
  • الخط غير الموجود: Traditional Arabic استبدله كل محرك بخط آخر، وبقي الاسم محفوظاً في الملف، فإذا فتحه موظف على Windows عاد الخط الأصلي. والحل في المؤسسة أن تعتمد في قوالبها خطوطاً مفتوحة الترخيص مثبتة على السيرفر وعلى أجهزة الموظفين.

وفي ملف Excel كانت النتيجة مختلفة:

ثلاث نسخ من ورقة الميزانية: Excel على اليمين وCollabora في الوسط متطابقان تقريباً بخط عربي واضح، وONLYOFFICE على اليسار بأرقام صحيحة لكن الحروف العربية بخط زخرفي ضعيف الوصل يصعب قراءته في العناوين والبنود
القيم والتنسيقات صحيحة في الثلاثة، والخط العربي في ONLYOFFICE هو الفرق
  • كل القيم المحسوبة صحيحة في المحركين، بما فيها XLOOKUP، والتنسيق الشرطي والعملة والنسبة والتاريخ.
  • Collabora عرض الورقة قريبة جداً من Excel.
  • ONLYOFFICE رسم النص العربي في الخلايا بخط KacstDigital، وهو بديل اختاره المحرك لأن خط الملف Calibri غير موجود، فالحروف متقطعة وصعبة القراءة. وحاولنا إصلاح ذلك بإضافة خطوط Noto Sans Arabic وNoto Naskh Arabic إلى السيرفر ثم تشغيل documentserver-generate-allfonts.sh، والذي أخذ قرابة ست دقائق، فلم يتغير الخط البديل، وعندما غيرنا خط الخلايا إلى Arial ظهرت الخلايا العريضة Bold بخط واضح وبقيت الخلايا العادية على الخط نفسه. فالخلاصة الصادقة أن الملفات المبنية على Calibri، وهو خط Excel الافتراضي، ستظهر بالعربية بهذا الشكل في ONLYOFFICE ما لم تجد حلاً للخطوط، وهذا بند يجب أن تختبره بملفاتك قبل القرار.

الملفات داخل المحررين

والصور التالية من المحررين في المتصفح داخل Nextcloud على مختبرنا، بالملفين نفسيهما:

ملف policy.docx مفتوحاً في Collabora داخل Nextcloud، بشريط أدوات عربي، والترويسة والعنوان والفقرات والقائمة المرقمة وتتبع التغييرات والجدول من اليمين لليسار، والتعليق ظاهر في الهامش الأيسر
Collabora: الجدول من اليمين لليسار والتعليق في الهامش وتتبع التغييرات ظاهر
ملف policy.docx مفتوحاً في ONLYOFFICE داخل Nextcloud بواجهة عربية، والفقرات صحيحة وتتبع التغييرات ظاهر، لكن الجدول معكوس فعمود البند في اليسار وعمود التكلفة في اليمين
ONLYOFFICE: الجدول نفسه يظهر معكوساً داخل المحرر أيضاً
ملف budget.xlsx في Collabora داخل Nextcloud في وضع العرض، والورقة من اليمين لليسار والخط العربي واضح، وفواصل الآلاف تظهر علامة ’ بسبب لغة الواجهة العربية، والرسم البياني تحت الجدول
Collabora: الورقة واضحة، وشكل فاصل الآلاف يتبع لغة الواجهة
ملف budget.xlsx في ONLYOFFICE داخل Nextcloud، والورقة من اليمين لليسار والقيم والتنسيق الشرطي صحيحة، لكن النص العربي في الخلايا والرسم البياني بخط متقطع صعب القراءة، والتاريخ يظهر 01-10-2026
ONLYOFFICE: القيم صحيحة والخط العربي البديل ضعيف

ولاحظ في صورة Collabora للورقة أن فاصل الآلاف ظهر علامة ’ والعلامة العشرية ٫، لأن المتصفح كان بلغة عربية فاتبع المحرر إعدادات تلك اللغة في العرض، والقيم نفسها في الملف لم تتغير، وتستطيع تغيير لغة التنسيق من إعدادات المحرر. وظهر الملف في وضع العرض Viewing لأننا فتحناه بعد جلسة ONLYOFFICE مباشرة وما زال مقفلاً، كما ذكرنا في أخطاء الربط.

الموارد التي استهلكها المختبر

docker stats --no-stream --format '{{.Name}}\t{{.MemUsage}}' | grep lab-office
lab-office-collabora	1001MiB / 31.29GiB
lab-office-onlyoffice	1.365GiB / 31.29GiB
lab-office-nc	439.8MiB / 31.29GiB

وهذا بعد أن فتحنا عدة مستندات وأغلقناها، وليس قياس حمل، فلا تبن عليه عدد المستخدمين، وحجم ال Images بعد التنزيل كان 1.84 جيجابايت لCollabora و4.86 جيجابايت لONLYOFFICE و2.12 جيجابايت لNextcloud. وتذكر من القسم الأول أن الحمل في Collabora يكبر على السيرفر مع كل مستخدم، وفي ONLYOFFICE يتوزع جزء كبير منه على أجهزة المستخدمين.

أيهما تختار؟

Collabora Online

نقاط القوة:

  • عرض صحيح للجدول العربي من اليمين لليسار، وأوراق Excel عربية واضحة في اختبارنا.
  • ترخيص MPL-2.0 دون شروط إضافية، والنسخة المجانية دون حد للاتصالات في الإصدار الذي شغلناه.
  • التحرير من متصفح الجوال متاح.
  • مبني على LibreOffice، فيعمل بصيغ ODF المفتوحة أيضاً، وهو من المحررات التي تعرضها صفحة Nextcloud Office.

نقاط الضعف:

  • كسر الأسطر وحجم الحروف يختلف عن Word بسبب الخطوط المتاحة على السيرفر.
  • غير اتجاه بعض الأرقام والتواريخ في العرض وفي ملف واحد بعد الحفظ.
  • CODE نسخة تطوير شهرية لا ينصح بها المورد للإنتاج، والتحديثات الأمنية المختبرة في الاشتراك.
  • الرسم على السيرفر يجعل حجم السيرفر يكبر مع عدد المستخدمين.

ONLYOFFICE Docs

نقاط القوة:

  • كسر الأسطر وشكل الصفحة أقرب إلى Word في مستند مبني على Arial.
  • واجهة تشبه Microsoft Office، فالتدريب أقل.
  • الرسم في المتصفح يخفف السيرفر ويجعل الكتابة سريعة الاستجابة.
  • حفظ كل العناصر التي اختبرناها، وعادت ملفاته إلى Word كما هي.

نقاط الضعف:

  • الجدول العربي من اليمين لليسار يظهر معكوساً، في المحرر وفي PDF.
  • الخط العربي البديل في ملفات Excel المبنية على Calibri ضعيف، ولم يصلحه تثبيت خطوط Noto.
  • لا يوجد تحرير من متصفح الجوال في نسخة Community.
  • AGPL مع شروط إضافية، وحد العشرين أزيل حديثاً، فأي إصدار قبل 9.4.0 ما زال محدوداً.
حالتكالأنسبوالسبب
مستندات عربية فيها جداول كثيرة، وأوراق Excel عربيةCollaboraعرض الجداول من اليمين لليسار والخط العربي في الأوراق كانا أصح في اختبارنا
موظفون معتادون على Office، ومستندات أغلبها نصوص، وأهمية الشكل المطابق لWordONLYOFFICEالواجهة وكسر الأسطر أقرب إلى Word، بشرط أن تختبر جداولك
تحرير من الجوال دون دفعCollaboraنسخة ONLYOFFICE المجانية لا تشمل محررات الجوال على الويب
جهة تحتاج دعماً وتحديثات أمنية مضمونةالنسخة المدفوعة من أي منهماالنسختان المجانيتان دعمهما في المجتمع

والقاعدة الأهم من الجدول: خذ عشرين ملفاً حقيقياً من مؤسستك، من أكثر الملفات تعقيداً، وافعل بها ما فعلناه هنا، فتحاً وحفظاً وإعادة إلى Word، والسبب أن ملفين للاختبار يكشفان نوع المشكلات، لكن ملفاتك هي التي تحدد أيها يهمك.

حذف المختبر

docker rm -f -v lab-office-nc lab-office-collabora lab-office-onlyoffice
docker network rm lab-office-net
docker rmi nextcloud:35.0.1-apache collabora/code:26.04.4.2.1 onlyoffice/documentserver:9.4.0.1

ولاحظ الخيار -v، فDocker Images الخاصة ب Nextcloud وONLYOFFICE تعلن مجلدات بيانات تنشأ لها Volumes بلا اسم Anonymous Volumes، وبدون هذا الخيار تبقى على القرص بعد حذف ال Containers، وقد نسيناه في المحاولة الأولى فبحثنا عنها بتاريخ إنشائها وحذفناها بأسمائها. ولا تقم بتشغيل أوامر prune العامة على سيرفر عليه خدمات أخرى، والسبب أنها تحذف ما يخص غيرك أيضاً.

الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

  • Collabora يرسم المستند على السيرفر بمحرك LibreOffice ويرسل صوراً، وONLYOFFICE يرسم في المتصفح بمحررات JavaScript، وهذا يحدد الحمل وسلوك الخطوط.
  • CODE بترخيص MPL-2.0 ودون حد للاتصالات في الإصدار 26.04، لكن المورد لا ينصح به للإنتاج، وONLYOFFICE Community بترخيص AGPLv3 مع شروط إضافية، وأزيل حد العشرين في الإصدار 9.4.0، ولا يشمل التحرير من متصفح الجوال.
  • المحرران حفظا كل ما اختبرناه في DOCX وXLSX، من تتبع التغييرات إلى XLOOKUP، وعادت الملفات إلى Word وExcel سليمة تقريباً.
  • في العرض: ONLYOFFICE قلب الجدول العربي ورسم الخط العربي في أوراق Calibri بخط ضعيف، وCollabora عرض الجداول والأوراق صحيحة لكن بكسر أسطر مختلف عن Word.
  • جهز قوالب عربية بفقرات من اليمين لليسار وخطوط مثبتة على السيرفر، واختبر ملفاتك الحقيقية قبل القرار.
دليلبدائل Microsoft 365 وGoogle Workspace مفتوحة المصدرلكل خدمة في Microsoft 365 وGoogle Workspace بديلها المفتوح، مع مدى نضجه وجهد الانتقال إليه ومن أين تبدأ.دليلSeafile: مزامنة ملفات فريقك ومشاركتها على سيرفرككيف تثبت Seafile على سيرفرك لتزامن ملفات فريقك وتشاركها بدل Dropbox وOneDrive، مع نسخة احتياطية تستطيع استعادتها.دليلما هي البرمجيات مفتوحة المصدر؟ القصة وأشهر الرخصكيف بدأت البرمجيات الحرة والمفتوحة، وما الفرق بين الحر والمجاني، وكيف تعرف ما تسمح به رخصة أي مشروع قبل أن تبني عليه.دليلالتقويم وجهات الاتصال على سيرفرك مع CalDAV وCardDAVكيف تبقى مواعيدك وجهات اتصالك متطابقة بين الهاتف والحاسوب على سيرفرك، وما الذي يعمل مع Outlook وما الذي لا يعمل.

سجل التحديثات

  • أكتوبر 2026: كتابة المقال، وتنفيذ المختبر على Nextcloud 35.0.1 مع richdocuments 12.0.1 وonlyoffice 10.2.1 وCollabora CODE 26.04.4.2 وONLYOFFICE Docs 9.4.0، وملفات اختبار صنعت في Word وExcel 16.0.20430.
نشرة عرب رووت | ArabRoot

معرفة تستحق مكاناً في بريدك.

مقالات مختارة وأدوات مفيدة وأفكار لمشروعك القادم، في رسالة واحدة كل أسبوع.

يمكنك إلغاء الاشتراك متى شئت. الخصوصية

تم استلام طلبك. افتح بريدك واضغط رابط التأكيد لإتمام الاشتراك.