Files
wehub-resource-sync 8cb1f9f479
Publish SDK (PyPI) / publish (push) Has been cancelled
Publish SDK (npm) / publish (@aionui/officecli-sdk) (push) Has been cancelled
SDK smoke / smoke (windows-latest) (push) Has been cancelled
Publish SDK (npm) / publish (@officecli/officecli-sdk) (push) Has been cancelled
Publish SDK (npm) / publish (@officecli/sdk) (push) Has been cancelled
Publish SDK (npm) / publish (officecli-sdk) (push) Has been cancelled
SDK smoke / smoke (macos-latest) (push) Has been cancelled
SDK smoke / smoke (ubuntu-latest) (push) Has been cancelled
Skill parity / diff (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:09:29 +08:00

7.9 KiB
Raw Permalink Blame History

Word Pictures

This demo consists of several files that work together:

  • pictures.sh — CLI script that synthesizes two sample PNGs (a square logo, a wide banner) and drives officecli to build the document.
  • pictures.py — Python SDK twin of pictures.sh; produces an equivalent pictures.docx.
  • pictures.docx — The generated document (inline, cropped, alt-text, watermark, wrapped, positioned, and clickable pictures).
  • pictures-logo.png / pictures-banner.png — The generated sample images, embedded into the document.
  • pictures.md — This file. Maps each section to the picture features it demonstrates.

Regenerate

cd examples/word
pip install Pillow   # required for sample image generation
bash pictures.sh
# → pictures.docx  (+ pictures-logo.png, pictures-banner.png)

How docx pictures are addressed

A picture in Word is a run inside a paragraph. So you add --type picture to a paragraph path (/body/p[N] or /body/p[@paraId=X]), and the picture's own path is that paragraph plus a run index (/body/p[@paraId=X]/r[N]).

  • Inline (default) — the picture sits in the text flow like a large glyph.
  • Floating — pass --prop anchor=true to unlock wrap, behindText, hAlign / vAlign, hPosition / vPosition, hRelative / vRelative.

Sections

1 — Inline Picture

An inline picture flows with the paragraph text; only width / height (always unit-qualified) apply.

officecli add pictures.docx /body --type paragraph --prop text="1. Inline Picture" --prop style=Heading1
officecli add pictures.docx /body --type paragraph --prop text="An inline picture flows with the paragraph text ..."
officecli add pictures.docx /body --type paragraph --prop text=""
officecli add pictures.docx '/body/p[3]' --type picture \
  --prop src=pictures-logo.png \
  --prop width=3cm --prop height=3cm

Features: --type picture, src (file path / URL / data-URI), width / height (unit-qualified — always pass cm/in/pt; a bare number is raw EMU)


2 — Cropped Picture

crop=L,T,R,B trims each edge by a percentage of the source image.

officecli add pictures.docx '/body/p[6]' --type picture \
  --prop src=pictures-banner.png \
  --prop crop=10,5,15,8 \
  --prop width=10cm --prop height=2.5cm

Features: crop (1 value = symmetric, or 4 values L,T,R,B = per-edge percent); per-edge cropLeft / cropTop / cropRight / cropBottom accepted on add/set. Get folds all sides into the canonical 4-value crop key.


3 — Alt Text (Accessibility)

alt= writes the DocProperties description that screen readers announce.

officecli add pictures.docx '/body/p[9]' --type picture \
  --prop src=pictures-logo.png \
  --prop width=3cm --prop height=3cm \
  --prop alt="Company logo: a blue circle enclosing a yellow triangle"

Features: alt (alternative text; aliases altText, description). When omitted, no description is written (an auto-filled filename is worse than none for screen readers).


4 — Behind-Text Watermark

A floating picture with wrap=none + behindText=true sits behind the text like a watermark, centered on the page margins.

officecli add pictures.docx '/body/p[11]' --type picture \
  --prop src=pictures-banner.png \
  --prop anchor=true --prop wrap=none --prop behindText=true \
  --prop hAlign=center --prop vAlign=center \
  --prop hRelative=margin --prop vRelative=margin \
  --prop width=12cm --prop height=3cm \
  --prop alt="Decorative watermark banner"

Features: anchor=true (floating), wrap=none + behindText=true (behind-text z-order), hAlign / vAlign (relative alignment keyword), hRelative / vRelative (reference frame)


5 — Square Text Wrap

With wrap=square, surrounding text flows around the picture's bounding box. Here the picture is right-aligned to the margin so the paragraph wraps down its left side.

officecli add pictures.docx '/body/p[13]' --type picture \
  --prop src=pictures-logo.png \
  --prop anchor=true --prop wrap=square \
  --prop hAlign=right --prop hRelative=margin --prop vRelative=paragraph \
  --prop width=3.5cm --prop height=3.5cm \
  --prop alt="Logo floated right with square wrap"

Features: wrap (none, square, tight, topandbottom, through), hAlign=right relative to the margin frame


6 — Absolute Position (hPosition / vPosition)

Instead of relative alignment, pin a floating picture to an absolute offset from its reference frame. wrap=tight makes text hug the boundary.

officecli add pictures.docx '/body/p[15]' --type picture \
  --prop src=pictures-logo.png \
  --prop anchor=true --prop wrap=tight \
  --prop hPosition=2cm --prop vPosition=1cm \
  --prop hRelative=margin --prop vRelative=paragraph \
  --prop width=3cm --prop height=3cm \
  --prop alt="Logo at absolute 2cm,1cm offset with tight wrap"

Features: hPosition / vPosition (absolute offset — always unit-qualified; a bare number is raw EMU), wrap=tight


link= wraps the picture in a click hyperlink.

officecli add pictures.docx '/body/p[18]' --type picture \
  --prop src=pictures-banner.png \
  --prop width=10cm --prop height=2.5cm \
  --prop link="https://example.com" \
  --prop alt="Banner linking to example.com"

Features: link (absolute URL → external relationship; #anchor or bookmark name → internal jump)


8 — Decorative Picture (accessibility)

decorative=true marks the image as decorative: screen readers skip it entirely (no alt text is announced). Stored as an adec:decorative extension under the picture's <wp:docPr>.

officecli add pictures.docx '/body/p[21]' --type picture \
  --prop src=pictures-banner.png \
  --prop width=10cm --prop height=2.5cm \
  --prop decorative=true

get reports decorative=true (only when the flag is set). decorative also works via set. Use it for purely ornamental images that carry no information.

Features: decorative (accessibility — screen readers skip the image)


Complete Feature Coverage

Feature Section
inline picture: default text-flow placement 1
width / height: unit-qualified sizing 17
src=: file path (also URL / data-URI) 17
crop=L,T,R,B: per-edge crop percent 2
cropLeft / cropTop / cropRight / cropBottom: named per-edge (add/set) 2
alt=: accessibility description 3
anchor=true: floating picture 46
wrap=none + behindText: behind-text watermark 4
hAlign / vAlign: relative alignment keyword 4, 5
hRelative / vRelative: reference frame 46
wrap=square: text flows around bounding box 5
wrap=tight: text hugs boundary 6
hPosition / vPosition: absolute offset 6
link=: clickable image hyperlink 7
decorative=true: mark decorative (screen readers skip) 8

Inspect the Generated File

# List every picture with its stable run path and key props
officecli query pictures.docx picture

# Inline picture (section 1) — width/height/wrap=inline
officecli get pictures.docx '/body/p[3]/r[2]'

# Cropped banner (section 2) — crop=10,5,15,8
officecli get pictures.docx '/body/p[6]/r[2]'

# Alt text (section 3)
officecli get pictures.docx '/body/p[9]/r[2]'

# Behind-text watermark (section 4) — anchor/behindText/hAlign/vAlign
officecli get pictures.docx '/body/p[11]/r[2]'

# Square wrap, right-aligned (section 5)
officecli get pictures.docx '/body/p[13]/r[2]'

# Absolute position + tight wrap (section 6) — hPosition/vPosition
officecli get pictures.docx '/body/p[15]/r[2]'

# Clickable banner (section 7) — link=
officecli get pictures.docx '/body/p[18]/r[2]'

Note on paths: the /body/p[N]/r[2] positional paths above assume a freshly generated file. officecli query pictures.docx picture prints the authoritative @paraId paths, which are stable across edits.