Sunumlarda .NET ile Metin Kutularını Yönetme
Giriş
Aspose.Slides for .NET’te slayt metni, şekillere ait metin çerçevelerinde depolanır. IAutoShape arayüzü en yaygın metin içeren şekli temsil eder ve metnini IAutoShape.TextFrame özelliği aracılığıyla ortaya çıkar.
Note
Her otomatik şekil IShape arayüzünü uygular, ancak her şekil bir otomatik şekil değildir ve bir metin çerçevesini desteklemeyebilir. Mevcut bir sunumu işlerken, metnine erişmeden önce şeklinIAutoShape arayüzünü uyguladığını kontrol edin.
Bir Slaytta Metin Kutusu Oluşturma
Bir metin kutusu oluşturmak için slayta bir otomatik şekil ekleyin, metin çerçevesine metin ekleyin ve sunumu kaydedin. Aşağıdaki örnek dikdörtgen bir metin kutusu oluşturur:
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‘a geçirilen koordinatlar ve boyutlar nokta cinsindendir. IAutoShape.AddTextFrame metin çerçevesini verilen metinle başlatır.
Metin Kutusu Şekli İçin Kontrol
AutoShape.IsTextBox özelliğini kullanarak bir otomatik şeklin metin kutusu olarak kabul edilip edilmediğini belirleyebilirsiniz. Bu, bir sunumun hem metin içeren hem de yalnızca grafiksel otomatik şekiller içermesi durumunda faydalıdır.

