Python via Java Kullanarak Sunumlarda Metin Kutularını Yönetme

Giriş

Aspose.Slides for Python via Java’da, slayt metni şekillere ait metin çerçevelerinde depolanır. AutoShape sınıfı en yaygın metin içeren şekli temsil eder ve metnini AutoShape.getTextFrame yöntemiyle ortaya çıkarır.

Bir Slaytta Metin Kutusu Oluşturma

Bir metin kutusu oluşturmak için bir slayta otomatik şekil ekleyin, metin çerçevesine metin ekleyin ve sunumu kaydedin. Aşağıdaki örnek dikdörtgen bir metin kutusu oluşturur:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    text_box = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 75, 300, 50)
    text_box.addTextFrame("Aspose TextBox")

    presentation.save("TextBox.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

ShapeCollection.addAutoShape yöntemine geçirilen koordinat ve boyutlar nokta biriminde ölçülür. AutoShape.addTextFrame verilen metinle metin çerçevesini başlatır.

Metin Kutusu Şekli Kontrolü

Bir otomatik şeklin metin kutusu olarak ele alınıp alınmadığını belirlemek için AutoShape.isTextBox yöntemini kullanın. Bu, bir sunumda hem metin içeren hem de yalnızca grafiksel otomatik şekiller bulunduğunda yararlıdır.

Bir metin kutusu ve bir şekil

Aşağıdaki örnek bir sunumdaki tüm otomatik şekilleri inceler:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import AutoShape, Presentation, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    text_box = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 120, 40)
    text_box.addTextFrame("Text box")
    slide.getShapes().addAutoShape(ShapeType.Ellipse, 150, 10, 40, 40)

    for current_slide in presentation.getSlides():
        for shape in current_slide.getShapes():
            if isinstance(shape, AutoShape):
                print("The shape is a text box." if shape.isTextBox() else "The shape is not a text box.")
finally:
    presentation.dispose()

Yeni eklenen bir otomatik şekil, içinde boş olmayan metin bulunmadıkça metin kutusu olarak değerlendirilmez. Bu metni AutoShape.addTextFrame veya TextFrame.setText aracılığıyla sağlayabilirsiniz. Boş bir dize eklemek veya atamak, AutoShape.isTextBox metodunun False döndürmesine yol açar:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    added_text_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 40)
    added_text_shape.addTextFrame("Shape 1")
    print(added_text_shape.isTextBox())

    assigned_text_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 70, 100, 40)
    assigned_text_shape.getTextFrame().setText("Shape 2")
    print(assigned_text_shape.isTextBox())

    added_empty_text_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 130, 100, 40)
    added_empty_text_shape.addTextFrame("")
    print(added_empty_text_shape.isTextBox())

    assigned_empty_text_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 190, 100, 40)
    assigned_empty_text_shape.getTextFrame().setText("")
    print(assigned_empty_text_shape.isTextBox())
finally:
    presentation.dispose()

İlk iki çağrı True, son iki çağrı ise False yazdırır.

Metin Çerçevesine Sahip Şekli Bulma

Genel metin işleme kodu, hangi sunum nesnesinin içinde olduğunu bilmeden bir TextFrame alabilir. Sahibi olan Shape nesnesine geri dönmek için yalnızca‑okunur TextFrame.getParentShape yöntemini kullanın.

Otomatik şekil ya da başka bir metin içeren şekil tarafından sahip olunan bir metin çerçevesi için TextFrame.getParentShape sahibi döndürür ve TextFrame.getParentCell None döndürür. Erişmeden önce döndürülen değeri kontrol edin. Hem şekil hem de tablo‑hücre sahiplerini, SmartArt düğümleriyle ilişkilendirilen şekilleri tanımlamak için Search and Replace Text bölümüne bakın.

Metin Kutusuna Sütun Ekleme

TextFrameFormat.setColumnCount yöntemi metin çerçevesini sütunlara böler, TextFrameFormat.setColumnSpacing ise sütunlar arasındaki boşluğu nokta biriminde ayarlar. Her iki ayar da TextFrameFormat sınıfına aittir ve mevcut bir metin kutusunun metin çerçevesi üzerinden değiştirilebilir. Metin aynı şekil içinde sütunlar arasında yeniden akar; başka bir şekle devam etmez.

Aşağıdaki örnek, sütunlar arası 10 nokta boşlukla üç sütunlu bir metin kutusu oluşturur, sunumu kaydeder ve ayarları çıktı dosyasından geri okur:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    text_box = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 200)
    text_box.addTextFrame("This text is distributed automatically across all columns in the text box.")

    text_frame_format = text_box.getTextFrame().getTextFrameFormat()
    text_frame_format.setColumnCount(3)
    text_frame_format.setColumnSpacing(10)

    presentation.save("TextBoxColumns.pptx", SaveFormat.Pptx)

    saved_presentation = Presentation("TextBoxColumns.pptx")
    try:
        saved_text_box = saved_presentation.getSlides().get_Item(0).getShapes().get_Item(0)
        saved_format = saved_text_box.getTextFrame().getTextFrameFormat()
        print(f"Columns: {saved_format.getColumnCount()}; spacing: {saved_format.getColumnSpacing()} points")
    finally:
        saved_presentation.dispose()
