كيفية إضافة أشكال الرسم إلى مستندات Word في .NET
يوضح هذا الدليل كيفية إضافة محتوى إلى طبقة الرسم في مستند Word باستخدام Aspose.Words FOSS لـ .NET: إدراج AutoShape، إضافة صورة، تحديد موقعها وتغليف النص حولها، تعبئتها وتنسيقها، تجميع عدة أشكال، وتعيين علامة مائية. Aspose.Words FOSS لـ .NET متاح عبر NuGet أو عبر البناء من المصدر.
دليل خطوة بخطوة
الخطوة 1: الحصول على المكتبة
استنساخ المستودع وبنائه Aspose.Words.sln في تكوين Release، ثم أضف إشارة مشروع إلى Aspose.Words.csproj من مشروعك .NET الخاص، كما هو موضح في الـ دليل التثبيت. أضف using Aspose.Words; and using Aspose.Words.Drawing; في أعلى أي ملف يعمل مع الأشكال.
الخطوة 2: إضافة AutoShape
قم بإنشاء شكل مباشرة باستخدام new Shape(doc, shapeType)، حيث أن shapeType هي قيمة ShapeType مثل Rectangle، Ellipse، Star أو TextBox، ثم أدخلها في الشجرة باستخدام DocumentBuilder.InsertNode(node). Shape هي الفئة الملموسة والمختومة التي تقوم بإنشائها وتكوينها؛ وهي مشتقة من الفئة التجريدية ShapeBase، التي تُعرّف الموضع (Left، Top، Width، Height، Rotation) وكائنات التنسيق الفرعية (Fill، Stroke، ShadowFormat، Glow، Reflection) المشتركة مع GroupShape.
الخطوة 3: إضافة صورة
DocumentBuilder.InsertImage هو المسار المباشر للصور: التحميلات الزائدة تقبل Image، مسار ملف، Stream، أو مصفوفة بايتات خام، مع تحميلات إضافية تأخذ width/height صريحة أو معاملات تموضع كاملة (horzPos، left، vertPos، top، width، height، wrapType). خاصية ImageData في Shape الناتج تحتفظ ببيانات الصورة — استدعِ ImageData.SetImage(...) لتبديل الصورة، واستخدم CropTop/CropBottom/CropLeft/CropRight، Brightness، Contrast، وGrayScale لضبط الأساسيات.
الخطوة 4: وضع الشكل وتغليف النص
الشكل المتضمن (النتيجة الافتراضية لـ InsertImage) يتدفق مع النص المحيط ويتجاهل خصائص التموقع حتى يطفو — تحقق من IsInline لتأكيد الوضع الذي يكون فيه الشكل. لجعل الشكل يطفو، اضبط WrapType على قيمة غير متضمنة واضبط RelativeHorizontalPosition / RelativeVerticalPosition (كل منها بالنسبة إلى Page، Margin، Column، أو مرساة مماثلة) مع إزاحات Left/Top. يتحكم WrapSide في التغليف حسب الجوانب، وHorizontalAlignment / VerticalAlignment يتعاملان مع محاذاة نسبية بسيطة بدلًا من الإزاحات الصريحة.
الخطوة 5: تعبئة وتنسيق الشكل
Shape.Fill (كائن Fill) يرسم داخل الشكل: Fill.Solid(color) للون ثابت، Fill.OneColorGradient(...) / Fill.TwoColorGradient(...) للتدرجات، Fill.Patterned(patternType) للنمط، وFill.SetImage(...) لتعبئة بصورة — FillType يحدد أي منها نشط حاليًا. الحد الخارجي يأتي من خاصية Stroke. بالنسبة للتأثيرات، فإن ShadowFormat، Glow (GlowFormat)، Reflection (ReflectionFormat)، وSoftEdge (SoftEdgeFormat) كل منها يكشف عن إعداداته الخاصة وطريقة Remove() التي تمسح التأثير لتعود إلى لا شيء.
الخطوة 6: تجميع أشكال متعددة
جمع عدة أشكال في وحدة واحدة باستخدام DocumentBuilder.InsertGroupShape(shapes)، الذي يُعيد GroupShape. GroupShape هو نفسه ShapeBase، لذا يحمل Fill، ShadowFormat، Glow، وReflection الخاصة به والتي تُطبق على المجموعة ككل؛ حرك أو غيّر حجم GroupShape بدلاً من أطفاله الفردية حتى يبقى تحويل إحداثيات المجموعة ثابتًا. بالنسبة لشكل يحمل نصًا، Shape.TextBox (كائن TextBox) يتحكم في الحشو (InternalMarginLeft/Right/Top/Bottom)، التحجيم التلقائي (FitShapeToText)، اتجاه النص (LayoutFlow)، والمحاذاة العمودية (VerticalAnchor).
الخطوة 7: إضافة علامة مائية
Document.Watermark يدير علامة مائية واحدة على مستوى المستند تكون مستقلة عن أي شكل قمت بإدخاله يدويًا. استدعِ Watermark.SetText(text) أو SetText(text, options) للحصول على علامة مائية نصية، أو SetImage(...) للحصول على علامة مائية صورة؛ Watermark.Remove() يمسحها، وWatermark.Type يُبلغ عن WatermarkType الحالي (Text، Image أو None). TextWatermarkOptions يحدد FontFamily، FontSize، Color، وLayout (WatermarkLayout.Horizontal أو Diagonal)؛ ImageWatermarkOptions يحدد Scale وIsWashout.
المشكلات الشائعة والحلول
Setting Left/Top على الشكل لا يُحدث أي تأثير مرئي. لا يزال الشكل مضمنًا (IsInline == true). تعيين WrapType إلى قيمة عائمة وعيّن RelativeHorizontalPosition/RelativeVerticalPosition لكي تُفعَّل خصائص الإزاحة.
Shape.ImageData يُرمى أو لا يُعيد شيئًا. الشكل ليس شكل صورة. تحقق Shape.HasImage قبل القراءة ImageData.
أشكال الأطفال في مجموعة لا تتحرك معًا. تم إعادة وضع الأطفال بشكل فردي بدلاً من خلال المجموعة. حرّك أو غير حجم GroupShape نفسه بحيث ينطبق تحويل إحداثياته على كل عنصر فرعي.
نص العلامة المائية لا يستخدم الخط المطلوب. لا TextWatermarkOptions تم تمريره. استدعِ Watermark.SetText(text, options) مع TextWatermarkOptions مثيل الذي FontFamily مُعَيَّن.
الأسئلة المتكررة
ما الفرق بين Shape و ShapeBase؟
ShapeBase هو الفئة الأساسية المجردة المشتركة بين Shape و GroupShape. اكتب الكود مقابل ShapeBase عندما يجب أن يتعامل مع أيٍ من النوعين بشكل موحد؛ استخدم Shape مباشرةً للأعضاء الخاصة بكائن رسم واحد، مثل ImageData.
كيف يمكنني إدراج صورة بحجم محدد؟
استخدم تحميلًا زائدًا لـ DocumentBuilder.InsertImage يقبل معاملات صريحة لـ width و height، إلى جانب مصدر الصورة (Image، مسار ملف، Stream، أو مصفوفة بايت).
كيف أجعل الشكل يطفو بدلاً من أن يكون مدمجًا مع النص؟
قم بتعيين WrapType إلى قيمة غير مدمجة واضبط RelativeHorizontalPosition / RelativeVerticalPosition بحيث يتم تفسير إزاحات Left/Top بالنسبة إلى الصفحة أو الهامش أو العمود.
هل يمكن للمستند أن يحتوي على علامة مائية نصية وصورية في الوقت نفسه؟
رقم Document.Watermark.Type يُبلغ عن نوع العلامة المائية الحالية؛ استدعاء SetText أو SetImage مرة أخرى يُستبدل أي علامة مائية تم تعيينها مسبقًا.
كيف يمكنني إزالة الظل أو الانعكاس من شكل؟
استدعِ Remove() على كائن التنسيق المقابل — Shape.ShadowFormat.Remove() أو Shape.Reflection.Remove().