Aşağıdaki örnek bir sunumdaki her otomatik şekli inceler:
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.");
}
}
}
Yeni eklenen bir otomatik şekil, içinde boş olmayan bir metin bulunana kadar metin kutusu olarak değerlendirilmez. Bu metni IAutoShape.AddTextFrame veya ITextFrame.Text aracılığıyla sağlayabilirsiniz. Boş bir dize eklemek veya atamak, IsTextBox değerinin false kalmasına neden olur:
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);
İlk iki çağrı True, son iki çağrı False yazdırır.
Metin Çerçevesine Sahip Şekli Bulma
Genel bir metin işleme kodu, hangi sunum nesnesinin içinde olduğunu bilmeden bir ITextFrame alabilir. Sahibi olan IShape nesnesine geri dönmek için yalnızca okunabilir olan ITextFrame.ParentShape özelliğini kullanın.
Bir metin çerçevesi bir otomatik şekil ya da başka bir metin içeren şekil tarafından sahiplenildiğinde, ParentShape sahibi içerir ve ITextFrame.ParentCell null olur. Erişmeden önce döndürülen değeri kontrol edin. Şekil ve tablo hücresi sahiplerini, SmartArt düğümleriyle ilişkili şekilleri de tanımlamak için Search and Replace Text bölümüne bakın.
Şeklin Metin Dikdörtgenini Al
Aspose.Slides for .NET 26.11 sürümünden itibaren, ITextFrame.GetTextRect ana şeklin geometrisi tarafından tanımlanan metin alanını döndürür. Koordinatları ve boyutları nokta cinsindendir ve o şeklin sol‑üst köşesine göre görecelidir. Örneğin, bir elips dış sınırlarından daha küçük bir metin dikdörtgenine sahiptir.
Bu dikdörtgen şekli tanımlar, işlenen karakterleri değil. Metni ya da metin‑çerçeve kenar boşluklarını değiştirmek, onu doldurulan metnin ölçümü haline getirmez. İşlenen metin ölçümleri için paragraph bounds veya portion bounds kullanın.
Aspose.Slides for .NET 26.11 veya sonraki sürümünü kurduktan sonra, bu örneği çalıştırarak geometrinin metin dikdörtgenini kırmızı olarak çizin. Şekiller döndürülmemiş ve gruplandırılmamış olduğundan, X/Y konumlarını eklemek, bindirmeyi slayta yerleştirmek için yeterlidir.
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);
Yukarıdaki 200 × 100 noktalık şekiller için dikdörtgen (0, 0, 200, 100) döndürür; elips yaklaşık olarak (29.289, 14.645, 141.421, 70.711) döndürür. Yöntem ayrıca özel bir geometrinin bildirilen metin dikdörtgenini okur. Slayt‑alanı dönüşleri veya grup dönüşümlerini uygulamaz; bindirme konumlandırılırken bunları ayrı olarak hesaba katın. Geometri şekli olmayan bir metin çerçevesi (ör. tablo‑hücre metin çerçevesi) InvalidOperationException hatası oluşturabilir.
Metin Kutusuna Sütun Ekleme
ITextFrameFormat.ColumnCount özelliği metin çerçevesini sütunlara böler, ITextFrameFormat.ColumnSpacing ise sütunlar arasındaki boşluğu nokta cinsinden ayarlar. Her iki ayar da ITextFrameFormat içinde yer alır ve mevcut bir metin kutusunun metin çerçevesi üzerinden değiştirilebilir. Metin aynı şekil içinde sütunlar arasında akış sağlar; başka bir şekle geçmez.
Aşağıdaki örnek, sütunlar arasında 10 nokta boşlukla üç sütunlu bir metin kutusu oluşturur, sunumu kaydeder ve ayarları çıktıyı dosyasından geri okur:
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");
Tek Tek Sütunlardan Metin Çıkarma
TextFrame.SplitTextByColumns yöntemini kullanarak mevcut bir metin çerçevesindeki her görsel sütuna atanmış metni alabilirsiniz. Yöntem her sütun için bir dize döndürür; sütun‑tabanlı okuma sırasına göre. Tek sütunlu bir metin çerçevesi bir elemanlı bir dizi üretir, boş bir sütun ise boş dize ile temsil edilir. Dönüş değerleri yalnızca düz metin içerir; bölüm‑seviyesi biçimlendirme korunmaz.
Bu, aşağıdaki durumlarda faydalıdır:
- Metni, sütun‑tabanlı okuma sırasını koruyarak çıkarmak.
- Çok sütunlu slaytların içeriğini indekslemek veya karşılaştırmak.
- Her sütunu ayrı bir dosyaya, veritabanı alanına veya başka bir hedefe aktarmak.
- ITextFrameFormat.ColumnCount, ITextFrameFormat.ColumnSpacing, yazı tipini veya metin‑çerçeve boyutunu değiştirdikten sonra metnin nasıl yeniden dağıtıldığını incelemek.
Yöntem, mevcut ITextFrame içinde dağıtılan metni raporlar; ayrı şekiller ya da metin kutuları arasında otomatik akış sağmaz. Sütun dağılımı kullanılabilir yazı tiplerine ve diğer metin‑dizayn ayarlarına bağlı olabilir; tutarlı sonuçların önemli olduğu durumlarda gerekli yazı tiplerinin mevcut olduğundan emin olun.
Aşağıdaki örnek bir sunumu yükler, metin çerçevesi olan ilk çok‑sütunlu otomatik şekli bulur, yapılandırılmış sütun sayısını okur ve her sütunun metnini ayrı bir dosyaya yazar. Metin çerçevesi sağlamayan şekiller atlanır.
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);
}
}
Metni Güncelleme
Bir sunumdaki tüm metni güncellemek için slaytları ve şekilleri döngüye alın, otomatik şekilleri seçin ve ardından metin bölümlerini düzenleyin. Bölüm seviyesinde çalışmak, hem metni hem de karakter biçimlendirmesini değiştirmenize olanak tanır.
Aşağıdaki örnek, otomatik‑şekil metnindeki her years ifadesini months ile değiştirir ve etkilenen her bölümü kalın yapar:
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);
Bu geçiş yalnızca otomatik şekillerdeki metni günceller. Tablolarda, grafiklerde, SmartArt’ta veya gruplandırılmış şekillerde saklanan metin, ilgili nesnelerin kendi koleksiyonları üzerinden dolaşılmasını gerektirir.
Bir Metin Kutusuna Köprü Ekleme
Bir köprü, yalnızca belirli bir metin bölümüne atanabilir; böylece sadece o metin tıklanabilir bir bağlantı olur. Bölümü dış URL’ye bağlamak için IHyperlinkManager.SetExternalHyperlinkClick yöntemini kullanın.
Aşağıdaki örnek, bağlantılı metin oluşturur ve bir sunuma kaydeder:
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);
SSS
Bir ana / yerleşim slaytındaki metin kutusu ile metin yer tutucusu arasındaki fark nedir?
Bir yer tutucu konum ve biçimlendirmesini bir ana slayttan veya yerleşim slaytından miras alabilir. Normal bir metin kutusu, oluşturulduğu slaytta bağımsız bir şekildir ve yerleşim değiştiğinde yer tutucu davranışı kazanmaz.
Grafiklerde, tablolarda veya SmartArt’ta metni değiştirmeden metni nasıl değiştirebilirim?
Metin güncelleme örneğinde gösterildiği gibi gezinmeyi yalnızca IAutoShape uygulayan şekillerle sınırlayın. Grafikler, tablolar ve SmartArt, kendi nesne modellerinde metin depolar; bu döngü onları değiştirmez.