التحويل إلى تنسيق الصفحة الثابتة

تطبق Aspose.Words محرك تخطيط الصفحة الخاص بها. قبل الخوض في مواصفاته، من المفيد أولاً مناقشة الوثيقة على مستوى عالٍ. عند التفكير في مستند ما، يتخيل المستخدمون عادةً عددًا من الأوراق الورقية التي تحتوي على كلمات وصور وجداول ومخططات. يمكن أن تكون المستندات من أنواع مختلفة، مثل النصوص وجداول البيانات والشرائح ورسومات CAD والمخططات الانسيابية، وبالتالي يمكن أن تحتوي على تخطيطات مختلفة بشكل أساسي. تسمح معظم التطبيقات بإرسال المستندات إلى الطابعة؛ وذلك عندما يتمكن المستخدم فعليًا من عرض المظهر النهائي المقصود للمستند.

عرض مستند في تطبيقات مختلفة

تتيح تطبيقات عرض المستندات أو نشرها المختلفة للمستخدمين فتح (Adobe Acrobat، XPS Viewer)، وأحيانًا تحرير مستندات (Adobe InDesign) ذات تنسيقات معينة. تنتج هذه التطبيقات عادةً ما يسمى بمستندات تنسيق “الصفحة الثابتة”. يصف تنسيق المستند هذا بدقة مكان وضع محتوى المستند في كل صفحة. داخليًا، يحتوي تنسيق PDF أو XPS على وصف لكل صفحة، بالإضافة إلى تعليمات الرسم، مع تحديد تخطيط المحتوى على الصفحة. يشبه هذا تنسيقات الصور، حيث يصف مكان ظهور المحتوى إما في شكل نقطي أو متجه.

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

تقوم تطبيقات تحرير النصوص الأكثر تعقيدًا بعض الشيء، مثل Microsoft WordPad، بحفظ المستند بتنسيق Rich Text Format (RTF)، الذي يدعم المزيد من وظائف التنسيق، مثل إدراج الصور وتنسيق الأحرف وهوامش الفقرات والتباعد. ومع ذلك، يحتوي تنسيق RTF أيضًا على محتوى المستند فقط، ولا يحتوي على معلومات حول الصفحات.

Microsoft Word هو تطبيق تحرير النصوص الأكثر تقدمًا في Windows اليوم. يقوم بتنسيق الملفات بتنسيق DOCX، الذي يصف محتوى المستند بمرونة وعلى نطاق واسع، مما يسمح للمستخدمين بتحديد حجم الصفحة، واتجاه قسم المستند، وكونه تطبيق WYSIWYG، فإنه يعرض صفحات المستند على الشاشة. ومع ذلك، لا توجد معلومات حتى الآن بخصوص كيفية عرض محتوى المستند على الصفحات المتوفرة في ملف المستند. يصف ملف المستند فقط المحتوى نفسه، وعلاقة كائنات المستند ببعضها البعض، بالإضافة إلى بعض القيود الهندسية. ونتيجة لذلك، قبل عرض المستند، يقوم Microsoft Word بحساب تلك المعلومات بنفسه. هذا هو المكان الذي يلعب فيه تخطيط الصفحة.

ما هو تخطيط الصفحة

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

ينفذ Aspose.Words وظيفة تخطيط الصفحة داخليًا مما يتيح له إنتاج جميع تنسيقات الصفحات الثابتة، مثل PDF وXPS وتنسيقات الصور المتنوعة. بدون تخطيط الصفحة، لن تكون المعلومات المخزنة في ملف مستند الصفحة الثابتة متاحة ولن يتم دعم جميع هذه التنسيقات.

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

