pdf · diff

v1.0 to v1.0

71 added, 185 removed. Audit A to A.

---
name: pdf
description: >
- Create, read, edit, fill, or reformat PDF files. Use this skill for PDF output.
- CREATE (generate from scratch): "make a PDF", "generate a report", "write a proposal",
- "create a resume", "beautiful PDF", "professional document", "cover page",
- "polished PDF", "client-ready document".
- FILL (complete form fields): "fill in the form", "fill out this PDF",
- "complete the form fields", "write values into PDF", "what fields does this PDF have".
- REFORMAT (apply design to an existing doc): "reformat this document", "apply our style",
- "convert this Markdown/text to PDF", "make this doc look good", "re-style this PDF".
- This skill uses a token-based design system: color, typography, and spacing are derived
- from the document type and flow through every page. The output is print-ready.
- For a PDF companion to a Word document, render that DOCX through ../docx/SKILL.md
- so both deliverables retain the same content and layout.
+ Create, fill, or reformat PDF files, including research and technical reports with
+ tables, charts, equations, citations, figures, code, and flowcharts. Use for
+ "make a PDF", "write a proposal", "professional document", "cover page",
+ "fill in this PDF form", "what fields does this PDF have", "reformat this
+ document", or "convert this Markdown/text to PDF". Distinguish named manuscript
+ requirements (APA, IEEE, journal/institution templates) from visual presets:
+ --type academic is appearance, not standards compliance or research expertise.
+ For a PDF companion to Word, render the DOCX through ../docx/SKILL.md so both
+ requested deliverables retain the same content and layout.
license: MIT
metadata:
version: "1.0"
category: document-generation
---
- # pdf
-
- Three tasks. One skill.
-
- ## Environment and delivery
-
- Set `SKILL_DIR` to the absolute directory containing this file (the `pdf/`
- subdirectory of the Office package). Resolve reference paths relative to it.
-
- Run `bash "$SKILL_DIR/scripts/make.sh" check` once per session before CREATE/REFORMAT.
- It verifies an actual Chromium launch. If needed, install dependencies with
- `bash "$SKILL_DIR/scripts/make.sh" fix` in an activated Python virtual environment; on Linux,
- Chromium may also need `npx playwright install-deps chromium`.
- FILL and read-only inspection need Python and `pypdf`, not the browser pipeline.
- Read only the guide and scripts relevant to the selected route. Explicit user
- or template formatting takes precedence over the design defaults.
-
- For a user-requested rendered preview or visual review,
- use `pdftoppm -png -r 120 output.pdf preview/page` (create `preview/` first) and
- inspect the images.
-
- ## Read `design/design.md` before any CREATE or REFORMAT work.
-
- ---
-
- ## Route table
-
- | User intent | Route | Scripts used |
- |---|---|---|
- | Generate a new PDF from scratch | **CREATE** | `palette.py` → `cover.py` → `render_cover.js` → `render_body.py` → `merge.py` |
- | Fill / complete form fields in an existing PDF | **FILL** | `fill_inspect.py` → `fill_write.py` |
- | Reformat / re-style an existing document | **REFORMAT** | `reformat_parse.py` → then full CREATE pipeline |
-
- **Rule:** when in doubt between CREATE and REFORMAT, ask whether the user has an existing document to start from. If yes → REFORMAT. If no → CREATE.
-
- ---
-
- ## Route A: CREATE
-
- Full pipeline — content → design tokens → cover → body → merged PDF.
-
- ```bash
- bash "$SKILL_DIR/scripts/make.sh" run \
- --title "Q3 Strategy Review" --type proposal \
- --author "Strategy Team" --date "October 2025" \
- --accent "#2D5F8A" \
- --content content.json --out report.pdf
- ```
-
- **Doc types:** `report` · `proposal` · `resume` · `portfolio` · `academic` · `general` · `minimal` · `stripe` · `diagonal` · `frame` · `editorial` · `magazine` · `darkroom` · `terminal` · `poster`
-
- | Type | Cover pattern | Visual identity |
- |---|---|---|
- | `report` | `fullbleed` | Dark bg, dot grid, Playfair Display |
- | `proposal` | `split` | Left panel + right geometric, Syne |
- | `resume` | `typographic` | Oversized first-word, DM Serif Display |
- | `portfolio` | `atmospheric` | Near-black, radial glow, Fraunces |
- | `academic` | `typographic` | Light bg, classical serif, EB Garamond |
- | `general` | `fullbleed` | Dark slate, Outfit |
- | `minimal` | `minimal` | White + single 8px accent bar, Cormorant Garamond |
- | `stripe` | `stripe` | 3 bold horizontal color bands, Barlow Condensed |
- | `diagonal` | `diagonal` | SVG angled cut, dark/light halves, Montserrat |
- | `frame` | `frame` | Inset border, corner ornaments, Cormorant |
- | `editorial` | `editorial` | Ghost letter, all-caps title, Bebas Neue |
- | `magazine` | `magazine` | Warm cream bg, centered stack, hero image, Playfair Display |
- | `darkroom` | `darkroom` | Navy bg, centered stack, grayscale image, Playfair Display |
- | `terminal` | `terminal` | Near-black, grid lines, monospace, neon green |
- | `poster` | `poster` | White bg, thick sidebar, oversized title, Barlow Condensed |
-
- Cover extras (inject into tokens via `--abstract`, `--cover-image`):
- - `--abstract "text"` — abstract text block on the cover (magazine/darkroom)
- - `--cover-image "url"` — hero image URL/path (magazine, darkroom, poster)
+ # PDF
- **Color overrides — always choose these based on document content:**
- - `--accent "#HEX"` — override the accent color; `accent_lt` is auto-derived by lightening toward white
- - `--cover-bg "#HEX"` — override the cover background color
+ ## 1. Common requirements
- **Accent color selection guidance:**
+ Set `SKILL_DIR` to the absolute directory containing this file, not the task's
+ working directory. Identify output format(s), source, content features and
+ formatting requirements first. Deliver only the requested format(s); an internal
+ DOCX authoring file is not automatically an extra deliverable.
- You have creative authority over the accent color. Pick it from the document's semantic context — title, industry, purpose, audience — not from generic "safe" choices. The accent appears on section rules, callout bars, table headers, and the cover: it carries the document's visual identity.
+ Honor explicit requirements and supplied templates, including typography, colors,
+ cover/no-cover layout, spacing, and numbering. Do not silently substitute a
+ preset. Verify actual capabilities and disclose unavailable fonts or unsupported
+ requirements. Presets do not supply research, finance, legal or medical expertise
+ or standards certification.
- | Context | Suggested accent range |
- |---|---|
- | Legal / compliance / finance | Deep navy `#1C3A5E`, charcoal `#2E3440`, slate `#3D4C5E` |
- | Healthcare / medical | Teal-green `#2A6B5A`, cool green `#3A7D6A` |
- | Technology / engineering | Steel blue `#2D5F8A`, indigo `#3D4F8A` |
- | Environmental / sustainability | Forest `#2E5E3A`, olive `#4A5E2A` |
- | Creative / arts / culture | Burgundy `#6B2A35`, plum `#5A2A6B`, terracotta `#8A3A2A` |
- | Academic / research | Deep teal `#2A5A6B`, library blue `#2A4A6B` |
- | Corporate / neutral | Slate `#3D4A5A`, graphite `#444C56` |
- | Luxury / premium | Warm black `#1A1208`, deep bronze `#4A3820` |
+ ## 2. Named manuscript requirement or visual preset
- **Rule:** choose a color that a thoughtful designer would select for this specific document — not the type's default. Muted, desaturated tones work best; avoid vivid primaries. When in doubt, go darker and more neutral.
+ - **Named manuscript:** for strict APA, IEEE or a journal/institution template,
+ select capable authoring per [requirement profiles](references/domains/profiles.md).
+ `--type academic` does **not** implement APA/IEEE. Consider
+ [DOCX](../docx/SKILL.md) and PDF export when appropriate; verify its actual fonts
+ and layout too, rather than claiming unsupported compliance.
+ - **Visual-only:** for a generic, nonstandard academic-looking PDF or another
+ designed report, read [presentation](references/common/presentation.md) before
+ CREATE/REFORMAT. It owns supported preset names, tokens and overrides.
+ - **DOCX companion control:** render the authored DOCX through its own route;
+ do not independently redesign the PDF with this pipeline.
- **content.json block types:**
+ ## 3. Select the operation
- | Block | Usage | Key fields |
+ | Authorized task | Direct workflow | Existing implementation |
|---|---|---|
- | `h1` | Section heading + accent rule | `text` |
- | `h2` | Subsection heading | `text` |
- | `h3` | Sub-subsection (bold) | `text` |
- | `body` | Justified paragraph; supports `<b>` `<i>` markup | `text` |
- | `bullet` | Unordered list item (• prefix) | `text` |
- | `numbered` | Ordered list item — counter auto-resets on non-numbered blocks | `text` |
- | `callout` | Highlighted insight box with accent left bar | `text` |
- | `table` | Data table — accent header, alternating row tints | `headers`, `rows`, `col_widths`?, `caption`? |
- | `image` | Embedded image scaled to column width | `path`/`src`, `caption`? |
- | `figure` | Image with auto-numbered "Figure N:" caption | `path`/`src`, `caption`? |
- | `code` | Monospace code block with accent left border | `text`, `language`? |
- | `math` | Display math — LaTeX syntax via matplotlib mathtext | `text`, `label`?, `caption`? |
- | `chart` | Bar / line / pie chart rendered with matplotlib | `chart_type`, `labels`, `datasets`, `title`?, `x_label`?, `y_label`?, `caption`?, `figure`? |
- | `flowchart` | Process diagram with nodes + edges via matplotlib | `nodes`, `edges`, `caption`?, `figure`? |
- | `bibliography` | Numbered reference list with hanging indent | `items` [{id, text}], `title`? |
- | `divider` | Accent-colored full-width rule | — |
- | `caption` | Small muted label | `text` |
- | `pagebreak` | Force a new page | — |
- | `spacer` | Vertical whitespace | `pt` (default 12) |
-
- **chart / flowchart schemas:**
- ```json
- {"type":"chart","chart_type":"bar","labels":["Q1","Q2","Q3","Q4"],
- "datasets":[{"label":"Revenue","values":[120,145,132,178]}],"caption":"Q results"}
-
- {"type":"flowchart",
- "nodes":[{"id":"s","label":"Start","shape":"oval"},
- {"id":"p","label":"Process","shape":"rect"},
- {"id":"d","label":"Valid?","shape":"diamond"},
- {"id":"e","label":"End","shape":"oval"}],
- "edges":[{"from":"s","to":"p"},{"from":"p","to":"d"},
- {"from":"d","to":"e","label":"Yes"},{"from":"d","to":"p","label":"No"}]}
-
- {"type":"bibliography","items":[
- {"id":"1","text":"Author (Year). Title. Publisher."}]}
- ```
-
- ---
+ | New cover/body PDF | [Route A: CREATE](references/operations/create.md) | `palette.py` → `cover.py` → `render_cover.js` → `render_body.py` → `merge.py` |
+ | Form inspection or filling | [Route B: FILL](references/operations/fill.md) | `fill_inspect.py` → `fill_write.py` |
+ | Requested redesign of an existing document | [Route C: REFORMAT](references/operations/reformat.md) | `reformat_parse.py` → CREATE |
+ | Completed output | [VALIDATE](references/operations/validate.md) | Reopen, source comparison and applicable actual-page QA |
- ## Route B: FILL
+ For a creation/redesign request, clarify whether a source exists if needed:
+ existing source → REFORMAT, no source → CREATE. FILL stays separate; an input
+ alone does not authorize redesign. These remain the three implemented operations,
+ with no new general READ, OCR, scans, signature or exact-layout editing workflow.
+ PDF text parsing is best-effort, not lossless layout or source reconstruction.
- Fill form fields in an existing PDF without altering layout or design.
+ Read [environment](references/implementation/environment.md) for only the selected
+ route. For this cover/body pipeline, run
+ `bash "$SKILL_DIR/scripts/make.sh" check` once per session before this pipeline's
+ CREATE/REFORMAT; it checks actual Chromium launch. A different authoring route uses
+ that route's setup and validation instead. DOCX-to-PDF does not require Chromium;
+ FILL and read-only inspection need Python/`pypdf`, not the browser pipeline: do
+ not make them install Chromium.
- ```bash
- # Step 1: inspect
- python3 "$SKILL_DIR/scripts/fill_inspect.py" --input form.pdf
+ ## Load content features directly
- # Step 2: fill
- python3 "$SKILL_DIR/scripts/fill_write.py" --input form.pdf --out filled.pdf \
- --values '{"FirstName": "Jane", "Agree": "true", "Country": "US"}'
- ```
+ For every CREATE/REFORMAT using this pipeline, read the
+ [block contract](references/implementation/content.md#block-contract), then only
+ applicable sections. This is the single block-schema authority; presentation
+ owns appearance, not duplicated fields. Follow the operation's workflow and
+ [actual output validation](references/operations/validate.md) before delivery.
- | Field type | Value format |
+ | Required feature | Direct reference |
|---|---|
- | `text` | Any string |
- | `checkbox` | `"true"` or `"false"` |
- | `dropdown` | Must match a choice value from inspect output |
- | `radio` | Must match a radio value (often starts with `/`) |
-
- Always run `fill_inspect.py` first to get exact field names.
-
- ---
-
- ## Route C: REFORMAT
-
- Parse an existing document → content.json → CREATE pipeline.
-
- ```bash
- bash "$SKILL_DIR/scripts/make.sh" reformat \
- --input source.md --title "My Report" --type report --out output.pdf
- ```
-
- **Supported input formats:** `.md` `.txt` `.pdf` `.json`
-
- ---
-
- ## Environment
+ | Headings, prose, lists, tables, breaks and spacing | [Common blocks and tables](references/implementation/content.md#common-blocks-and-tables) |
+ | Equations, labels and mathtext limits | [Mathematics](references/implementation/content.md#mathematics) |
+ | Charts, datasets and defaults | [Charts](references/implementation/content.md#charts) |
+ | Images, figures, captions and shared numbering | [Figures and captions](references/implementation/content.md#figures-and-captions) |
+ | Citations and references | [Bibliography](references/implementation/content.md#bibliography) |
+ | Code whitespace and language labels | [Code](references/implementation/content.md#code) |
+ | Process nodes, arrows and back-edges | [Flowcharts](references/implementation/content.md#flowcharts) |
+ | Delivered content features | [Feature-specific rendering QA](references/implementation/content.md#feature-specific-rendering-qa) |
- ```bash
- bash "$SKILL_DIR/scripts/make.sh" check # verify all deps
- bash "$SKILL_DIR/scripts/make.sh" fix # auto-install missing deps
- bash "$SKILL_DIR/scripts/make.sh" demo # build a sample PDF
- ```
+ ## Package organization
- | Tool | Used by | Install |
- |---|---|---|
- | Python 3.9+ | all `.py` scripts | system |
- | `reportlab` | `render_body.py` | `pip install reportlab` |
- | `pypdf` | fill, merge, reformat | `pip install pypdf` |
- | Node.js 18+ | `render_cover.js` | system |
- | `playwright` + Chromium | `render_cover.js` | `npm install -g playwright && npx playwright install chromium` |
+ `references/common/`, `domains/`, `operations/` and `implementation/` separate
+ appearance, applicable requirements, workflows and technical detail. All guides
+ are linked directly above; load only relevant files. `scripts/` entry points and
+ licenses remain in their existing locations. A successful check, merge or parser
+ call is not a substitute for inspecting content and actual pages; disclose
+ unexecuted checks.