Verwalten von Textfeldern in PowerPoint‑Präsentationen mit Python
Übersicht
Ein Textabsatz besteht aus Portionen. Eine gewöhnliche Portion enthält wörtlichen Text; eine Feldportion hat außerdem ein Field, dessen Typ einen automatisch aktualisierten Wert identifiziert, wie z. B. eine Foliennummer oder ein Datum. Zwei Portionen können dieselben Zeichen anzeigen, während nur eine ein Feld enthält.
Verwenden Sie Portion.field, um sie zu unterscheiden: Für gewöhnlichen Text ist sie None. Portion.add_field wird eine vorhandene Portion in ein Feld umgewandelt. Bewahren Sie ein Etikett und seinen dynamischen Wert in separaten Portionen auf, damit die Umwandlung des Werts nicht auch das Etikett ersetzt.
Dieser Leitfaden behandelt Felder im Text, deren Formatierung und das Speichern in PPTX und PPT. Für Textfelder und Absätze siehe Manage Text.
Erstellen eines Foliennummerfelds
Das folgende vollständige Beispiel erstellt ein Textfeld, das ein wörtliches Slide ‑Etikett gefolgt von einer automatisch aktualisierten Nummer enthält. Es legt die Größe, das Gewicht und die Farbe der Nummer fest, bevor das Feld hinzugefügt wird, öffnet dann die gespeicherte Präsentation erneut und überprüft den Feldtyp, den Text und die Formatierung. Keine Eingabedatei ist erforderlich.
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}")
Die neue Präsentation beginnt mit Foliennummer 1, sodass der Text Slide 1 lautet und beide Prüfungen True ausgeben. Die Nummer bleibt nach dem erneuten Öffnen ein Feld; sie ist nicht das wörtliche 1. Die Indizes in der Verifikation beziehen sich auf die von diesem Beispiel erstellte Form und die Portionen.
Wählen Sie einen Feldtyp
FieldType bietet die folgenden vordefinierten Werte. Übergeben Sie den passenden Wert an add_field.
| Wert | Zweck |
|---|---|
| slide_number | Die aktuelle Foliennummer. |
| date_time | Datum/Uhrzeit im Standardformat der Rendering‑Anwendung. |
| date_time1–date_time9 | Vordefinierte Datums‑ oder kombinierte Datum/Uhrzeit‑Formate. |
| date_time10–date_time13 | Vordefinierte Zeitformate, mit Optionen für Sekunden und eine 12‑Stunden‑Uhr. |
| header | Ein Kopfzeilenfeld; siehe unten die Platzhalter‑ und Formatierungsbeschränkungen. |
| footer | Ein Fußzeilenfeld. |
Zum Beispiel stellt date_time3 einen Tag, den vollständigen Monatsnamen und das Jahr in Englisch dar. Dies sind vordefinierte Feldformate, keine beliebigen Python‑Datumsformat‑Zeichenketten. Der language_id der Portion und die Anwendung, die die Präsentation verarbeitet, können das angezeigte Ergebnis beeinflussen.
Ein Feld aus einer internen Zeichenkette erstellen
Die String‑Überladung von add_field akzeptiert einen internen Feldkennzeichner. Verwenden Sie sie, wenn Sie einen von einer anderen Anwendung bereitgestellten Kennzeichner beibehalten, für den kein vordefinierter Wert existiert. Sie können auch ein FieldType aus dem Kennzeichner erstellen. FieldType.internal_string stellt diesen Kennzeichner zur Untersuchung bereit.
Dieses Beispiel speichert ein anwendungsspezifisches Feld custom-report-id mit dem Fallback‑Text Report-042. Der Kennzeichner registriert keine Berechnung: Aspose.Slides erzeugt keine Bericht‑IDs für einen unbekannten Typ. Die Anwendung, die diesen Kennzeichner versteht, muss dessen Bedeutung bereitstellen und den Wert aktualisieren.
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}")
Nach diesem PPTX‑Durchlauf ist der Typ custom-report-id und der Text Report-042. Die Übergabe einer Zeichenkette wie %Y-%m-%d würde einen Feldtyp benennen; sie würde kein benutzerdefiniertes Datumsformat konfigurieren. Für ein festes Datum in einem beliebigen Format verwenden Sie gewöhnlichen Text.
Untersuchen, Ändern und Entfernen von Datum/Uhrzeit‑Feldern
Lesen und ändern Sie ein vorhandenes Feld über Field.type. Überprüfen Sie, dass das Feld existiert, bevor Sie auf seinen Typ zugreifen. Um automatische Aktualisierungen zu stoppen, rufen Sie Portion.remove_field auf. Dies behält die Portion und ihren aktuellen Text bei, während die Feldzuordnung entfernt wird. Wenn Sie einen bestimmten festen Wert benötigen, weisen Sie nach dem Entfernen des Feldes diesen Text zu.
Für die API‑Einstellung, die mit der Verarbeitung von Datum/Uhrzeit‑Feldern zusammenhängt, siehe Presentation.current_date_time. Das nachstehende Beispiel verwendet ein explizites Genehmigungsdatum beim Konvertieren eines Feldes in gewöhnlichen Text. Ein englisches Monat‑Namens‑Tupel hält das feste Datum unabhängig von der System‑Locale.
Laden Sie sample.pptx herunter und platzieren Sie es im Arbeitsverzeichnis. Es enthält zwei benannte Textformen, UpdatedAt und ApprovedDate, jeweils mit einem Datum/Uhrzeit‑Feld sowie gewöhnliche Textbeschriftungen. Das folgende Beispiel durchläuft die Textformen der obersten Ebene auf normalen Folien. Es ändert Datum/Uhrzeit‑Felder zu einem Langdatumsformat und formatiert sie kursiv, während andere Formatierungen beibehalten werden. Nur Felder in ApprovedDate werden zu festem Text.
Das Beispiel erkennt die integrierten internen Kennzeichner datetime und datetime1 bis datetime13. Gruppen, Tabellen, Notizen, Layouts und Master erfordern die Durchquerung ihrer eigenen Textcontainer und liegen außerhalb des Geltungsbereichs dieses Beispiels.
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}")
Nach dem erneuten Öffnen hat UpdatedAt den Typ datetime3 und bleibt dynamisch. ApprovedDate hat kein Feld und enthält 05 April 2030. Beide Datumsportionen sind kursiv, und ihre ursprüngliche Schriftgröße, Fett‑Einstellung und Farbe bleiben erhalten. Die gewöhnlichen Textbeschriftungen bleiben unverändert. Die Verifikation liest die erste Portion der beiden bekannten Formen im mitgelieferten Beispiel.
Textformatierung beibehalten
Arbeiten Sie mit der vorhandenen Portion, wenn Sie ein Feld hinzufügen, dessen Typ ändern oder es entfernen. Diese Vorgänge behalten die Formatierung dieser Portion bei. Verwenden Sie Portion.portion_format, um nur die erforderlichen Eigenschaften zu ändern, wie die Beispiele für Farbe oder Kursivschrift zeigen.
Vermeiden Sie das Neuaufbauen eines gesamten Textrahmens nur zum Aktualisieren eines einzelnen Feldes: Dadurch können die ursprünglichen Portionengrenzen und deren individuelle Formatierung verloren gehen. Unterscheiden Sie außerdem explizit festgelegte Formatierung von der von Absatz, Layout oder Design geerbten Formatierung. Siehe Text Formatting für umfassendere Formatierungsoptionen.
Felder und Kopf-/Fußzeilen‑Platzhalter
Ein Feld ist Teil einer Textportion. Ein Platzhalter ist eine Form mit einer Präsentationsrolle, wie z. B. eine Fußzeile oder Foliennummer. Das Hinzufügen eines Feldes zu einem gewöhnlichen Textfeld macht diese Form nicht zu einem Platzhalter.
Die Kopf‑/Fußzeilen‑Verwalter steuern den Platzhalter‑Text und die Sichtbarkeit auf Folien, Layouts und Master, einschließlich der Weitergabe an abhängige Folien. Ein Zahlenfeld in einem benutzerdefinierten Textfeld kann daher nützlich sein, auch wenn Sie den Foliennummer‑Platzhalter nicht verwenden. Umgekehrt entfernt das Ändern der Sichtbarkeit von Platzhaltern kein Feld aus einem nicht‑zugehörigen Textfeld.
Die vordefinierten Kopf‑ und Fußzeilen‑Typen erzeugen nicht die entsprechenden Platzhalter oder liefern deren Inhalt. Insbesondere hat eine reguläre PowerPoint‑Folien keine Kopfzeilen‑Platzhalter; Kopfzeilen gehören zu Notizseiten und Handouts. Gehen Sie nicht davon aus, dass ein Kopf‑ oder Fußzeilenfeld in einer beliebigen Form automatisch den über einen Platzhalter‑Manager konfigurierten Text erhält. Für diesen Ablauf siehe Presentation Headers and Footers.
PPTX- und PPT‑Einschränkungen
Prüfen Sie sowohl den Feldtyp als auch den daraus resultierenden Text nach dem Speichern und erneuten Öffnen. Das Beibehalten eines Kennzeichners beweist nicht, dass eine Anwendung dessen Wert berechnen oder anzeigen kann.
| Format | Feldverhalten und -einschränkungen |
|---|---|
| PPTX | Speichert interne Feldkennzeichner zusammen mit dem Feldtext. In Rundreise‑Prüfungen überlebten die vordefinierten Typen und der oben verwendete benutzerdefinierte Kennzeichner das Speichern und erneute Öffnen. Der unbekannte benutzerdefinierte Typ behielt seinen Fallback‑Text bei; er erlangte keine automatische Berechnungslogik. Eine andere Anwendung kann nicht unterstützte Kennzeichner anders behandeln. |
| PPT | Verwendet veraltete Feldrepräsentationen und hat eingeschränktere Kompatibilität. In Rundreise‑Prüfungen überlebten Folien‑Nummer‑ und vordefinierte Datum/Uhrzeit‑Felder das Speichern und erneute Öffnen. Ein benutzerdefiniertes Feld in einem gewöhnlichen Folientextfeld wurde mit seinem Kennzeichner, jedoch mit * als Text, erneut geöffnet; ein Kopfzeilenfeld im gleichen Kontext produzierte ebenfalls *. Verlassen Sie sich nicht darauf, dass benutzerdefinierte Felder oder nicht unterstützte Feldkontexte ihren sichtbaren Text behalten. |
Für portable, feste Ausgaben konvertieren Sie nicht unterstützte Felder in gewöhnlichen Text und weisen Sie vor dem Speichern explizit den gewünschten Wert zu. Dadurch bleibt der gewählte Text erhalten, aber automatische Aktualisierungen werden bewusst gestoppt. Testen Sie auch die Zielanwendung, wenn deren eigene Feldneuberechnung Teil Ihres Workflows ist.
FAQ
Wie kann ich erkennen, ob eine angezeigte Nummer oder ein Datum ein Feld ist?
Untersuchen Sie Portion.field. Ein von None verschiedener Wert identifiziert ein Feld; der angezeigte Text allein kann dies nicht bestimmen.
Entfernt das Entfernen eines Feldes dessen Text oder Formatierung?
Nein. remove_field wandelt die vorhandene Portion in gewöhnlichen Text um. Weisen Sie anschließend einen expliziten Wert zu, wenn Sie ein bestimmtes festes Datum oder einen Fallback‑Wert benötigen.
Kann eine interne Zeichenkette ein neues Datumsformat oder eine Formel definieren?
Nein. Sie identifiziert einen Feldtyp. Ein unbekannter Kennzeichner liefert keinen Evaluator oder ein Python‑Datumsformat‑Muster. Verwenden Sie einen unterstützten vordefinierten Typ oder formatieren Sie den Wert selbst als gewöhnlichen Text.
Warum die Präsentation nach dem Speichern erneut prüfen?
Feldkennzeichner, berechneter Text und Formatierung sind getrennte Dinge, die geprüft werden müssen. Eine Formatkonvertierung kann das sichtbare Ergebnis ändern, selbst wenn der Feldkennzeichner noch vorhanden ist.