จัดการกล่องข้อความในงานนำเสนอใน .NET

บทนำ

ใน Aspose.Slides for .NET ข้อความบนสไลด์จะถูกเก็บไว้ในกรอบข้อความที่เป็นส่วนหนึ่งของรูปร่าง อินเทอร์เฟซ IAutoShape แสดงถึงรูปร่างที่มีข้อความบ่อยที่สุดและเปิดเผยข้อความของมันผ่านคุณสมบัติ IAutoShape.TextFrame。

สร้างกล่องข้อความบนสไลด์

เพื่อสร้างกล่องข้อความ ให้เพิ่มรูปร่างอัตโนมัติลงในสไลด์ เพิ่มข้อความในกรอบข้อความของมัน และบันทึกพรีเซนเทชัน ตัวอย่างต่อไปนี้สร้างกล่องข้อความสี่เหลี่ยมผืนผ้า:

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 จะวัดเป็นหน่วย point. 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.

เพิ่มคอลัมน์ให้กับกล่องข้อความ

คุณสมบัติ ITextFrameFormat.ColumnCount แบ่งกรอบข้อความเป็นคอลัมน์ ส่วน ITextFrameFormat.ColumnSpacing ตั้งค่าระยะห่างระหว่างคอลัมน์เป็นหน่วย point การตั้งค่าสองอย่างนี้เป็นส่วนของ ITextFrameFormat และสามารถเปลี่ยนได้ผ่านกรอบข้อความของกล่องข้อความที่มีอยู่แล้ว ข้อความจะไหลใหม่ระหว่างคอลัมน์ภายในรูปร่างเดียวกัน; จะไม่ต่อไปยังรูปร่างอื่น

ตัวอย่างต่อไปนี้สร้างกล่องข้อความสามคอลัมน์โดยมีระยะห่าง 10 point ระหว่างคอลัมน์, บันทึกพรีเซนเทชัน, และอ่านการตั้งค่าที่เก็บไว้จากไฟล์ผลลัพธ์:

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 เพื่อดึงข้อความที่กำหนดให้แต่ละคอลัมน์ที่มองเห็นได้ในกรอบข้อความที่มีอยู่ วิธีการนี้คืนค่า string หนึ่งสำหรับแต่ละคอลัมน์ตามลำดับการอ่านแบบคอลัมน์ กรอบข้อความแบบคอลัมน์เดียวจะผลิตอาเรย์ที่มีองค์ประกอบหนึ่ง และคอลัมน์ที่ว่างเปล่าจะเป็นสตริงว่าง ข้อความที่คืนมาจะเป็นข้อความธรรมดาเท่านั้น; การจัดรูปแบบระดับส่วนจะไม่ถูกเก็บรักษา

สิ่งนี้มีประโยชน์เมื่อคุณต้องการ:

  • สกัดข้อความพร้อมคงลำดับการอ่านแบบคอลัมน์
  • ทำดัชนีหรือเปรียบเทียบเนื้อหาของสไลด์หลายคอลัมน์
  • ส่งออกแต่ละคอลัมน์เป็นไฟล์แยก, ฟิลด์ฐานข้อมูล, หรือเป้าหมายอื่น
  • ตรวจสอบว่าข้อความถูกกระจายใหม่อย่างไรหลังจากเปลี่ยน 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 กล่องข้อความธรรมดาเป็นรูปร่างอิสระบนสไลด์ที่สร้างขึ้นและจะไม่รับพฤติกรรมของ placeholder เมื่อตัวแบบมีการเปลี่ยนแปลง

ฉันจะทำอย่างไรเพื่อตัวแทนข้อความโดยไม่เปลี่ยนข้อความในแผนภูมิ, ตาราง, หรือ SmartArt?

จำกัดการวนเพียงรูปร่างที่ทำการ implements IAutoShape ตามที่แสดงในตัวอย่างอัปเดตข้อความ แผนภูมิ, ตาราง, และ SmartArt เก็บข้อความในโมเดลออบเจกต์ของตัวเอง ดังนั้นพวกมันจะไม่ถูกแก้ไขโดยลูปนั้น