Beheer tekstvelden in PowerPoint-presentaties met Python
Overzicht
Een tekstparagraaf bestaat uit gedeelten. Een gewone Portion bevat letterlijke tekst; een veldgedeelte heeft bovendien een Field waarvan het type een automatisch bijgewerkte waarde aangeeft, zoals een dia‑nummer of datum. Twee gedeelten kunnen dezelfde tekens weergeven terwijl slechts één een veld bevat.
Gebruik Portion.field om ze te onderscheiden: het is None voor gewone tekst. Portion.add_field zet een bestaand gedeelte om in een veld. Houd een label en de dynamische waarde in afzonderlijke gedeelten zodat het omzetten van de waarde niet ook het label vervangt.
Deze gids behandelt velden in tekst, hun opmaak en het opslaan in PPTX en PPT. Voor tekstframes en alinea’s, zie Manage Text.
Een dia‑nummerveld maken
Het volgende volledige voorbeeld maakt een tekstvak met een letterlijke Slide ‑label gevolgd door een automatisch bijgewerkt nummer. Het stelt de grootte, dikte en kleur van het nummer in voordat het veld wordt toegevoegd, opent vervolgens de opgeslagen presentatie opnieuw en controleert het veldtype, de tekst en de opmaak. Er is geen invoerbestand vereist.
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}")
De nieuwe presentatie begint met dia‑nummer 1, dus de tekst is Slide 1, en beide controles printen True. Het nummer blijft een veld na het heropenen; het is geen letterlijke 1. De indices in de verificatie verwijzen naar de vorm en de gedeelten die door dit voorbeeld zijn aangemaakt.
Een veldtype kiezen
FieldType levert de volgende vooraf gedefinieerde waarden. Geef de juiste waarde door aan add_field.
| Waarde | Doel |
|---|---|
| slide_number | Het huidige dia‑nummer. |
| date_time | Datum/tijd in het standaardformaat van de rendering‑applicatie. |
| date_time1–date_time9 | Vooraf gedefinieerde datum‑ of gecombineerde datum/tijd‑formaten. |
| date_time10–date_time13 | Vooraf gedefinieerde tijdformaten, met opties voor seconden en een 12‑uur klok. |
| header | Een header‑veld; zie de placeholder‑ en formaatbeperkingen hieronder. |
| footer | Een footer‑veld. |
Bijvoorbeeld, date_time3 staat voor een dag, volledige maandnaam en jaar in het Engels. Dit zijn vooraf gedefinieerde veldformaten, geen willekeurige Python‑datum‑formatstrings. De language_id van het gedeelte en de applicatie die de presentatie verwerkt, kunnen het weergegeven resultaat beïnvloeden.
Een veld maken vanuit een interne tekenreeks
De tekenreeks‑overload van add_field accepteert een interne veld‑identifier. Gebruik deze wanneer u een identifier wilt behouden die door een andere applicatie is opgegeven en waarvoor geen vooraf gedefinieerde waarde bestaat. U kunt ook een FieldType construeren vanuit de identifier. FieldType.internal_string maakt die identifier beschikbaar voor inspectie.
Dit voorbeeld slaat een toepassingsspecifiek custom-report-id‑veld op met de fallback‑tekst Report-042. De identifier registreert geen berekening: Aspose.Slides genereert geen rapport‑IDs voor een onbekend type. De applicatie die deze identifier begrijpt, moet de betekenis leveren en de waarde bijwerken.
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}")
Na deze PPTX‑ronde is het type custom-report-id en de tekst Report-042. Het doorgeven van een tekenreeks zoals %Y-%m-%d zou een veldtype benoemen; het zou geen aangepast datumformaat configureren. Voor een vaste datum in een willekeurig formaat, gebruik gewone tekst.
Datum/tijd‑velden inspecteren, wijzigen en verwijderen
Lees en wijzig een bestaand veld via Field.type. Controleer dat het veld bestaat voordat u het type benadert. Om automatische updates te stoppen, roep Portion.remove_field aan. Dit behoudt het gedeelte en de huidige tekst terwijl de veldassociatie wordt verwijderd. Als u een specifieke vaste waarde nodig heeft, kent u die tekst toe na het verwijderen van het veld.
Voor de API‑instelling die verband houdt met de verwerking van datum/tijd‑velden, zie Presentation.current_date_time. Het onderstaande voorbeeld gebruikt een expliciete goedkeuringsdatum bij het omzetten van een veld naar gewone tekst. Een Engelstalige maandnaam‑tuple houdt de vaste datum onafhankelijk van de systeem‑locale.
Download sample.pptx en plaats het in de werkmap. Het bevat twee benoemde tekstvormen, UpdatedAt en ApprovedDate, elk met een datum/tijd‑veld, plus gewone tekstlabels. Het volgende voorbeeld doorloopt top‑level tekstvormen op reguliere dia’s. Het verandert datum/tijd‑velden naar een lange datum‑indeling en maakt ze cursief, terwijl de overige opmaak behouden blijft. Alleen velden in ApprovedDate worden vaste tekst.
De voorbeeld‑code herkent de ingebouwde interne identifiers datetime en datetime1 tot datetime13. Groepen, tabellen, notities, lay‑outs en masters vereisen traverseren van hun eigen tekstcontainers en vallen buiten de reikwijdte van dit voorbeeld.
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}")
Na het heropenen heeft UpdatedAt type datetime3 en blijft dynamisch. ApprovedDate heeft geen veld en bevat 05 April 2030. Beide datum‑gedeelten zijn cursief, en hun oorspronkelijke lettergrootte, vetinstelling en kleur blijven ongewijzigd. De gewone tekstlabels blijven ongewijzigd. De verificatie leest het eerste gedeelte van de twee bekende vormen in het meegeleverde voorbeeld.
Tekstopmaak behouden
Werk met het bestaande gedeelte wanneer u een veld toevoegt, het type wijzigt of het verwijdert. Deze bewerkingen behouden de opmaak van dat gedeelte. Gebruik Portion.portion_format om alleen de benodigde eigenschappen te wijzigen, zoals de voorbeelden doen voor kleur of cursief.
Vermijd het opnieuw bouwen van een compleet tekstframe alleen om één veld bij te werken: dat kan de oorspronkelijke grenzen van gedeelten en hun individuele opmaak verliezen. Onderscheid ook expliciet ingestelde opmaak van opmaak die is geërfd van de alinea, lay‑out of thema. Zie Text Formatting voor bredere opmaakopties.
Velden en header/footer‑placeholders
Een veld is onderdeel van een tekstgedeelte. Een placeholder is een vorm met een presentatierol, zoals een footer of dia‑nummer. Het toevoegen van een veld aan een gewone tekstbox maakt die vorm niet tot een placeholder.
De header/footer‑managers regelen placeholder‑tekst en zichtbaarheid op dia’s, lay‑outs en masters, inclusief voortplanting naar afhankelijke dia’s. Een nummer‑veld in een aangepaste tekstbox kan daarom nuttig zijn, zelfs als u de dia‑nummer‑placeholder niet gebruikt. Omgekeerd verwijdert het wijzigen van de placeholder‑zichtbaarheid geen veld uit een niet‑gerelateerde tekstbox.
De vooraf gedefinieerde header‑ en footertype maken de corresponderende placeholders niet aan en leveren hun inhoud niet. Met name heeft een gewone PowerPoint‑dia geen header‑placeholder; headers behoren tot notitie‑pagina’s en hand-outs. Ga er niet vanuit dat een header‑ of footer‑veld in een willekeurige vorm automatisch de via een placeholder‑manager ingestelde tekst krijgt. Voor die workflow, zie Presentation Headers and Footers.
PPTX‑ en PPT‑beperkingen
Controleer zowel het veldtype als de resulterende tekst na het opslaan en opnieuw openen. Het behouden van een identifier bewijst niet dat een applicatie de waarde kan berekenen of weergeven.
| Formaat | Gedrag van het veld en beperkingen |
|---|---|
| PPTX | Slaat interne veld‑identifiers op naast veld‑tekst. In ronde‑trip‑controles overleefden de vooraf gedefinieerde types en de hierboven gebruikte aangepaste identifier het opslaan en heropenen. Het onbekende aangepaste type behield zijn fallback‑tekst; het kreeg geen automatische berekeningslogica. Een andere applicatie kan onbekende identifiers anders behandelen. |
| PPT | Gebruikt verouderde veld‑representaties en heeft een meer beperkte compatibiliteit. In ronde‑trip‑controles overleefden dia‑nummer‑ en vooraf gedefinieerde datum/tijd‑velden het opslaan en heropenen. Een aangepast veld in een gewone dia‑tekstbox werd heropend met zijn identifier maar met * als tekst; een header‑veld in dezelfde context leverde eveneens *. Vertrouw niet op aangepaste velden of niet‑ondersteunde veld‑contexten om hun zichtbare tekst te behouden. |
Voor draagbare, vaste output, converteer niet‑ondersteunde velden naar gewone tekst en ken expliciet de gewenste waarde toe vóór het opslaan. Dit behoudt de gekozen tekst maar stopt opzettelijk automatische updates. Test de doelapplicatie eveneens wanneer diens eigen veld‑hercalculatie deel uitmaakt van uw workflow.
FAQ
Hoe kan ik zien of een getoonde nummer of datum een veld is?
Inspecteer Portion.field. Een waarde anders dan None duidt een veld aan; de getoonde tekst alleen kan dat niet onthullen.
Verwijdert het verwijderen van een veld de tekst of opmaak?
Nee. remove_field zet het bestaande gedeelte om naar gewone tekst. Ken later een expliciete waarde toe als u een specifieke bevroren datum of fallback‑tekst nodig heeft.
Kan een interne tekenreeks een nieuw datumformaat of formule definiëren?
Nee. Het identificeert een veldtype. Een onbekende identifier levert geen evaluator of een Python‑datum‑formatpatroon. Gebruik een ondersteund vooraf gedefinieerd type of formatteer de waarde zelf als gewone tekst.
Waarom een presentatie opnieuw controleren na het opslaan?
Veld‑identifiers, berekende tekst en opmaak zijn afzonderlijke zaken die geverifieerd moeten worden. Formaatconversie kan het zichtbare resultaat wijzigen, zelfs wanneer de veld‑identifier nog aanwezig is.