مقدمة غير رسمية لـ DOCX
نشرت: 2022-03-11مع وجود ما يقرب من مليار شخص يستخدمون Microsoft Office ، فإن تنسيق DOCX هو المعيار الواقعي الأكثر شيوعًا لتبادل ملفات المستندات بين المكاتب. أقرب منافس لها - تنسيق ODT - مدعوم فقط من قبل Open / LibreOffice وبعض المنتجات مفتوحة المصدر ، مما يجعله بعيدًا عن المعيار. تنسيق PDF ليس منافسًا لأن ملفات PDF لا يمكن تحريرها ولا تحتوي على هيكل مستند كامل ، لذلك يمكنهم فقط إجراء تغييرات محلية محدودة مثل العلامات المائية والتوقيعات وما شابه. هذا هو سبب إنشاء معظم مستندات الأعمال بتنسيق DOCX ؛ لا يوجد بديل جيد ليحل محله.
على الرغم من أن تنسيق DOCX معقد ، فقد ترغب في تحليله يدويًا للقيام بمهام أبسط مثل الفهرسة والتحويل إلى TXT وإجراء تعديلات صغيرة أخرى. أود أن أقدم لك معلومات كافية عن DOCX الداخلية حتى لا تضطر إلى الرجوع إلى مواصفات ECMA ، وهو دليل ضخم يبلغ 5000 صفحة.
أفضل طريقة لفهم التنسيق هي إنشاء مستند بسيط من كلمة واحدة باستخدام MSWord ومراقبة كيفية تغيير المستند إلى XML الأساسي. ستواجه بعض الحالات التي لا يتم فيها تنسيق DOCX بشكل صحيح في MS Word ولا تعرف السبب ، أو تصادف حالات لا يكون من الواضح فيها كيفية إنشاء التنسيق المطلوب. رؤية وفهم ما يحدث بالضبط في XML سيساعد في ذلك.
عملت لمدة عام تقريبًا في محرر DOCX التعاوني ، CollabOffice ، وأريد مشاركة بعض هذه المعرفة مع مجتمع المطورين. في هذه المقالة سأشرح بنية ملف DOCX ، وتلخيص المعلومات المنتشرة عبر الإنترنت. هذه المقالة هي وسيط بين مواصفات ECMA الضخمة والمعقدة ودروس الإنترنت البسيطة المتاحة حاليًا. يمكنك العثور على الملفات المصاحبة لهذه المقالة في مشروع toptal-docx
على حساب github الخاص بي.
ملف DOCX بسيط
ملف DOCX هو أرشيف مضغوط لملفات XML. إذا أنشأت مستند Microsoft Word جديدًا وفارغًا ، فاكتب كلمة واحدة "اختبار" بداخله وفك ضغط محتوياته ، فسترى بنية الملف التالية:
على الرغم من أننا أنشأنا مستندًا بسيطًا ، فقد أدت عملية الحفظ في Microsoft Word إلى إنشاء سمات افتراضية وخصائص المستند وجداول الخطوط وما إلى ذلك بتنسيق XML.
للبدء ، دعنا نزيل العناصر غير المستخدمة ونركز على document.xml
، الذي يحتوي على عناصر النص الرئيسي. عند حذف ملف ، تأكد من حذف كافة مراجع العلاقة إليه من ملفات xml الأخرى. فيما يلي مثال على فرق التعليمات البرمجية حول كيفية مسح التبعيات إلى app.xml و core.xml. إذا كان لديك أي مراجع لم يتم حلها / مفقودة ، فسيعتبر MSWord أن الملف تالف.
إليك هيكل مستند DOCX المبسط والبسيط (وهنا المشروع على جيثب):
دعنا نقسمها حسب الملف من هنا ، من الأعلى:
_ برميل /
يحدد هذا المرجع الذي يخبر MS Word بمكان البحث عن محتويات المستند. في هذه الحالة ، يشير إلى word/document.xml
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> <Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/> </Relationships>
_براميل / document.xml.rels
يحدد هذا الملف مراجع الموارد ، مثل الصور ، المضمنة في محتوى المستند. لا يحتوي مستندنا البسيط على موارد مضمنة ، لذا فإن علامة العلاقة فارغة:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> </Relationships>
[أنواع_المحتوى] .xml
[Content_Types].xml
على معلومات حول أنواع الوسائط داخل المستند. نظرًا لأن لدينا محتوى نصيًا فقط ، فالأمر بسيط جدًا:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/> <Default Extension="xml" ContentType="application/xml"/> <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/> </Types>
document.xml
أخيرًا ، إليك XML الرئيسي مع محتوى نص المستند. لقد قمت بإزالة بعض إعلانات مساحة الاسم من أجل الوضوح ، ولكن يمكنك العثور على النسخة الكاملة من الملف في مشروع github. ستجد في هذا الملف أن بعض مراجع مساحة الاسم في المستند غير مستخدمة ، لكن لا يجب حذفها لأن MS Word يحتاج إليها.
إليك مثالنا المبسط:
<w:document> <w:body> <w:pw:rsidR="005F670F" w:rsidRDefault="005F79F5"> <w:r><w:t>Test</w:t></w:r> </w:p> <w:sectPr w:rsidR="005F670F"> <w:pgSz w:w="12240" w:h="15840"/> <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/> <w:cols w:space="720"/> <w:docGrid w:linePitch="360"/> </w:sectPr> </w:body> </w:document>
تمثل العقدة الرئيسية <w:document>
المستند نفسه ، ويحتوي <w:body>
على فقرات ، ويتم تضمينها ضمن <w:body>
وهي أبعاد الصفحة المحددة بواسطة <w:sectPr>
.
<w:rsidR>
هي سمة يمكنك تجاهلها ؛ يتم استخدامه بواسطة MS Word internals.
لنلقِ نظرة على مستند أكثر تعقيدًا من ثلاث فقرات. لقد قمت بتمييز XML بنفس الألوان على لقطة الشاشة من Microsoft Word ، حتى تتمكن من رؤية الارتباط:
<w: pw: rsidR = "0081206C" w: rsidRDefault = "00E10CAE"> <w: r> <w: t xml: space = "save"> هذا هو المثال الأول لدينا. تكون المحاذاة الافتراضية إلى اليسار ، والآن أود تقديم </ w: t> </ w: r> <w: r> <w: rPr> <w: rFonts w: ascii = "Arial" w: hAnsi = "Arial" w: cs = "Arial" /> <w: color w: val = "000000" /> </ w: rPr> <w: t> غامق بعض الشيء </ w: t> </ w: r> <w: r> <w: rPr> <w: rFonts w: ascii = "Arial" w: hAnsi = "Arial" w: cs = "Arial" /> <w: b /> <w: color w: val = "000000" /> </ w: rPr> <w: t xml: space = "calling"> نص </ w: t> </ w: r> <w: r> <w: rPr> <w: rFonts w: ascii = "Arial" w: hAnsi = "Arial" w: cs = "Arial" /> <w: color w: val = "000000" /> </ w: rPr> <w: t xml: space = "calling"> ، </ w: t> </ w: r> <w: proofErr w: type = "gramStart" /> <w: r> <w: t xml: space = "save"> وقم أيضًا بتغيير </ w: t> </ w: r> <w: rw: rsidRPr = "00E10CAE"> <w: rPr> <w: rFonts w: ascii = "Impact" w: hAnsi = "Impact" /> </ w: rPr> <w: t> نمط الخط </ w: t> </ w: r> <w: r> <w: rPr> <w: rFonts w: ascii = "Impact" w: hAnsi = "Impact" /> </ w: rPr> <w: t xml: space = "save"> </ w: t> </ w: r> <w: r> <w: t> إلى "التأثير". </ w: t> </ w: r> </ w: p> <w: pw: rsidR = "00E10CAE" w: rsidRDefault = "00E10CAE"> <w: r> <w: t> هذه فقرة جديدة. </ w: t> </ w: r> </ w: p > <w: pw: rsidR = "00E10CAE" w: rsidRPr = "00E10CAE" w: rsidRDefault = "00E10CAE"> <w: r> <w: t> هذه فقرة أخرى أطول قليلاً. </ w: t> </ w: r> </ w: p>
هيكل الفقرة
يتكون المستند البسيط من فقرات ، وتتكون الفقرة من سلاسل (سلسلة من النص بنفس الخط واللون وما إلى ذلك) ، وتتألف عمليات التشغيل من أحرف (مثل <w:t>
). قد تحتوي العلامات <w:t>
على عدة أحرف بداخلها ، وقد يكون هناك عدد قليل منها في نفس التشغيل.
مرة أخرى ، يمكننا تجاهل <w:rsidR>
.
خصائص النص
خصائص النص الأساسية هي الخط والحجم واللون والنمط وما إلى ذلك. هناك حوالي 40 علامة تحدد مظهر النص. كما ترى في المثال المكون من ثلاث فقرات ، كل تشغيل له خصائصه الخاصة داخل <w:rPr>
، مع تحديد <w:color>
، <w:rFonts>
والجرأة <w:b>
.
الشيء المهم الذي يجب ملاحظته هو أن الخصائص تميز بين مجموعتي الأحرف ، النص العادي والمعقد (العربية ، على سبيل المثال) ، وأن الخصائص لها علامة مختلفة اعتمادًا على نوع الحرف الذي تؤثر عليه.
تحتوي معظم علامات خصائص البرنامج النصي العادية على علامة نصية معقدة متطابقة مع "C" مضافة تحدد الخاصية للنصوص المعقدة. على سبيل المثال: <w:i>
(مائل) يصبح <w:iCs>
، وتصبح العلامة الغامقة للنص العادي <w:b>
<w:bCs>
للنص البرمجي المعقد.
الأنماط
يوجد شريط أدوات كامل في Microsoft Word مخصص للأنماط: عادي ، بدون مسافات ، العنوان 1 ، العنوان 2 ، العنوان ، وما إلى ذلك. يتم تخزين هذه الأنماط في /word/styles.xml
(ملاحظة: في الخطوة الأولى في مثالنا البسيط ، أزلنا XML هذا من DOCX. اصنع DOCX جديدًا لرؤية هذا).
بمجرد تحديد النص كنمط ، ستجد مرجعًا لهذا النمط داخل علامة خصائص الفقرة ، <w:pPr>
. إليك مثال حيث قمت بتعريف النص الخاص بي باستخدام النمط العنوان 1:
<w:p> <w:pPr> <w:pStyle w:val="Heading1"/> </w:pPr> <w:r> <w:t>My heading 1</w:t> </w:r> </w:p>
وهذا هو النمط نفسه من styles.xml
:
<w:style w:type="paragraph" w:style> <w:name w:val="heading 1"/> <w:basedOn w:val="Normal"/> <w:next w:val="Normal"/> <w:link w:val="Heading1Char"/> <w:uiPriority w:val="9"/> <w:qFormat/> <w:rsid w:val="002F7F18"/> <w:pPr> <w:keepNext/> <w:keepLines/> <w:spacing w:before="480" w:after="0"/> <w:outlineLvl w:val="0"/> </w:pPr> <w:rPr> <w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/> <w:b/> <w:bCs/> <w:color w:val="365F91" w:themeColor="accent1" w:themeShade="BF"/> <w:sz w:val="28"/> <w:szCs w:val="28"/> </w:rPr> </w:style>
يحدد <w:style/w:rPr/w:b>
xpath أن الخط غامق ، <w:style/w:rPr/w:color>
إلى لون الخط. <w:basedOn>
MSWord لاستخدام النمط "عادي" لأي خصائص مفقودة.
وراثة الممتلكات
يتم توريث خصائص النص. للتشغيل خصائصه الخاصة ( w:p/w:r/w:rPr/*
) ، لكنه يرث أيضًا الخصائص من الفقرة ( w:r/w:pPr/*
) ، ويمكن لكليهما الإشارة إلى خصائص النمط من /word/styles.xml
.
<w:r> <w:rPr> <w:rStyle w:val="DefaultParagraphFont"/> <w:sz w:val="16"/> </w:rPr> <w:tab/> </w:r>
تبدأ الفقرات والتشغيل بالخصائص الافتراضية: w:styles/w:docDefaults/w:rPrDefault/*
و w:styles/w:docDefaults/w:pPrDefault/*
. للحصول على النتيجة النهائية لخصائص الشخصية ، يجب عليك:

- استخدم خصائص التشغيل / الفقرة الافتراضية
- إلحاق خصائص نمط التشغيل / الفقرة
- إلحاق خصائص تشغيل / فقرة محلية
- إلحاق خصائص تشغيل النتيجة على خصائص الفقرة
عندما أقول "إلحاق" B بـ A ، أعني تكرار جميع خصائص B وتجاوز جميع خصائص A ، وترك جميع الخصائص غير المتقاطعة كما هي.
هناك مكان آخر يمكن أن توجد فيه الخصائص الافتراضية في العلامة <w:style>
مع w:type="paragraph"
و w:default="1"
. لاحظ أن الأحرف نفسها داخل تشغيل لا يكون لها أبدًا نمط افتراضي ، لذا فإن <w:style w:type="character" w:default="1">
لا يؤثر فعليًا على أي نص.
1554402290400-dbb29eef3ba6035df7ad726dfc99b2af.png)
تبديل الخصائص
بعض الخصائص هي خصائص "تبديل" ، مثل <w:b>
(غامق) أو <w:i>
(مائل) ؛ تتصرف هذه السمات مثل عامل تشغيل XOR.
هذا يعني أنه إذا كان النمط الأصلي غامقًا وكان الجري الفرعي غامقًا ، فستكون النتيجة نصًا عاديًا غير غامق.
عليك القيام بالكثير من الاختبارات والهندسة العكسية للتعامل مع سمات التبديل بشكل صحيح. ألق نظرة على الفقرة 17.7.3 من مواصفات ECMA-376 Open XML للحصول على القواعد الرسمية والمفصلة لخصائص التبديل /
الخطوط
تتبع الخطوط نفس القواعد العامة لسمات النص الأخرى ، ولكن يتم تحديد القيم الافتراضية لخاصية الخط في ملف سمة منفصل ، تتم الإشارة إليه ضمن word/_rels/document.xml.rels
مثل هذا:
<Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
استنادًا إلى المرجع أعلاه ، سيتم العثور على اسم الخط الافتراضي في word/theme/themes1.xml
، داخل علامة <a:theme>
، a:themeElements/a:fontScheme/a:majorFont
أو a:minorFont
tag.
حجم الخط الافتراضي هو 10 ما لم تكن علامة w:docDefaults/w:rPrDefault
مفقودة ، فيكون حجم الخط 11.
محاذاة النص
يتم تحديد محاذاة النص بواسطة علامة <w:jc>
مع توفر أربعة أوضاع w:val
: "left"
و "center"
و "right"
و "both"
.
"left"
هو الوضع الافتراضي ؛ يبدأ النص على يسار مستطيل الفقرة (عادةً ما يكون عرض الصفحة). (تتم محاذاة هذه الفقرة إلى اليسار ، وهو معيار.)
وضع "center"
، كما هو متوقع ، يقوم بتوسيط جميع الأحرف داخل عرض الصفحة. (مرة أخرى ، تمثل هذه الفقرة المحاذاة المركزية.)
في الوضع "right"
، تتم محاذاة نص الفقرة إلى الهامش الأيمن. (لاحظ كيف يتم محاذاة هذا النص إلى الجانب الأيمن.)
يضع وضع "both"
مسافات إضافية بين الكلمات بحيث تصبح الأسطر أوسع وتشغل عرض الفقرة بالكامل ، باستثناء السطر الأخير الذي تم محاذاته إلى اليسار. (هذه الفقرة دليل على ذلك).
الصور
يدعم DOCX نوعين من الصور: مضمنة وعائمة.
تظهر الصور المضمنة داخل فقرة مع الأحرف الأخرى ، يتم استخدام <w:drawing>
بدلاً من استخدام <w:t>
(نص). يمكنك العثور على معرف الصورة باستخدام بناء جملة xpath التالي:
w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip/@r:embed
يُستخدم معرف الصورة للبحث عن اسم الملف في ملف word/_rels/document.xml.rels
، ويجب أن يشير إلى ملف gif / jpeg داخل المجلد الفرعي word / media. (راجع ملف word/_rels/document.xml.rels
الخاص بمشروع جيثب ، حيث يمكنك رؤية معرّف الصورة.)
يتم وضع الصور العائمة بالنسبة للفقرات التي يتدفق النص حولها. (إليك نموذج مستند مشروع جيثب مع صورة عائمة.)
تستخدم الصور العائمة <wp:anchor>
بدلاً من <w:drawing>
، لذلك إذا قمت بحذف أي نص بالداخل <w:p>
، كن حذرًا مع المراسي إذا كنت لا تريد إزالة الصور.
الجداول
علامات XML للجداول مشابهة لترميز جدول HTML– يتطابق مع <tr> ، إلخ.
<w:tbl>
، يحتوي الجدول نفسه ، على خصائص الجدول <w:tblPr>
، ويتم تقديم كل خاصية عمود بواسطة <w:gridCol>
داخل <w:tblGrid>
. تتبع الصفوف واحدة تلو الأخرى مثل العلامات <w:tr>
ويجب أن يحتوي كل صف على نفس عدد الأعمدة كما هو محدد في <w:tblGrid>
:
<w:tbl> <w:tblPr> <w:tblW w:w="5000" w:type="pct" /> </w:tblPr> <w:tblGrid><w:gridCol/><w:gridCol/></w:tblGrid> <w:tr> <w:tc><w:p><w:r><w:t>left</w:t></w:r></w:p></w:tc> <w:tc><w:p><w:r><w:t>right</w:t></w:r></w:p></w:tc> </w:tr> </w:tbl>
يمكن تحديد عرض أعمدة الجدول في علامة <w:tblW>
، ولكن إذا لم تحددها ، فسيستخدم MS Word خوارزمياته الداخلية للعثور على العرض الأمثل للأعمدة لأصغر حجم جدول فعال.
الوحدات
تحدد العديد من سمات XML داخل DOCX الأحجام أو المسافات. على الرغم من أنها أعداد صحيحة داخل XML ، إلا أنها تحتوي على وحدات مختلفة لذا يلزم إجراء بعض التحويل. الموضوع معقد ، لذا أوصي بهذا المقال بقلم لارس كورنيليوسن حول الوحدات في ملفات DOCX. الجدول الذي يقدمه مفيد ، على الرغم من وجود خطأ بسيط في الطباعة: يجب أن تكون البوصة pt / 72 ، وليس pt * 72.
هنا ورقة الغش:
تحويلات وحدة DOCX XML المشتركة | ||||||
عشرين نقطة | نقاط DXA / 20 | بوصة نقطة / 72 | سم في * 2،54 | حجم الخط نصف نقطة / 144 | EMU في * 914400 | |
مثال | 11906 | 595.3 | 8،27 ... | 21.00086 ... | 4،135 | 7562088 |
العلامات باستخدام هذا | pgSz / pgMar / w: التباعد | w: sz | wp: مدى ، أ: تحويلة |
تلميحات حول تنفيذ Layouter
إذا كنت تريد تحويل ملف DOCX (إلى PDF ، على سبيل المثال) ، أو رسمه على قماش ، أو حساب عدد الصفحات ، فسيتعين عليك تنفيذ مخطط. المخطط هو خوارزمية لحساب مواضع الأحرف من ملف DOCX.
هذه مهمة معقدة إذا كنت بحاجة إلى عرض دقيق بنسبة 100 بالمائة. يتم قياس مقدار الوقت اللازم لتنفيذ مخطط جيد بالسنوات البشرية ، ولكن إذا كنت تحتاج فقط إلى واحد بسيط ومحدود ، فيمكن القيام بذلك بسرعة نسبيًا.
يملأ المخطط مستطيلًا رئيسيًا ، والذي يكون عادةً مستطيلاً من الصفحة. تضيف كلمات من سباق واحد تلو الآخر. عندما يفيض الخط الحالي ، فإنه يبدأ بخط جديد. إذا كانت الفقرة عالية جدًا بالنسبة للمستطيل الأصل ، يتم لفها إلى الصفحة التالية.
فيما يلي بعض الأشياء المهمة التي يجب وضعها في الاعتبار إذا قررت تنفيذ جهاز التوجيه:
- يجب أن يهتم المخطط بمحاذاة النص والنص العائم فوق الصور
- يجب أن يكون قادرًا على التعامل مع الكائنات المتداخلة ، مثل الجداول المتداخلة
- إذا كنت ترغب في تقديم دعم كامل لمثل هذه الصور ، فسيتعين عليك تنفيذ مخطط مع تمريرين على الأقل ، تجمع الخطوة الأولى مواضع الصور العائمة وتملأ الثانية مساحة فارغة بأحرف نصية.
- انتبه إلى المسافات البادئة والتباعد. تحتوي كل فقرة على مسافات قبل وبعد ، ويتم تحديد هذه الأرقام بواسطة علامة
w:spacing
. يتم تحديد التباعد الرأسي بواسطة العلاماتw:after
وw:before
. لاحظ أن تباعد الأسطر محدد بـw:line
، لكن هذا ليس حجم السطر كما قد يتوقعه المرء. للحصول على حجم الخط ، خذ ارتفاع الخط الحالي ، واضربه فيw:line
ثم اقسم على 12. - لا تحتوي ملفات DOCX على معلومات حول ترقيم الصفحات. لن تجد عدد الصفحات في المستند إلا إذا قمت بحساب مقدار المساحة التي تحتاجها لكل سطر للتأكد من عدد الصفحات. إذا كنت بحاجة إلى العثور على إحداثيات دقيقة لكل حرف على الصفحة ، فتأكد من مراعاة جميع المسافات والمسافات البادئة والأحجام.
- إذا قمت بتطبيق مخطط DOCX كامل الميزات يتعامل مع الجداول ، فلاحظ الحالات الخاصة عندما تمتد الجداول عبر صفحات متعددة. الخلية التي تتسبب في تجاوز الصفحة تؤثر أيضًا على الخلايا الأخرى.
- يعد إنشاء خوارزمية مثالية لحساب عرض أعمدة الجدول مشكلة رياضية صعبة وعادة ما تستخدم معالجات النصوص والمخططات بعض عمليات التنفيذ دون المستوى الأمثل. أقترح استخدام الخوارزمية من وثائق جدول W3C HTML كتقريب أولي. لم أجد وصفًا للخوارزمية المستخدمة بواسطة MS Word ، وقد قامت Microsoft بضبط الخوارزمية بمرور الوقت ، لذا قد تقوم إصدارات مختلفة من Word بوضع جداول بشكل مختلف قليلاً.
إذا كان هناك شيء غير واضح: إجراء هندسة عكسية لـ XML!
عندما لا يكون من الواضح كيف تعمل علامة XML هذه أو تلك داخل MS Word ، فهناك طريقتان رئيسيتان لمعرفة ذلك:
قم بإنشاء المحتوى المطلوب خطوة بخطوة. ابدأ بملف docx بسيط. احفظ كل خطوة في ملفها الخاص ، مثل
1.docx
،2.docx
، على سبيل المثال. قم بفك ضغط كل منها واستخدم أداة مقارنة مرئية لمقارنة المجلدات لمعرفة العلامات التي تظهر بعد تغييراتك. (بالنسبة للخيار التجاري ، جرب Araxis Merge أو WinMerge كخيار مجاني.)إذا أنشأت ملف DOCX لا يحبه برنامج MS Word ، فاعمل بشكل عكسي. تبسيط XML الخاص بك خطوة بخطوة. في مرحلة ما سوف تتعرف على التغيير الذي وجدته MS Word غير صحيح.
DOCX معقد للغاية ، أليس كذلك؟
إنه معقد ، ويحظر ترخيص Microsoft استخدام MS Word على جانب الخادم لمعالجة DOCX - وهذا معيار جدًا للمنتجات التجارية. ومع ذلك ، قدمت Microsoft ملف XSLT للتعامل مع معظم علامات DOCX ، لكنها لن تمنحك دقة بنسبة 100 في المائة أو حتى 99 في المائة. لا يتم دعم العمليات مثل التفاف النص فوق الصور ، ولكن ستتمكن من دعم غالبية المستندات. (إذا لم تكن بحاجة إلى التعقيد ، ففكر في استخدام Markdown كبديل.)
إذا كانت لديك ميزانية كافية (لا يوجد محرك عرض DOCX مجاني) ، فقد ترغب في استخدام منتجات تجارية مثل Aspose أو docx4j. الحل المجاني الأكثر شيوعًا هو LibreOffice للتحويل بين DOCX والتنسيقات الأخرى ، بما في ذلك PDF. لسوء الحظ ، يحتوي LibreOffice على العديد من الأخطاء الصغيرة أثناء التحويل ، وبما أنه منتج C ++ معقد ومفتوح المصدر ، فإنه بطيء ويصعب إصلاح مشكلات الدقة.
بدلاً من ذلك ، إذا وجدت أن تخطيط DOCX معقد للغاية بحيث لا يمكنك تنفيذه بنفسك ، فيمكنك أيضًا تحويله إلى HTML واستخدام متصفح لعرضه. يمكنك أيضًا التفكير في أحد مطوري XML المستقلين في Toptal.
موارد DOCX لمزيد من القراءة
- مواصفات ECMA DOCX
- مكتبة OpenXML لمعالجة DOCX من C #. لا يحتوي على معلومات حول التخطيط أو عرض التعليمات البرمجية ، ولكنه يقدم تسلسلاً هرميًا للفئة يطابق كل عقدة XML ممكنة في DOCX.
- يمكنك دائمًا البحث أو السؤال عن stackoverflow باستخدام كلمات رئيسية مثل docx4j و OpenXML و docx ؛ هناك أشخاص في المجتمع على دراية.