Správa textových polí v prezentacích pomocí Pythonu přes Java

Úvod

V Aspose.Slides pro Python přes Java je text snímku uložen v textových rámech, které patří k tvarům. Třída AutoShape představuje nejběžnější tvar nesoucí text a zpřístupňuje svůj text prostřednictvím metody AutoShape.getTextFrame.

Vytvořit textové pole na snímku

Chcete‑li vytvořit textové pole, přidejte automatický tvar na snímek, vložte text do jeho textového rámce a uložte prezentaci. Následující příklad vytvoří obdélníkové textové pole:

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()

Souřadnice a rozměry předávané metodě ShapeCollection.addAutoShape jsou měřeny v bodech. AutoShape.addTextFrame inicializuje textový rámec dodaným textem.

Zkontrolovat, zda jde o tvar textového pole

Použijte metodu AutoShape.isTextBox k určení, zda je automatický tvar považován za textové pole. Toto je užitečné, když prezentace obsahuje jak textové, tak čistě grafické automatické tvary.

Textové pole a tvar

Následující příklad prozkoumá každý automatický tvar v prezentaci:

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()

Nově přidaný automatický tvar není považován za textové pole, dokud neobsahuje neprázdný text. Text můžete dodat pomocí AutoShape.addTextFrame nebo TextFrame.setText. Přidání nebo přiřazení prázdného řetězce ponechá metodu AutoShape.isTextBox vracející False:

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()

První dvě volání vytisknou True; poslední dvě vytisknou False.

Najít tvar, který vlastní textový rámec

Obecný kód pro zpracování textu může získat TextFrame bez toho, aby věděl, který objekt prezentace jej obsahuje. Použijte jen‑read‑only metodu TextFrame.getParentShape k navigaci zpět k jeho vlastnímu Shape.

U textového rámce vlastněného automatickým tvarem nebo jiným tvarem nesoucím text metoda TextFrame.getParentShape vrací vlastníka a TextFrame.getParentCell vrací None. Před přístupem zkontrolujte vrácenou hodnotu. Pro identifikaci vlastníků jak tvaru, tak buňky tabulky, včetně tvarů spojených s uzly SmartArt, viz Search and Replace Text.

Přidat sloupce do textového pole

Metoda TextFrameFormat.setColumnCount rozdělí textový rámec do sloupců, zatímco TextFrameFormat.setColumnSpacing nastaví mezery mezi sloupci v bodech. Obě nastavení patří do TextFrameFormat a lze je měnit prostřednictvím textového rámce existujícího textového pole. Text se přetéká mezi sloupci uvnitř stejného tvaru; nepokračuje do jiného tvaru.

Následující příklad vytvoří třísloupcové textové pole s 10 body mezi sloupci, uloží prezentaci a načte uložená nastavení ze souboru výstupu:

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()

Extrahovat text z jednotlivých sloupců

Použijte TextFrame.splitTextByColumns k získání textu přiřazeného každému vizuálnímu sloupci v existujícím textovém rámci. Metoda vrací jeden řetězec pro každý sloupec ve sloupcovém pořadí čtení. Textový rámec s jedním sloupcem vytvoří pole s jedním prvkem a prázdný sloupec je reprezentován prázdným řetězcem. Řetězce obsahují pouze čistý text; formátování na úrovni částí není zachováno.

To je užitečné, když potřebujete:

  • Extrahovat text při zachování jeho sloupcového pořadí čtení.
  • Indexovat nebo porovnat obsah snímků s více sloupci.
  • Exportovat každý sloupec do samostatného souboru, databázového pole nebo jiného cíle.
  • Prozkoumat, jak je text přerozdělen po změně počtu sloupců pomocí TextFrameFormat.setColumnCount, mezery pomocí TextFrameFormat.setColumnSpacing, písma nebo velikosti textového rámce.

Metoda hlásí text rozdělený v aktuálním TextFrame; automaticky neprovádí tok textu mezi oddělenými tvary nebo textovými poli. Rozdělení sloupců může záviset na dostupných písmech a dalších nastaveních rozvržení textu, proto se ujistěte, že požadovaná písma jsou k dispozici, když jsou důsledné výsledky podstatné.

Následující příklad načte prezentaci, najde první automatický tvar s více sloupci a textovým rámcem, načte jeho nastavený počet sloupců a zapíše text z každého sloupce do samostatného souboru. Tvary, které neposkytují textový rámec, jsou přeskočeny.

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()

Aktualizovat text

Chcete‑li aktualizovat text napříč prezentací, projděte snímky a tvary, vyberte automatické tvary a poté upravte jejich textové části. Práce na úrovni částí vám umožní měnit jak text, tak znakové formátování.

Následující příklad nahradí každé výskyt years řetězcem months v textu automatických tvarů a každou ovlivněnou část nastaví tučným písmem:

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()

Toto procházení aktualizuje text pouze v automatických tvarech. Text uložený v tabulkách, grafech, SmartArt nebo seskupených tvarech vyžaduje procházení kolekcí těchto objektů.

Přidat textové pole s hyperodkazem

Hyperodkaz lze přiřadit konkrétní textové části, takže pouze tento text funguje jako klikací odkaz. Použijte HyperlinkManager.setExternalHyperlinkClick k přiřazení části k externímu URL.

Následující příklad vytvoří propojený text a uloží jej do prezentace:

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()

Často kladené otázky

Jaký je rozdíl mezi textovým polem a zástupcem textu na snímku šablony nebo rozvržení?

Placeholder může dědit svou polohu a formátování ze master slide nebo layout slide. Běžné textové pole je nezávislý tvar na snímku, kde bylo vytvořeno, a nezískává chování zástupce při změně rozvržení.

Jak mohu nahradit text, aniž bych změnil text v grafech, tabulkách nebo SmartArt?

Omezte procházení na tvary, které jsou instancemi AutoShape, jak je ukázáno v příkladu Aktualizovat text. Grafy, tabulky a SmartArt ukládají text ve svých vlastních modelových objektech, takže nejsou touto smyčkou upraveny.