跳到主要内容
知仓学习社ZHICANG

docx-creator

>-

写文件严重 0 · 高危 1daymade/claude-code-skills

它会碰到什么

扫了多少5 个文本文件,66 KB
它会碰到什么写文件
命中总数1 处
命中统计严重 0 · 高 1 · 中 0 · 低 0
逐条看命中(1 条严重或高危)
  • references/verification_protocol.md:118fs-destructive
    rm -rf /tmp/docxcheck && mkdir -p /tmp/docxcheck

这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。

技能内容

DOCX Creator

Thin incremental layer over minimax-skills:minimax-docx. Not a document engine.

> Read this first. The OpenXML SDK capability lives in minimax-docx. This skill contains

> zero engine code. What it contains is the part that took a full debugging session to learn:

> where that engine's CLI stops being usable, how to drive its SDK correctly for Chinese formal

> documents, and how to verify the output so you don't ship a file that looks fine to you and

> broken in Word.

Division of labor

| Layer | Owner | What lives there |

|---|---|---|

| OpenXML SDK (DocumentFormat.OpenXml), WordprocessingDocument API, XSD validator, style templates, OpenXML encyclopedia | minimax-skills:minimax-docx | Engine + reference docs. Never duplicated here. |

| Where the CLI's expressiveness ceiling is, and when to abandon it for C# | this skill | ISSUE-001, ISSUE-002 |

| A verified markdown-to-docx generator for Chinese formal documents | this skill | scripts/Program.cs |

| Chinese formal-document typography rules that OpenXML lets you get wrong | this skill | Hard rules below + ISSUE-004…007 |

| Real end-to-end visual verification chain | this skill | references/verification_protocol.md |

Locate the engine at the marketplace install path, typically

~/.claude/plugins/marketplaces/minimax-skills/skills/minimax-docx/.

Go read minimax-docx directly for anything structural this skill does not cover — images,

track changes, comments, TOC, multi-section layouts, template application. Its

