Text Formatting: TextFrame Tools¶
Reference for the textframe tool's actions — set-text, get-text, find-text, replace-text, set-font-size/get-font-size, set-bold/get-bold, set-font-color/get-font-color, set-italic/get-italic, set-underline/get-underline, set-font-name/get-font-name, set-alignment/get-alignment, set-bullet/get-bullet, set-autosize/get-autosize — all operate on a shape's text frame.
Actions¶
| Tool | Action | Parameters | Notes |
|---|---|---|---|
textframe | set-text | presentation_session_id, slide_index, shape_index, text | Replaces the shape's entire text content. |
textframe | get-text | presentation_session_id, slide_index, shape_index | Reads current text (text) — use before editing to avoid clobbering unrelated content. |
textframe | find-text | presentation_session_id, slide_index, shape_index, find_what, optional match_case, whole_words | Returns matchCount and matches containing start, length, text. Does not edit. |
textframe | replace-text | presentation_session_id, slide_index, shape_index, find_what, replace_what, optional match_case, whole_words | Replaces all original non-overlapping matches and returns replacementCount. An explicit empty replacement deletes matches. |
textframe | set-font-size | presentation_session_id, slide_index, shape_index, font_size (points) | Applies to the shape's entire text range, not a substring. |
textframe | get-font-size | presentation_session_id, slide_index, shape_index | Returns fontSize. Fails if the value is mixed across the text range. |
textframe | set-bold | presentation_session_id, slide_index, shape_index, bold (bool) | Applies to the entire text range. |
textframe | get-bold | presentation_session_id, slide_index, shape_index | Returns bold. Fails if the value is mixed across the text range. |
textframe | set-font-color | presentation_session_id, slide_index, shape_index, red, green, blue (each 0-255) | RGB triplet, applies to the entire text range. |
textframe | get-font-color | presentation_session_id, slide_index, shape_index | Returns red, green, blue. Fails if the color is mixed across the text range. |
textframe | set-italic | presentation_session_id, slide_index, shape_index, italic (bool) | Applies to the entire text range. |
textframe | get-italic | presentation_session_id, slide_index, shape_index | Returns italic. |
textframe | set-underline | presentation_session_id, slide_index, shape_index, underline (bool) | Applies to the entire text range. |
textframe | get-underline | presentation_session_id, slide_index, shape_index | Returns underline. |
textframe | set-font-name | presentation_session_id, slide_index, shape_index, font_name | Sets the typeface (e.g. "Calibri", "Georgia"). No validation against installed fonts — an unrecognized name silently falls back to a substitute font in PowerPoint. |
textframe | get-font-name | presentation_session_id, slide_index, shape_index | Returns fontName. |
textframe | set-alignment | presentation_session_id, slide_index, shape_index, alignment | Sets paragraph alignment. alignment is a PpParagraphAlignment name (see below). |
textframe | get-alignment | presentation_session_id, slide_index, shape_index | Returns alignment. Fails if paragraphs within the text range have mixed alignment. |
textframe | set-bullet | presentation_session_id, slide_index, shape_index, enabled (bool), optional character (single character) | Turns bullets on/off for every paragraph in the text range. When enabling, character sets the bullet glyph (e.g. "-", "•"); omit to keep the theme's default bullet. |
textframe | get-bullet | presentation_session_id, slide_index, shape_index | Returns bulletEnabled and bulletCharacter (null when bullets are off). |
textframe | set-autosize | presentation_session_id, slide_index, shape_index, auto_size | Sets the text frame's auto-fit behavior. auto_size is a PpAutoSize name (see below). |
textframe | get-autosize | presentation_session_id, slide_index, shape_index | Returns autoSize. Fails if the value is mixed across multiple shapes. |
Find and Replace Within One Shape¶
Select a text-bearing shape using its 1-based slide_index and shape_index. Both actions use literal PowerPoint matching, not regex or wildcard patterns. match_case and whole_words default to false; whole-word boundaries follow PowerPoint's native rules. Empty search text is invalid, but whitespace is literal. Missing replacement text is an error; an explicit replace_what: "" deletes matches.
find-text reports non-overlapping matches in ascending order. Each start is a 1-based PowerPoint character position in the original frame, with a length and the original matched text. No match is a successful result with zero matches.
replace-text collects original matches before editing, then replaces ranges from right to left. Inserted text is never searched again, including when it contains the search term. The count includes identical replacements. It does not assign a new string to the whole frame, preserving character formatting outside matched ranges. Replacement styling and paragraph merging when deleting paragraph breaks follow PowerPoint's native text editing behavior.
These actions do not traverse groups, tables, notes, other shapes, or other slides. A shape without a text frame returns an error. Unexpected COM failures can leave partial edits; no transactional rollback is promised. Save explicitly when done.
textframe(action: "find-text", presentation_session_id: ..., slide_index: 1, shape_index: 2, find_what: "Draft", whole_words: true)
textframe(action: "replace-text", presentation_session_id: ..., slide_index: 1, shape_index: 2, find_what: "Draft", replace_what: "Final", whole_words: true)
CLI equivalents use pptcli textframe find-text / replace-text, --session, --slide-index, --shape-index, --find-what, --replace-what, --match-case, and --whole-words. Use live --help for exact option syntax.
Paragraph Alignment Names¶
alignment for set-alignment must match a real PpParagraphAlignment enum member name exactly: ppAlignLeft, ppAlignCenter, ppAlignRight, ppAlignJustify, ppAlignDistribute, ppAlignThaiDistribute, ppAlignJustifyLow. Passing an unrecognized string returns success: false.
Auto-Fit / Auto-Size¶
auto_size for set-autosize must match a real PpAutoSize enum member name exactly:
auto_size | Behavior |
|---|---|
ppAutoSizeNone | No auto-fit — text can overflow the shape's bounds (the default for most shapes). |
ppAutoSizeShapeToFitText | The shape grows/shrinks to fit its text; text stays at its set font size. |
ppAutoSizeTextToFitShape | The text shrinks (font scales down) to fit inside a fixed-size shape — PowerPoint's "Shrink text on overflow". |
Passing an unrecognized string returns success: false. Set this after set-text and any font-size changes — ppAutoSizeTextToFitShape computes the shrink factor from whatever text is in the frame at the moment PowerPoint next reflows it.
textframe(action: "set-text", presentation_session_id: ..., slide_index: ..., shape_index: ..., text: "A long paragraph that might overflow the box...")
textframe(action: "set-autosize", presentation_session_id: ..., slide_index: ..., shape_index: ..., auto_size: "ppAutoSizeTextToFitShape")
Whole-Range Formatting Only¶
These formatting actions apply to a shape's entire text frame — there is no API here for formatting a substring or a specific run of characters within one text box. If a slide needs mixed formatting (e.g., a bold label next to plain description text), use separate text boxes positioned next to each other rather than trying to mix runs inside one shape:
CORRECT — two text boxes for mixed emphasis
shape(action: "add-text-box", presentation_session_id: ..., slide_index: ..., left: 50, top: 100, width: 150, height: 30, text: "Revenue:")
textframe(action: "set-bold", presentation_session_id: ..., slide_index: ..., shape_index: <label shapeIndex>, bold: true)
shape(action: "add-text-box", presentation_session_id: ..., slide_index: ..., left: 210, top: 100, width: 300, height: 30, text: "$2.4M, up 12%")
Bullet Lists¶
Use textframe(action: "set-bullet", ...) for native PowerPoint bullets — it applies PowerPoint's own bullet glyph and per-paragraph indent, unlike a plain leading -/• character embedded in text. Put each bullet item on its own line (\n-separated) in the text parameter first, then turn bullets on for the whole text range:
textframe(action: "set-text", presentation_session_id: ..., slide_index: ..., shape_index: ...,
text: "Revenue grew 24% year over year\nAPAC now the fastest-growing region\nRetention held steady at 91%")
textframe(action: "set-bullet", presentation_session_id: ..., slide_index: ..., shape_index: ..., enabled: true)
If a specific bullet glyph is required (e.g. a dash instead of the theme's default), pass character: textframe(action: "set-bullet", ..., enabled: true, character: "-").
Font Size Guidance¶
| Element | Suggested font_size |
|---|---|
| Slide title | 28-40 |
| Subtitle | 18-24 |
| Body text | 14-18 |
| Table cell text | see tables.md |
| Captions / footnotes | 10-12 |
Keep to 2-3 distinct font sizes per slide; titles are typically bold, body text typically is not.
Color Values¶
set-font-color takes three separate byte parameters (red, green, blue), each 0-255 — not a hex string. Convert a hex color to decimal triplets before calling:
Hex "4472C4" → red=68, green=114, blue=196
textframe(action: "set-font-color", presentation_session_id: ..., slide_index: ..., shape_index: ..., red: 68, green: 114, blue: 196)
Read Before You Overwrite¶
set-text replaces the whole text frame content. For a literal substring edit, use find-text followed by replace-text to avoid rewriting unrelated character formatting. To append text, call get-text first, compose the full new string yourself, and pass the complete result to set-text; there is no append/insert operation.
textframe(action: "get-text", presentation_session_id: ..., slide_index: ..., shape_index: ...) → "Q3 Results"
textframe(action: "set-text", presentation_session_id: ..., slide_index: ..., shape_index: ..., text: "Q3 Results (Final)")
Verify Text Fit¶
After setting text and font size, export the slide (see export-and-verify.md) to confirm the text fits inside the shape's width/height without visually overflowing. Use set-autosize (see "Auto-Fit / Auto-Size" above) to have PowerPoint handle overflow automatically instead of manually tuning size — ppAutoSizeTextToFitShape shrinks the font to fit a fixed box, ppAutoSizeShapeToFitText grows the box to fit the text. Without auto-size set (ppAutoSizeNone, the default), text can overflow: shorten the text, reduce font_size, or grow the shape with shape(action: "set-size", ...).