Spravovat textová pole v prezentacích PowerPoint v Pythonu
Přehled
Textový odstavec se skládá z částí. Běžná Portion obsahuje doslovný text; část s polem má také Field, jejíž typ identifikuje automaticky aktualizovanou hodnotu, například číslo snímku nebo datum. Dvě části mohou zobrazovat stejné znaky, přičemž jen jedna obsahuje pole.
Použijte Portion.field k rozlišení: pro běžný text je None. Portion.add_field převádí existující část na pole. Uchovávejte popisek a jeho dynamickou hodnotu v samostatných částech, aby převod hodnoty nevedl k nahrazení popisku.
Tato příručka pokrývá pole v textu, jejich formátování a ukládání do PPTX a PPT. Pro textová pole a odstavce viz Manage Text.
Vytvoření pole čísla snímku
Následující úplný příklad vytvoří textové pole obsahující doslovný popisek Slide následovaný automaticky aktualizovaným číslem. Před přidáním pole nastaví velikost, tučnost a barvu čísla, poté znovu otevře uloženou prezentaci a ověří typ pole, text a formátování. Vstupní soubor není vyžadován.
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 40, 40, 240, 50)
shape.add_text_frame("Slide ")
paragraph = shape.text_frame.paragraphs[0]
number_portion = slides.Portion()
number_portion.portion_format.font_height = 24
number_portion.portion_format.font_bold = slides.NullableBool.TRUE
number_portion.portion_format.fill_format.fill_type = slides.FillType.SOLID
number_portion.portion_format.fill_format.solid_fill_color.color = draw.Color.dark_blue
paragraph.portions.add(number_portion)
number_portion.add_field(slides.FieldType.slide_number)
presentation.save("slide_number.pptx", slides.export.SaveFormat.PPTX)
with slides.Presentation("slide_number.pptx") as reopened:
saved_shape = reopened.slides[0].shapes[0]
saved_number = saved_shape.text_frame.paragraphs[0].portions[1]
has_number_field = saved_number.field is not None and saved_number.field.type.internal_string == slides.FieldType.slide_number.internal_string
portion_format = saved_number.portion_format
formatting_preserved = portion_format.font_height == 24 and portion_format.font_bold == slides.NullableBool.TRUE
formatting_preserved &= portion_format.fill_format.solid_fill_color.color.to_argb() == draw.Color.dark_blue.to_argb()
print(f"Text: {saved_shape.text_frame.text}")
print(f"Slide number field: {has_number_field}")
print(f"Formatting preserved: {formatting_preserved}")
Nová prezentace začíná číslem snímku 1, takže text je Slide 1, a oba ověření vypíšou True. Číslo zůstane polem po opětovném otevření; není to doslovné 1. Indexy v ověření odkazují na tvar a části vytvořené v tomto příkladu.
Vyberte typ pole
FieldType poskytuje následující předdefinované hodnoty. Při volání add_field předávejte příslušnou hodnotu.
| Hodnota | Účel |
|---|---|
| slide_number | Aktuální číslo snímku. |
| date_time | Datum/čas ve výchozím formátu aplikačního vykreslování. |
| date_time1–date_time9 | Předdefinované formáty data nebo kombinované formáty data/času. |
| date_time10–date_time13 | Předdefinované formáty času, s možnostmi sekund a 12‑hodinového formátu. |
| header | Pole záhlaví; viz omezení zástupného symbolu a formátu níže. |
| footer | Pole zápatí. |
Například date_time3 představuje den, celé jméno měsíce a rok v angličtině. Jedná se o předdefinované formáty pole, nikoli o libovolné řetězce formátu data v Pythonu. Na zobrazovaný výsledek může mít vliv language_id části a aplikace zpracovávající prezentaci.
Vytvoření pole z interního řetězce
Přetížení metody s řetězcem pro add_field přijímá interní identifikátor pole. Použijte jej, když chcete zachovat identifikátor poskytnutý jinou aplikací, která nemá předdefinovanou hodnotu. Můžete také vytvořit FieldType z identifikátoru. FieldType.internal_string poskytuje tento identifikátor k prohlédnutí.
Tento příklad ukládá aplikační specifické pole custom-report-id s nouzovým textem Report-042. Identifikátor nezaregistruje výpočet: Aspose.Slides nevytváří ID zpráv pro neznámý typ. Aplikace, která tento identifikátor rozumí, musí dodat jeho význam a aktualizovat jeho hodnotu.
import aspose.slides as slides
with slides.Presentation() as presentation:
shape = presentation.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 40, 40, 300, 50)
shape.add_text_frame("Report-042")
portion = shape.text_frame.paragraphs[0].portions[0]
portion.add_field("custom-report-id")
presentation.save("custom_field.pptx", slides.export.SaveFormat.PPTX)
with slides.Presentation("custom_field.pptx") as reopened:
saved_shape = reopened.slides[0].shapes[0]
saved_portion = saved_shape.text_frame.paragraphs[0].portions[0]
type_name = saved_portion.field.type.internal_string if saved_portion.field is not None else "ordinary text"
print(f"Type: {type_name}")
print(f"Text: {saved_portion.text}")
Po tomto kole PPTX je typ custom-report-id a text je Report-042. Předání řetězce jako %Y-%m-%d by pojmenovalo typ pole; nekonfigurovalo by vlastní formát data. Pro pevné datum v libovolném formátu použijte běžný text.
Prohlédnutí, úprava a odstranění polí datum/čas
Čtěte a měňte existující pole přes Field.type. Ověřte, že pole existuje, než získáte jeho typ. Pro zastavení automatických aktualizací zavolejte Portion.remove_field. Tím se zachová část a její aktuální text, zatímco se odstraní asociace s polem. Pokud potřebujete konkrétní pevnou hodnotu, přiřaďte tento text po odstranění pole.
Pro nastavení API související se zpracováním polí datum/čas viz Presentation.current_date_time. Níže uvedený příklad používá explicitní datum schválení při převodu pole na běžný text. Anglický n-tice názvů měsíců udržuje pevné datum nezávislé na systémovém jazyce.
Stáhněte sample.pptx a umístěte jej do pracovního adresáře. Obsahuje dva pojmenované textové tvary UpdatedAt a ApprovedDate, každý s polem datum/čas, plus běžné textové popisky. Následující příklad prochází textové tvary nejvyšší úrovně na běžných snímcích. Mění pole datum/čas na formát dlouhého data a nastavuje kurzívu, přičemž zachovává ostatní formátování. Pouze pole v ApprovedDate se změní na pevný text.
Ukázka rozpoznává vestavěné interní identifikátory datetime a datetime1 až datetime13. Skupiny, tabulky, poznámky, rozvržení a mastery vyžadují procházení vlastních kontejnerů textu a jsou mimo rozsah tohoto příkladu.
from datetime import date
import aspose.slides as slides
with slides.Presentation("sample.pptx") as presentation:
approval_date = date(2030, 4, 5)
english_months = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
approval_text = f"{approval_date.day:02d} {english_months[approval_date.month - 1]} {approval_date.year}"
date_time_types = {"datetime"} | {f"datetime{index}" for index in range(1, 14)}
for slide in presentation.slides:
for shape in slide.shapes:
if not isinstance(shape, slides.AutoShape) or shape.text_frame is None:
continue
for paragraph in shape.text_frame.paragraphs:
for portion in paragraph.portions:
field = portion.field
if field is None:
continue
if field.type.internal_string not in date_time_types:
continue
field.type = slides.FieldType.date_time3
portion.portion_format.language_id = "en-US"
portion.portion_format.font_italic = slides.NullableBool.TRUE
if shape.name == "ApprovedDate":
portion.remove_field()
portion.text = approval_text
presentation.save("updated_dates.pptx", slides.export.SaveFormat.PPTX)
with slides.Presentation("updated_dates.pptx") as reopened:
for shape in reopened.slides[0].shapes:
if not isinstance(shape, slides.AutoShape) or shape.text_frame is None:
continue
if shape.name not in {"UpdatedAt", "ApprovedDate"}:
continue
portion = shape.text_frame.paragraphs[0].portions[0]
type_name = portion.field.type.internal_string if portion.field is not None else "ordinary text"
print(f"{shape.name}: {type_name}; {portion.text}")
print(f"Italic: {portion.portion_format.font_italic == slides.NullableBool.TRUE}")
Po opětovném otevření má UpdatedAt typ datetime3 a zůstává dynamický. ApprovedDate nemá pole a obsahuje 05 April 2030. Obě části data jsou kurzívou a jejich původní velikost písma, tučné nastavení a barva zůstaly nedotčeny. Běžné textové popisky jsou beze změny. Ověření čte první část dvou známých tvarů v dodaném vzorku.
Zachování formátování textu
Pracujte s existující částí při přidávání pole, změně jeho typu nebo odstraňování. Tyto operace zachovávají formátování části. Použijte Portion.portion_format k úpravě jen požadovaných vlastností, jak ukazují příklady pro barvu nebo kurzívu.
Vyhněte se přestavování celého textového rámce jen kvůli aktualizaci jednoho pole: může tak dojít ke ztrátě původních hranic částí a jejich individuálního formátování. Také rozlišujte explicitně nastavené formátování od formátování zděděného z odstavce, rozvržení nebo tématu. Viz Text Formatting pro širší možnosti formátování.
Pole a zástupné symboly záhlaví/zápatí
Pole je součástí textové části. Zástupný symbol je tvar s rolí v prezentaci, například zápatí nebo číslo snímku. Přidání pole do běžného textového pole nepromění tento tvar na zástupný symbol.
Správci záhlaví/zápatí řídí text a viditelnost zástupných symbolů na snímcích, rozvrženích a masterech, včetně šíření na podřízené snímky. Číselné pole v uživatelském textovém poli může být užitečné i když nepoužíváte zástupný symbol čísla snímku. Naopak změna viditelnosti zástupného symbolu neodstraní pole z nesouvisejícího textového pole.
Předdefinované typy záhlaví a zápatí nevytvářejí odpovídající zástupné symboly ani neposkytují jejich obsah. Konkrétně běžný snímek PowerPointu nemá zástupný symbol záhlaví; záhlaví patří k poznámkovým stránkám a výstřižkům. Nepředpokládejte, že pole záhlaví nebo zápatí v libovolném tvaru automaticky získá text nastavený prostřednictvím správce zástupných symbolů. Pro tento postup viz Presentation Headers and Footers.
Omezení PPTX a PPT
Ověřte jak typ pole, tak jeho výsledný text po uložení a opětovném otevření. Zachování identifikátoru neprokazuje, že aplikace může vypočítat nebo zobrazit jeho hodnotu.
| Formát | Chování pole a omezení |
|---|---|
| PPTX | Ukládá interní identifikátory pole spolu s textem pole. V kontrolách po kole se předdefinované typy a vlastní identifikátor použité výše zachovaly při uložení a opětovném otevření. Neznámý vlastní typ si ponechal nouzový text; nezískal automatickou logiku výpočtu. Jiná aplikace může s nepodporovanými identifikátory zacházet odlišně. |
| PPT | Používá starší reprezentace polí a má omezenější kompatibilitu. V kontrolách po kole přežily pole čísla snímku a předdefinovaná pole datum/čas při uložení a opětovném otevření. Vlastní pole v běžném textovém poli snímku se po otevření zobrazilo s identifikátorem, ale s textem *; pole záhlaví ve stejném kontextu také vrátilo *. Nespoléhejte se, že vlastní pole nebo nepodporované kontexty polí si zachovají viditelný text. |
Pro přenosný, pevný výstup převádějte nepodporovaná pole na běžný text a před uložením výslovně přiřaďte požadovanou hodnotu. Tím se zachová zvolený text, ale úmyslně se zastaví automatické aktualizace. Otestujte také cílovou aplikaci, pokud je její vlastní přepočet polí součástí vašeho postupu.
Často kladené otázky
Jak mohu zjistit, zda je zobrazené číslo nebo datum pole?
Prohlédněte si Portion.field. Hodnota odlišná od None identifikuje pole; samotný zobrazený text to nedokáže určit.
Odstraní odstranění pole jeho text nebo formátování?
Ne. remove_field převádí existující část na běžný text. Pokud potřebujete konkrétní zamrzlý datum nebo náhradní text, přiřaďte ho po odstranění pole.
Může interní řetězec definovat nový formát data nebo vzorec?
Ne. Identifikuje typ pole. Neznámý identifikátor neposkytuje vyhodnocovač ani vzorový řetězec formátu data v Pythonu. Použijte podporovaný předdefinovaný typ nebo formátujte hodnotu sami jako běžný text.
Proč kontrolovat prezentaci znovu po jejím uložení?
Identifikátory polí, vypočtený text a formátování jsou samostatné věci, které je třeba ověřit. Převod formátu může změnit viditelný výsledek, i když identifikátor pole stále existuje.