minimax-docx/references/ folder (cjk_typography.md, openxml_element_order.md,

openxml_units.md, troubleshooting.md) and its Samples/*.cs are the authority for SDK

patterns. Do not reinvent them here.

Routing: which path for this document?

| Situation | Path |

|---|---|

| Chinese contract / agreement / 公文 / any doc with 甲乙方 info blocks, numbered clauses, signature block, tables | C# OpenXML via scripts/Program.cs (this skill) |

| Plain prose, headings and paragraphs only, no bold / lists / tables | minimax-docx CLI create --content-json is enough |

| Fill or edit an existing .docx | minimax-docx pipeline B (edit-content), plus this skill's layout and verification guidance |

| Match an existing .docx's formatting | minimax-docx pipeline C (apply-template) |

| Existing Word/WPS → repaired layout / selected excerpt → PDF | Keep the Word source; follow references/word-to-pdf.md and references/verification_protocol.md |

| Markdown → PDF | daymade-docs:pdf-creator |

Rule of thumb: the CLI's --content-json understands exactly three block types

(heading, paragraph, pagebreak). Bold, lists, tables, borders, footers, fonts,

alignment — none of it is expressible. A Chinese contract needs all of them. See ISSUE-001.

Quick start

The generator reads markdown and writes a formatted .docx. Copy it next to your document so

build artifacts stay out of the skill directory:

# 1. Stage the generator beside your markdown
mkdir -p _docxgen && cp <skill-dir>/scripts/Program.cs <skill-dir>/scripts/mmdocx-gen.csproj \
   <skill-dir>/scripts/.gitignore _docxgen/

# 2. Generate (first run restores DocumentFormat.OpenXml + Markdig, ~20s)
dotnet run --project _docxgen -- your-doc.md your-doc.docx

# 3. Structural validation via the engine's XSD validator (note the roll-forward env — ISSUE-003)
DOTNET_ROLL_FORWARD=Major dotnet run \
  --project ~/.claude/plugins/marketplaces/minimax-skills/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli \
  -- validate --input your-doc.docx

# 4. MANDATORY visual verification — never skip, never substitute qlmanage
soffice --headless --convert-to pdf --outdir /tmp/docxcheck your-doc.docx
pdftoppm -png -r 100 /tmp/docxcheck/your-doc.pdf /tmp/docxcheck/page
# then Read every /tmp/docxcheck/page-NN.png

# 5. MANDATORY if Microsoft Word.app is installed — LibreOffice cannot see ISSUE-012
open -a "Microsoft Word" your-doc.docx   # check the title bar for "兼容性模式", check every page

Full command details and troubleshooting: scripts/README.md.

Full verification steps and pass/fail criteria: references/verification_protocol.md.

Hard rules (violating these means rework)

1. Alignment is layered — this is the expensive one

Never justify the whole document. Three layers, three alignments:

| Content | Alignment | Why |

|---|---|---|

| Document title (H1) | Center | Convention |

| Clause headings (H2+) | Left | Convention |

| Info blocks and signature blocks — 甲方/乙方/统一社会信用代码/法定代表人/日期, i.e. any paragraph whose lines are joined by markdown soft or hard line breaks | Left | Justification stretches every line except the paragraph's last. A multi-line info block is one paragraph, so all but its final line get blown out into huge inter-character gaps. |

| Ordinary body prose | Justified (Both) | Clean right edge |

The rule is machine-checkable, so do not eyeball it: if the markdown paragraph's inline tree

contains a LineBreakInline, left-align that paragraph; otherwise justify it. Implemented in

the case ParagraphBlock p: arm of Main's block-dispatch switch, with the break detection in

InlineRuns. (Line numbers are deliberately not given here — they drift every time the file

grows; see scripts/README.md's function-name lookup table instead.) Full write-up: ISSUE-004.

2. Independent lists restart; continuations retain numbering

Each independent markdown list must get its own NumId plus a LevelOverride carrying

StartOverrideNumberingValue = 1. Reuse one NumId across clauses and clause 3's list

silently continues from 4. Implemented across the case ListBlock lb: arm and the

NumberingDefinitionsPart setup — see scripts/README.md's lookup table for both.

Two SDK traps come with it (wrong class name, wrong element order) — ISSUE-005, ISSUE-006.

For existing Word lists, preserve intentional continuations. Resolve numId and its level

before changing geometry; numId=0 disables numbering. Typed ordinals are text, not an

automatic list. See ISSUE-016.

3. CJK fonts need both slots

A run must set RunFonts { Ascii, HighAnsi, EastAsia }. Setting only the Latin slots leaves

Chinese characters to Word's fallback, and the document renders in whatever the reader's

machine picks. Shipped defaults: Latin Times New Roman; East Asian 宋体 for body, 黑体 for

headings. Chinese bold runs switch family to 黑体 — 宋体 has no true bold weight and

renderer-synthesized bold smears multi-stroke characters (ISSUE-014). Sizes are OpenXML

half-points — body 21 (10.5pt, the common Chinese manuscript size), H1 36 (18pt), clause

heading 28 (14pt). Body paragraphs also get a 2-character first-line indent (420 twips at

10.5pt — change it in lockstep with the body size). ISSUE-007.

4. Page and table basics

A4 is 11906 × 16838 twips with 1440 twip margins; page number goes in a centered footer

PAGE field. Tables need all six borders (top/bottom/left/right/insideH/insideV,

in that ECMA-376 order — ISSUE-013) and a tblGrid (ISSUE-012) — set fewer borders and cells

look unruled in print; omit tblGrid and the file fails strict validation even though

LibreOffice hides it. Implemented in BuildTable and the SectionProperties/FooterPart

setup in Main — see scripts/README.md's lookup table.

Verification is not optional

Banned: qlmanage thumbnails as visual proof. macOS Quick Look renders with a different

engine than Word and will happily show a clean-looking page for a document whose info blocks

are stretched apart. A document was declared "verified perfect" on qlmanage evidence and

opened broken in Word — that is the origin of this rule. ISSUE-008.

Required chain: generate → XSD validate → soffice --headless --convert-to pdf

pdftoppm -pngRead every page image → check the five failure modes

(info blocks not stretched / each list restarting at 1 / table borders present / signature

block intact / no orphaned pagination) → **if Microsoft Word.app is installed, open the actual

file in it and check the title bar for "兼容性模式" plus every page**. Details, prerequisites

and the "what counts as failure" list: references/verification_protocol.md.

LibreOffice rendering clean is not the same claim as "Word renders this correctly."

ISSUE-012 is a real, reproduced case where a file passed every LibreOffice-based check in this

chain — clean info blocks, correct numbering, intact tables — and still opened in real Word

with "兼容性模式" in the title bar and phantom bullet markers on paragraphs that were never

given any numbering. LibreOffice has no equivalent fallback path and is structurally unable to

surface that class of defect. This is ISSUE-008's own lesson (a lenient renderer hides what

Word does) recurring one layer up; treat LibreOffice-only verification as incomplete whenever

Word is available to check against directly.

Before overwriting a delivered .docx, check for a sibling ~$<name>.docx — that is Word's

owner lock, meaning the recipient has the old version open. Overwriting works, but they will

keep seeing the stale document until they close and reopen it. Tell them. ISSUE-011.

Customizing

scripts/Program.cs is ~260 lines of straightforward OpenXML. Edit it directly for fonts,

sizes, spacing, borders, or new block types — that is the intended workflow. Before adding a

structural feature (images, TOC, headers, track changes), read the corresponding

Samples/*.cs in minimax-docx first; those patterns are SDK-version-verified and will save

you a compile-error loop.

**If you append a new property to RunProperties, ParagraphProperties, TableProperties,

TableCellProperties, or TableBorders: it must go in ECMA-376's child-element order for

that parent, not wherever .Append() reads naturally in the C#.** This is not a style

preference — get it wrong and you reproduce ISSUE-012/ISSUE-013: minimax-docx validate still

reports PASSED, LibreOffice still renders the file cleanly, and real Word still opens it in

Compatibility Mode with unrequested formatting scattered across the document. The current code

already carries a schema-order comment at each construction site (RunProps, Para,

BuildTable) — extend the existing property list in place rather than appending after it, and

if you add a genuinely new element, look up its position in openxml_element_order.md

(minimax-docx) before deciding where the .Append() call goes. Re-run Step 3a of the

verification protocol (real Word, not just LibreOffice) after any such change — that is the

only check in the whole chain that would have caught this class of bug.

References

  • references/word-to-pdf.md — existing Word source, excerpt selection, accepted revisions,

layout repair and PDF delivery; no Markdown round-trip.

  • references/known_issues.md — symptom / root cause / fix / verification for

every trap hit while building this pipeline. Read before debugging anything.

  • references/verification_protocol.md — the full end-to-end verification chain, its

prerequisites, its pass criteria, and the substitutions that are forbidden.

  • scripts/README.md — how to run the generator, what markdown it supports, environment

requirements.

想直接用这个技能?

本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。