Správa textových polí v prezentacích pomocí Javy

Úvod

Texty na snímcích jsou běžně umístěny v textových polích nebo tvarech. Proto, abyste přidali text na snímek, musíte nejprve přidat textové pole a poté do něj vložit text. Aspose.Slides pro Java poskytuje rozhraní IAutoShape, které umožňuje přidat tvar obsahující text.

Vytvoření textového pole na snímku

Pro vytvoření textového pole na snímku postupujte následovně:

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na první snímek nově vytvořené prezentace.
  3. Přidejte objekt IAutoShape s typem ShapeType nastaveným na Rectangle na požadovanou pozici na snímku a získejte odkaz na nově přidaný objekt IAutoShape.
  4. Přidejte vlastnost TextFrame k objektu IAutoShape, která bude obsahovat text. V níže uvedeném příkladu jsme přidali tento text: Aspose TextBox
  5. Nakonec zapište soubor PPTX pomocí objektu Presentation.

Tento Java kód—implementace výše uvedených kroků—ukazuje, jak přidat text na snímek:

// Vytvoří instanci Presentation
Presentation pres = new Presentation();
try {
    // Získá první snímek v prezentaci
    ISlide sld = pres.getSlides().get_Item(0);

    // Přidá AutoShape s typem nastaveným na Obdélník
    IAutoShape ashp = sld.getShapes().addAutoShape(ShapeType.Rectangle, 150, 75, 150, 50);

    // Přidá TextFrame do Obdélníku
    ashp.addTextFrame(" ");

    // Přistoupí k textovému rámci
    ITextFrame txtFrame = ashp.getTextFrame();

    // Vytvoří objekt Paragraph pro textový rámec
    IParagraph para = txtFrame.getParagraphs().get_Item(0);

    // Vytvoří objekt Portion pro odstavec
    IPortion portion = para.getPortions().get_Item(0);

    // Nastaví text
    portion.setText("Aspose TextBox");

    // Uloží prezentaci na disk
    pres.save("TextBox_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Kontrola, zda se jedná o tvar textového pole

Aspose.Slides poskytuje metodu isTextBox z rozhraní IAutoShape, která umožňuje prozkoumat tvary a identifikovat textová pole.

Text box and shape

Tento Java kód ukazuje, jak zkontrolovat, zda byl tvar vytvořen jako textové pole:

Presentation presentation = new Presentation("sample.pptx");
try {
    ForEach.shape(presentation, (shape, slide, index) -> {
        if (shape instanceof IAutoShape) {
            IAutoShape autoShape = (IAutoShape) shape;
            System.out.println(autoShape.isTextBox() ? "shape is a text box" : "shape is not a text box");
        }
    });
} finally {
    presentation.dispose();
}

Všimněte si, že pokud jen přidáte automatický tvar pomocí metody addAutoShape z rozhraní IShapeCollection, metoda isTextBox tohoto automatického tvaru vrátí false. Po přidání textu do automatického tvaru pomocí metody addTextFrame nebo setText se pak vlastnost isTextBox nastaví na true.

Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);

IAutoShape shape1 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 40);
// shape1.isTextBox() vrací false
shape1.addTextFrame("shape 1");
// shape1.isTextBox() vrací true

IAutoShape shape2 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 110, 100, 40);
// shape2.isTextBox() vrací false
shape2.getTextFrame().setText("shape 2");
// shape2.isTextBox() vrací true

IAutoShape shape3 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 210, 100, 40);
// shape3.isTextBox() vrací false
shape3.addTextFrame("");
// shape3.isTextBox() vrací false

IAutoShape shape4 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 310, 100, 40);
// shape4.isTextBox() vrací false
shape4.getTextFrame().setText("");
// shape4.isTextBox() vrací false

Přidání sloupců do textového pole

Aspose.Slides poskytuje vlastnosti ColumnCount a ColumnSpacing (z rozhraní ITextFrameFormat a třídy TextFrameFormat), které umožňují přidávat sloupce do textových polí. Můžete určit počet sloupců v textovém poli a nastavit mezery mezi sloupci v bodech.

Tento Java kód demonstruje popsanou operaci:

