项目文件夹

文件
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

224 行
7.9 KiB
Markdown

# 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
```bash
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.
```bash
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.
```bash
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.
```bash
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.
```bash
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.
```bash
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.
```bash
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`
---
### 7 — Clickable Picture (link)
`link=` wraps the picture in a click hyperlink.
```bash
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>`.
```bash
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 | 1–7 |
| **src=:** file path (also URL / data-URI) | 1–7 |
| **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 | 4–6 |
| **wrap=none + behindText:** behind-text watermark | 4 |
| **hAlign / vAlign:** relative alignment keyword | 4, 5 |
| **hRelative / vRelative:** reference frame | 4–6 |
| **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
```bash
# 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.