إنشاء تخطيط الصفحة

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

  • قد يحتوي المستند على كمية كبيرة من المحتوى، مما قد يلزم عرضه على آلاف الصفحات. يجب وصف هندسة كل كائن في كل صفحة، مما يستهلك موارد الذاكرة.
  • قد تحتوي الوثيقة على العديد من القواعد، مما يضع قيودًا على الشكل الهندسي. يمكن قضاء وقت حسابي كبير، مما يضمن استيفاء كل القيود
  • تقوم بعض ميزات المستند، على سبيل المثال، حقل NUMPAGES، بإنشاء تبعيات متكررة لقيم الخصائص المستقبلية، والتي لا تكون متاحة في وقت الحساب. وهذا يؤدي إلى عمليات حسابية متكررة ويزيد من وقت الحساب.

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

تحويل إلى تنسيق صفحة ثابتة_1

الخصائص غير الهندسية

بالإضافة إلى التعامل مع المعلومات الهندسية، يكون تخطيط الصفحة مسؤولًا أيضًا عن حساب الألوان وأنماط الحدود. في Microsoft Word، يمكن تحديد لون النص تلقائيًا، مما يعني أن اختيار اللون يجب أن يعتمد على لون تظليل الخلية أو الفقرة، أو بناءً على لون الصفحة التي يظهر فيها النص.

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

converting-to-fixed-page-format_2

في Aspose.Words، يمكن للمستخدم أن يطلب ما إذا كان يريد إنشاء تخطيط صفحة جديد، أو تحديث تخطيط موجود. يمكن تنفيذ كلا الأمرين بواسطة طريقة update_page_layout، التي توفرها فئة Document. إذا لم يكن تخطيط الصفحة موجودًا، ولكن هناك حاجة إليه (على سبيل المثال، عند تصدير المستند إلى تنسيق صفحة ثابتة)، فسيستدعي Aspose.Words هذه الطريقة تلقائيًا. ومع ذلك، إذا كان تخطيط الصفحة موجودًا بالفعل، فسيستخدم Aspose.Words التخطيط الموجود لتجنب استهلاك الموارد اللازمة لتحديثه. في هذه الحالة، يحتاج المستخدم إلى استدعاء الأسلوب update_page_layout، للتأكد من أن تخطيط الصفحة محدث مع نموذج المستند.

الهيكل الديناميكي

تتكون عملية إنشاء تخطيط الصفحة من الخطوات التالية:

  • Conversion – تعداد محتوى نموذج المستند وإعداد كائنات التخطيط المقابلة.
  • Build – ترتيب كائنات التخطيط لتمثيل محتوى المستند على الصفحات.
  • Reflow - تحديث ترتيب الكائنات لتلبية القيود الهندسية.
  • إبراز كائنات التخطيط في عرض تقديمي ثابت للصفحة ووضع اللمسات النهائية على معلومات الألوان.
  • إنشاء محتوى الشكل وإعادة تدفقه - خطوة مطلوبة إذا كان المستند يحتوي على أشكال ذات محتوى نصي متداخل.

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

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

عند إنشاء تخطيط، من الممكن أيضًا إعداد خصائص LayoutOptions التي تؤثر على إخراج المستند على الصفحات.

الحفظ في تنسيق الصفحة الثابتة

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

يوضح المثال أدناه كيفية حفظ مستند بتنسيق JPEG باستخدام طريقة save وخيارات العرض:

# Open the document
doc = aw.Document(docs_base.my_dir + "Rendering.docx")
# Save as a JPEG image file with default options
doc.save(docs_base.artifacts_dir + "Rendering.JpegDefaultOptions.jpg")

# Save document to stream as a JPEG with default options
docStream = io.BytesIO()
doc.save(docStream, aw.SaveFormat.JPEG)
# Rewind the stream position back to the beginning, ready for use
docStream.seek(0)

# Save document to a JPEG image with specified options.
# Render the third page only and set the JPEG quality to 80%
# In this case we need to pass the desired SaveFormat to the ImageSaveOptions constructor 
# to signal what type of image to save as.
imageOptions = aw.saving.ImageSaveOptions(aw.SaveFormat.JPEG)
imageOptions.page_index = 2
imageOptions.page_count = 1
imageOptions.jpeg_quality = 80
doc.save(docs_base.artifacts_dir + "Rendering.JpegCustomOptions.jpg", imageOptions)