إدارة صناديق النص في العروض التقديمية في .NET
المقدمة
في Aspose.Slides for .NET، يتم تخزين نص الشريحة في إطارات نصية تنتمي إلى الأشكال. تمثل الواجهة IAutoShape الشكل الأكثر شيوعًا الذي يحمل نصًا وتكشف نصه عبر الخاصية IAutoShape.TextFrame.
ملاحظة
كل شكل تلقائي ينفذ IShape، لكن ليس كل شكل هو شكل تلقائي أو يدعم إطار نص. عند معالجة عرض تقديمي موجود، تحقق من أن الشكل ينفذIAutoShape قبل الوصول إلى نصه.
إنشاء صندوق نص على شريحة
لإنشاء صندوق نص، أضف شكلاً تلقائيًا إلى شريحة، أضف نصًا إلى إطار نصه، واحفظ العرض التقديمي. المثال التالي ينشئ صندوق نص مستطيل:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var textBox = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 150, 75, 300, 50);
textBox.AddTextFrame("Aspose TextBox");
presentation.Save("TextBox.pptx", SaveFormat.Pptx);
الإحداثيات والأبعاد التي تم تمريرها إلى IShapeCollection.AddAutoShape تُقاس بالنقاط. IAutoShape.AddTextFrame يُهيئ إطار النص بالنص المقدم.
التحقق من شكل صندوق النص
استخدم خاصية AutoShape.IsTextBox لتحديد ما إذا كان الشكل التلقائي يُعامل كصندوق نص. هذا مفيد عندما يحتوي العرض التقديمي على أشكال تلقائية تحمل نصًا وأخرى رسومية بحتة.