Presentation pres = new Presentation();
try {
    // Získá první snímek v prezentaci
    ISlide slide = pres.getSlides().get_Item(0);

    // Přidá AutoShape s typem nastaveným na Obdélník
    IAutoShape aShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);

    // Přidá TextFrame do Obdélníku
    aShape.addTextFrame("All these columns are limited to be within a single text container -- " +
            "you can add or delete text and the new or remaining text automatically adjusts " +
            "itself to flow within the container. You cannot have text flow from one container " +
            "to other though -- we told you PowerPoint's column options for text are limited!");

    // Získá formát textu TextFrame
    ITextFrameFormat format = aShape.getTextFrame().getTextFrameFormat();

    // Určuje počet sloupců v TextFrame
    format.setColumnCount(3);

    // Určuje mezery mezi sloupci
    format.setColumnSpacing(10);

    // Uloží prezentaci
    pres.save("ColumnCount.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Přidání sloupců do textového rámce

Aspose.Slides pro Java poskytuje vlastnost ColumnCount (z rozhraní ITextFrameFormat), která umožňuje přidávat sloupce v textových rámcích. Pomocí této vlastnosti můžete určit požadovaný počet sloupců v textovém rámci.

Tento Java kód ukazuje, jak přidat sloupec do textového rámce:

String outPptxFileName = "ColumnsTest.pptx";
Presentation pres = new Presentation();
try {
    IAutoShape shape1 = pres.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);
    TextFrameFormat format = (TextFrameFormat)shape1.getTextFrame().getTextFrameFormat();

    format.setColumnCount(2);
    shape1.getTextFrame().setText("All these columns are forced to stay within a single text container -- " +
            "you can add or delete text - and the new or remaining text automatically adjusts " +
            "itself to stay within the container. You cannot have text spill over from one container " +
            "to other, though -- because PowerPoint's column options for text are limited!");
    pres.save(outPptxFileName, SaveFormat.Pptx);

    Presentation test = new Presentation(outPptxFileName);
    try {
        IAutoShape autoShape = ((AutoShape)test.getSlides().get_Item(0).getShapes().get_Item(0));
        Assert.assertTrue(2 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
        Assert.assertTrue(Double.NaN == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
    } finally {
        if (test != null) test.dispose();
    }

    format.setColumnSpacing(20);
    pres.save(outPptxFileName, SaveFormat.Pptx);

    Presentation test1 = new Presentation(outPptxFileName);
    try {
        IAutoShape autoShape = ((AutoShape)test1.getSlides().get_Item(0).getShapes().get_Item(0));
        Assert.assertTrue(2 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
        Assert.assertTrue(20 == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
    } finally {
        if (test1 != null) test1.dispose();
    }

    format.setColumnCount(3);
    format.setColumnSpacing(15);
    pres.save(outPptxFileName, SaveFormat.Pptx);

    Presentation test2 = new Presentation(outPptxFileName);
    try {
        IAutoShape autoShape = ((AutoShape)test2.getSlides().get_Item(0).getShapes().get_Item(0));
        Assert.assertTrue(3 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
        Assert.assertTrue(15 == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
    } finally {
        if (test2 != null) test2.dispose();
    }
} finally {
    if (pres != null) pres.dispose();
}

Aktualizace textu

Aspose.Slides umožňuje měnit nebo aktualizovat text obsažený v textovém poli nebo veškerý text v celé prezentaci.

Tento Java kód demonstruje operaci, při níž jsou aktualizovány nebo změněny všechny texty v prezentaci:

Presentation pres = new Presentation("text.pptx");
try {
    for (ISlide slide : pres.getSlides())
    {
        for (IShape shape : slide.getShapes())
        {
            if (shape instanceof IAutoShape) // Kontroluje, zda tvar podporuje textový rámec (IAutoShape).
            {
                IAutoShape autoShape = (IAutoShape)shape; 
                for (IParagraph paragraph : autoShape.getTextFrame().getParagraphs()) // Prochází odstavce v textovém rámci
                {
                    for (IPortion portion : paragraph.getPortions()) // Prochází každou část v odstavci
                    {
                        portion.setText(portion.getText().replace("years", "months")); // Mění text
                        portion.getPortionFormat().setFontBold(NullableBool.True); // Mění formátování
                    }
                }
            }
        }
    }

    // Uloží upravenou prezentaci
    pres.save("text-changed.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Přidání textového pole s hyperodkazem

Do textového pole můžete vložit odkaz. Po kliknutí na textové pole se uživatelé dostanou na tento odkaz.

Pro přidání textového pole obsahujícího odkaz postupujte následovně:

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na první snímek nově vytvořené prezentace.
  3. Přidejte objekt AutoShape s nastaveným ShapeType na Rectangle na požadovanou pozici na snímku a získejte odkaz na nově přidaný objekt AutoShape.
  4. Přidejte TextFrame k objektu AutoShape, který bude obsahovat Aspose TextBox jako výchozí text.
  5. Vytvořte instanci třídy IHyperlinkManager.
  6. Přiřaďte objekt IHyperlinkManager k vlastnosti HyperlinkClick u požadované části TextFrame.
  7. Nakonec zapište soubor PPTX pomocí objektu Presentation.

Tento Java kód—implementace výše uvedených kroků—ukazuje, jak přidat textové pole s hyperodkazem na snímek:

// Vytvoří instanci třídy Presentation, která představuje PPTX
Presentation pres = new Presentation();
try {
    // Získá první snímek v prezentaci
    ISlide slide = pres.getSlides().get_Item(0);

    // Přidá objekt AutoShape s typem nastaveným na Obdélník
    IShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 150, 50);

    // Přetypuje tvar na AutoShape
    IAutoShape pptxAutoShape = (IAutoShape)shape;

    // Přistoupí k vlastnosti ITextFrame spojené s AutoShape
    pptxAutoShape.addTextFrame("");

    ITextFrame textFrame = pptxAutoShape.getTextFrame();

    // Přidá text do rámce
    textFrame.getParagraphs().get_Item(0).getPortions().get_Item(0).setText("Aspose.Slides");

    // Nastaví hyperodkaz pro text části
    IHyperlinkManager hyperlinkManager = textFrame.getParagraphs().get_Item(0).getPortions().get_Item(0).
            getPortionFormat().getHyperlinkManager();
    hyperlinkManager.setExternalHyperlinkClick("http://www.aspose.com");

    // Uloží PPTX prezentaci
    pres.save("hLink_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Často kladené otázky

Jaký je rozdíl mezi textovým polem a zástupným textovým polem při práci s hlavními snímky?

Placeholder dědí styl/pozici z masteru a lze jej přepsat na layoutu, zatímco běžné textové pole je samostatný objekt na konkrétním snímku a při změně layoutu se nemění.

Jak mohu provést hromadnou náhradu textu v celé prezentaci, aniž bych zasáhl do textu uvnitř grafů, tabulek a SmartArt?

Omezte iteraci na automatické tvary, které mají textové rámce, a vyloučte vložené objekty (grafy, tabulky, SmartArt) tím, že budete jejich kolekce procházet odděleně nebo přeskočíte tyto typy objektů.