finally:
    presentation.dispose()

Tek Tek Sütunlardan Metin Çıkarma

Mevcut bir metin çerçevesinde her görsel sütuna atanmış metni almak için TextFrame.splitTextByColumns yöntemini kullanın. Yöntem, sütun‑tabanlı okuma sırasına göre her sütun için bir dize döndürür. Tek‑sütunlu bir metin çerçevesi bir elemanlı bir dizi üretirken, boş bir sütun boş bir dizeyle temsil edilir. Dize yalnızca düz metin içerir; bölüm‑seviye biçimlendirme korunmaz.

Bu, aşağıdaki durumlarda kullanışlıdır:

  • Metni, sütun‑tabanlı okuma sırasını koruyarak çıkarma.
  • Çok‑sütunlu slaytların içeriğini indeksleme veya karşılaştırma.
  • Her sütunu ayrı bir dosyaya, veritabanı alanına veya başka bir hedefe aktarma.
  • TextFrameFormat.setColumnCount, TextFrameFormat.setColumnSpacing, font veya metin‑çerçevesi boyutu gibi ayarları değiştirdikten sonra metnin nasıl yeniden dağıtıldığını inceleme.

Yöntem, mevcut TextFrame içinde dağıtılan metni rapor eder; ayrı şekiller veya metin kutuları arasında otomatik akış oluşturmaz. Sütun dağılımı kullanılabilir fontlar ve diğer metin‑dizayn ayarlarına bağlı olabilir; tutarlı sonuçların önemli olduğu durumlarda gerekli fontların 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.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from pathlib import Path
from asposeslides.api import AutoShape, Presentation

presentation = Presentation("MultiColumnText.pptx")
try:
    text_box = None
    for shape in presentation.getSlides().get_Item(0).getShapes():
        if isinstance(shape, AutoShape):
            if shape.getTextFrame() is not None:
                column_count = shape.getTextFrame().getTextFrameFormat().getColumnCount()
                if column_count > 1:
                    text_box = shape
                    break

    if text_box is None:
        print("No multi-column text frame was found.")
    else:
        text_frame = text_box.getTextFrame()
        configured_column_count = text_frame.getTextFrameFormat().getColumnCount()
        column_texts = text_frame.splitTextByColumns()

        print(f"Configured columns: {configured_column_count}")

        for column_number, column_text in enumerate(column_texts, start=1):
            print(f"Column {column_number}: {column_text}")
            output_path = Path(f"Column-{column_number}.txt")
            try:
                output_path.write_text(str(column_text), encoding="utf-8")
            except OSError as exception:
                print(f"Could not write column {column_number}: {exception}")
finally:
    presentation.dispose()

Metni Güncelleme

Bir sunumda metni güncellemek için slaytları ve şekilleri yineleyin, 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:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import AutoShape, NullableBool, Presentation, SaveFormat

presentation = Presentation("Text.pptx")
try:
    for slide in presentation.getSlides():
        for shape in slide.getShapes():
            if not isinstance(shape, AutoShape):
                continue

            text_frame = shape.getTextFrame()
            if text_frame is None:
                continue

            for paragraph in text_frame.getParagraphs():
                for portion in paragraph.getPortions():
                    text = portion.getText()
                    if text is not None and "years" in str(text):
                        portion.setText(str(text).replace("years", "months"))
                        portion.getPortionFormat().setFontBold(NullableBool.True_)

    presentation.save("TextChanged.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Bu gezinme yalnızca otomatik şekillerdeki metni günceller. Tablolar, grafikler, SmartArt veya gruplanmış şekillerde depolanan metin, bu nesnelerin kendi koleksiyonlarının yinelemesini gerektirir.

Bağlantılı Bir Metin Kutusu Ekleme

Bir bağlantı, belirli bir metin bölümüne atanabilir; böylece yalnızca o metin tıklanabilir bağlantı haline gelir. Bölümü harici bir URL ile ilişkilendirmek için HyperlinkManager.setExternalHyperlinkClick metodunu kullanın.

Aşağıdaki örnek bağlantılı metin oluşturur ve bir sunuma kaydeder:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    text_box = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 200, 50)
    text_box.addTextFrame("Aspose.Slides")

    text_portion = text_box.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0)
    text_portion.getPortionFormat().getHyperlinkManager().setExternalHyperlinkClick("https://www.aspose.com/")

    presentation.save("Hyperlink.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

SSS

Metin kutusu ile bir ana slayt veya düzen slaytındaki metin yer tutucusu arasındaki fark nedir?

placeholder bir master slide veya layout slide üzerinden konum ve biçimlendirmesini miras alabilir. Normal bir metin kutusu, oluşturulduğu slaytta bağımsız bir şekildir ve düzen değiştiğinde yer tutucu davranışı edinmez.

Grafiklerde, tablolarda veya SmartArt’ta metni değiştirmeden metni nasıl değiştirebilirim?

Metni yalnızca AutoShape örnekleri olan şekillerde dolaşarak güncelleyin; bu, Metni Güncelleme örneğinde gösterildiği gibidir. Grafikler, tablolar ve SmartArt kendi nesne modellerinde metin depolar, bu yüzden o döngü tarafından değiştirilmezler.