المثال التالي يفحص كل شكل تلقائي في عرض تقديمي:
using System;
using Aspose.Slides;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var textBox = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 10, 120, 40);
textBox.AddTextFrame("Text box");
slide.Shapes.AddAutoShape(ShapeType.Ellipse, 150, 10, 40, 40);
foreach (var currentSlide in presentation.Slides)
{
foreach (var shape in currentSlide.Shapes)
{
if (shape is IAutoShape autoShape)
{
Console.WriteLine(autoShape.IsTextBox ? "The shape is a text box." : "The shape is not a text box.");
}
}
}
لا يُعتبر الشكل التلقائي المضاف حديثًا صندوق نص حتى يحتوي على نص غير فارغ. يمكنك توفير ذلك النص عبر IAutoShape.AddTextFrame أو ITextFrame.Text. إضافة أو تعيين سلسلة فارغة يترك IsTextBox مضبوطة على false:
using System;
using Aspose.Slides;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape1 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 10, 100, 40);
shape1.AddTextFrame("Shape 1");
Console.WriteLine(shape1.IsTextBox);
var shape2 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 70, 100, 40);
shape2.TextFrame.Text = "Shape 2";
Console.WriteLine(shape2.IsTextBox);
var shape3 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 130, 100, 40);
shape3.AddTextFrame("");
Console.WriteLine(shape3.IsTextBox);
var shape4 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 190, 100, 40);
shape4.TextFrame.Text = "";
Console.WriteLine(shape4.IsTextBox);
النداءان الأوليان يطبعان True؛ الأخيران يطبعان False.
العثور على الشكل الذي يمتلك إطار نص
قد يتلقى كود معالجة النص العام كائنًا من نوع ITextFrame دون معرفة أي كائن عرض تقديمي يحتويه. استخدم الخاصية للقراءة فقط ITextFrame.ParentShape للعودة إلى الشكل المالكة IShape.
بالنسبة لإطار نص مملوك لشكل تلقائي أو شكل آخر يحمل نصًا، يحتوي ParentShape على المالك وتكون ITextFrame.ParentCell null. تحقق من القيمة المرجعة قبل الوصول إليها. لتحديد كل من مالكي الشكل وخلايا الجدول، بما في ذلك الأشكال المرتبطة بعقد SmartArt، انظر Search and Replace Text.
الحصول على مستطيل نص الشكل
بدءًا من Aspose.Slides for .NET 26.11، تُعيد الدالة ITextFrame.GetTextRect مساحة النص المحددة بواسطة هندسة الشكل الأب. إحداثياتها وأبعادها بالنقاط،相 بالنسبة إلى الزاوية اليسرى العليا لذلك الشكل. على سبيل المثال، تكون للمقوس مستطيل نص أصغر من حدودها الخارجية.
هذا المستطيل يصف الشكل، وليس الأحرف المُرسَمة. تغيير النص أو هوامش إطار النص لا يجعله قياسًا للنص المحتل. استخدم paragraph bounds أو portion bounds لقياسات النص المُرسَم.
بعد installing Aspose.Slides for .NET 26.11 أو أحدث، شغِّل هذا المثال لرسم مستطيل نص الهندسة باللون الأحمر. الأشكال غير مُدوَّرة وغير مُجمَّعة، لذا إضافة موضع X/Y يكفي لوضع التراكب على الشريحة.
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
foreach (var shapeType in new[] { ShapeType.Rectangle, ShapeType.Ellipse })
{
var x = shapeType == ShapeType.Rectangle ? 50 : 300;
var shape = slide.Shapes.AddAutoShape(shapeType, x, 200, 200, 100);
shape.AddTextFrame("Text area");
var rectangle = shape.TextFrame.GetTextRect();
Console.WriteLine($"{shapeType}: {rectangle}");
var overlayX = shape.X + rectangle.X;
var overlayY = shape.Y + rectangle.Y;
var outline = slide.Shapes.AddAutoShape(ShapeType.Rectangle, overlayX, overlayY, rectangle.Width, rectangle.Height);
outline.FillFormat.FillType = FillType.NoFill;
outline.LineFormat.FillFormat.FillType = FillType.Solid;
outline.LineFormat.FillFormat.SolidFillColor.Color = Color.Red;
}
presentation.Save("text-rectangles.pptx", SaveFormat.Pptx);
بالنسبة للأشكال ذات 200 × 100 نقطة أعلاه، يُعيد المستطيل (0, 0, 200, 100)؛ ويُعيد المقوس تقريبًا (29.289, 14.645, 141.421, 70.711). الطريقة تقرأ أيضاً مستطيل النص المعلن لهندسة مخصصة. لا تُطبّق دوران مساحة الشريحة أو تحويلات المجموعة؛ احسب هذه التحويلات منفصلًا عند تموضع التراكب. قد يلقي إطار نص بدون شكل هندسي، مثل إطار نص خلية جدول، استثناء InvalidOperationException.
إضافة أعمدة إلى صندوق النص
خاصية ITextFrameFormat.ColumnCount تقسم إطار النص إلى أعمدة، بينما خاصية ITextFrameFormat.ColumnSpacing تُحدد الفجوة بين الأعمدة بالنقاط. كلا الإعدادين ينتميان إلى ITextFrameFormat ويمكن تعديلهما عبر إطار النص في صندوق نص موجود. يعاد تدفق النص بين الأعمدة داخل نفس الشكل؛ ولا يتواصل إلى شكل آخر.
المثال التالي ينشئ صندوق نص بثلاثة أعمدة مع 10 نقاط بين الأعمدة، يحفظ العرض التقديمي، ويقرأ الإعدادات المخزنة من ملف الإخراج:
using System;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var textBox = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 300, 200);
textBox.AddTextFrame("This text is distributed automatically across all columns in the text box.");
var textFrameFormat = textBox.TextFrame.TextFrameFormat;
textFrameFormat.ColumnCount = 3;
textFrameFormat.ColumnSpacing = 10;
presentation.Save("TextBoxColumns.pptx", SaveFormat.Pptx);
using var savedPresentation = new Presentation("TextBoxColumns.pptx");
var savedTextBox = (IAutoShape)savedPresentation.Slides[0].Shapes[0];
var savedFormat = savedTextBox.TextFrame.TextFrameFormat;
Console.WriteLine($"Columns: {savedFormat.ColumnCount}; spacing: {savedFormat.ColumnSpacing} points");
استخراج النص من الأعمدة الفردية
استخدم الدالة TextFrame.SplitTextByColumns لاسترجاع النص المعين لكل عمود بصري في إطار نص موجود. تُعيد الدالة سلسلة واحدة لكل عمود، بترتيب القراءة حسب الأعمدة. ينتج إطار نص بعمود واحد مصفوفة بعنصر واحد، والعمود الفارغ يُمثَّل بسلسلة فارغة. تحتوي السلاسل على نص عادي فقط؛ لا يُحافظ على تنسيق المستوى الجزئي.
هذا مفيد عندما تحتاج إلى:
- استخراج النص مع الحفاظ على ترتيب القراءة حسب الأعمدة.
- فهرسة أو مقارنة محتوى الشرائح متعددة الأعمدة.
- تصدير كل عمود إلى ملف منفصل أو حقل قاعدة بيانات أو وجهة أخرى.
- فحص كيفية إعادة توزيع النص بعد تغيير ITextFrameFormat.ColumnCount، ITextFrameFormat.ColumnSpacing، الخط، أو حجم إطار النص.
تُبلغ الطريقة النص الموزَّع داخل ITextFrame الحالي؛ ولا تُعيد تدفق النص تلقائيًا بين أشكال أو صناديق نص منفصلة. قد يعتمد توزيع الأعمدة على الخطوط المتوفرة وإعدادات تخطيط النص الأخرى، لذا تأكد من توفر الخطوط المطلوبة عندما تكون النتائج المتسقة مهمة.
المثال التالي يحمل عرضًا تقديميًا، يجد أول شكل تلقائي متعدد الأعمدة يحتوي على إطار نص، يقرأ عدد الأعمدة المكوَّن، ويكتب نص كل عمود إلى ملف منفصل. تُهمل الأشكال التي لا توفر إطار نص.
using System;
using System.IO;
using Aspose.Slides;
using var presentation = new Presentation("MultiColumnText.pptx");
IAutoShape? textBox = null;
foreach (var shape in presentation.Slides[0].Shapes)
{
if (shape is IAutoShape autoShape && autoShape.TextFrame is not null)
{
var columnCount = autoShape.TextFrame.TextFrameFormat.ColumnCount;
if (columnCount > 1)
{
textBox = autoShape;
break;
}
}
}
if (textBox is null)
{
Console.WriteLine("No multi-column text frame was found.");
}
else
{
var textFrame = textBox.TextFrame;
var configuredColumnCount = textFrame.TextFrameFormat.ColumnCount;
var columnTexts = textFrame.SplitTextByColumns();
Console.WriteLine($"Configured columns: {configuredColumnCount}");
for (var columnIndex = 0; columnIndex < columnTexts.Length; columnIndex++)
{
var columnNumber = columnIndex + 1;
var columnText = columnTexts[columnIndex];
Console.WriteLine($"Column {columnNumber}: {columnText}");
File.WriteAllText($"Column-{columnNumber}.txt", columnText);
}
}
تحديث النص
لتحديث النص في جميع أنحاء العرض التقديمي، قم بالتكرار عبر الشرائح والأشكال، اختر الأشكال التلقائية، ثم حرّر أجزاء نصها. العمل على مستوى الجزء يتيح لك تغيير كل من النص وتنسيق الأحرف.
المثال التالي يستبدل كل ظهور لكلمة years بـ months في نص الشكل التلقائي ويجعل كل جزء متأثر غامقًا:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("Text.pptx");
foreach (var slide in presentation.Slides)
{
foreach (var shape in slide.Shapes)
{
if (shape is not IAutoShape autoShape)
{
continue;
}
foreach (var paragraph in autoShape.TextFrame.Paragraphs)
{
foreach (var portion in paragraph.Portions)
{
portion.Text = portion.Text.Replace("years", "months");
portion.PortionFormat.FontBold = NullableBool.True;
}
}
}
}
presentation.Save("TextChanged.pptx", SaveFormat.Pptx);
هذا الاستعراض يُحدّث النص فقط في الأشكال التلقائية. النص المخزن في الجداول أو المخططات أو SmartArt أو الأشكال المجمَّعة يتطلب استعراض مجموعات تلك الكائنات الخاصة.
إضافة صندوق نص مع ارتباط تشعبي
يمكن تعيين ارتباط تشعبي إلى جزء نص معين، بحيث يكون فقط ذلك النص هو الرابط القابل للنقر. استخدم IHyperlinkManager.SetExternalHyperlinkClick لربط الجزء بعنوان URL خارجي.
المثال التالي يُنشئ نصًا مرتبطًا ويحفظه إلى عرض تقديمي:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var textBox = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 150, 150, 200, 50);
textBox.AddTextFrame("Aspose.Slides");
var textPortion = textBox.TextFrame.Paragraphs[0].Portions[0];
textPortion.PortionFormat.HyperlinkManager.SetExternalHyperlinkClick("https://www.aspose.com/");
presentation.Save("Hyperlink.pptx", SaveFormat.Pptx);
الأسئلة الشائعة
ما الفرق بين صندوق النص وعناصر النائب النصي على شريحة رئيسية أو تخطيطية؟
يمكن لعناصر placeholder أن تورث موقعها وتنسيقها من master slide أو layout slide. صندوق النص العادي هو شكل مستقل على الشريحة التي تم إنشاؤه فيها ولا يكتسب سلوك العنصر النائب عندما يتغير التخطيط.
كيف يمكنني استبدال النص دون تغيير النص في المخططات أو الجداول أو SmartArt؟
قصر الاستعراض على الأشكال التي تنفذ IAutoShape، كما هو موضح في مثال تحديث النص. تخزن المخططات والجداول وSmartArt النص في نماذج كائناتها الخاصة، لذا لا يتم تعديلها بهذه الحلقة.