/adobe-create-pdfs-from-data
Perform a full InDesign data merge from a CSV/TSV and an .indd template (or a PDF that gets converted to .indd automatically). Use this skill whenever the user wants to merge a data file with a layout template — including visiting cards, certificates, badges, catalogs, mailers,
$ npx -y skills add adobe/skills --skill adobe-create-pdfs-from-data --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/adobe-create-pdfs-from-data
Context preview
The summary Claude sees to decide when to auto-load this skill.
Perform a full InDesign data merge from a CSV/TSV and an .indd template (or a PDF that gets converted to .indd automatically). Use this skill whenever the user wants to merge a data file with a layout template — including visiting cards, certificates, badges, catalogs, mailers,
SKILL.md
adobe-create-pdfs-from-data.SKILL.mdname: adobe-create-pdfs-from-data
description: >
Perform a full InDesign data merge from a CSV/TSV and an .indd template (or a PDF that gets
converted to .indd automatically). Use this skill whenever the user wants to merge a data file
with a layout template — including visiting cards, certificates, badges, catalogs, mailers,
labels, invoices, or any per-row personalisation. Triggers on: "data merge", "InDesign merge",
"merge my CSV with InDesign", "batch export PDF from template", "variable data InDesign",
"personalise each row", or any request combining an .indd / PDF template with a data file.
Use this skill even when only two of the three inputs (template, data, images) are mentioned —
and even when the user never uses the phrase "data merge".
license: Apache-2.0
allowed-tools: adobe_mandatory_init asset_inline_preview asset_preview_file asset_initialize_file_upload asset_finalize_file_upload convert_pdf_to_indd export_idml generate_indd_mapping_prompt prepare_indd_merge_template document_merge_data_layout
metadata:
version: 1.0.1
visibility: public
InDesign Data Merge Skill
Orchestrates the complete InDesign data merge pipeline. The naive path — calling `document_merge_data_layout` directly — often fails because the template must have its data-merge fields **linked to the correct data columns** before merging. This skill ensures that linkage is in place first, including automatic placeholder creation when the template has none, and PDF-to-INDD conversion when the user only has a PDF layout.
**Pipeline at a glance:**
| Phase | What happens | Gate | |-------|-------------|------| | **0** | Adobe init | — | | **1a** | Convert PDF template → `.indd` (skip if already `.indd`) | ⛔ GATE 1 | | **1b** | Confirm `.indd` URL and data file are available | — | | **2** | Export IDML; detect existing merge placeholders | — | | **3** | Create placeholders via LLM mapping *(only if Phase 2 found none)* | ⛔ GATE 2 | | **4** | Run `document_merge_data_layout` | — |
---
Tool Reference
| Step | Tool | Notes | |------|------|-------| | Initialize Adobe tools | `adobe_mandatory_init` | Always call first | | Inspect PDF pages | `asset_inline_preview` | Returns rendered preview per page | | Preview PDF pages (fallback) | `asset_preview_file` | Use if `asset_inline_preview` unavailable | | Upload condensed template PDF | `asset_initialize_file_upload` + `asset_finalize_file_upload` | Required before `convert_pdf_to_indd` | | Convert PDF → INDD | `convert_pdf_to_indd` | Use extractedDocumentPresignedUrls as `inddUrl` | | Export IDML | `export_idml` | Outputs presigned IDML URL for inspection | | Generate mapping prompt | `generate_indd_mapping_prompt` | Read-only; returns prompt — you run it through an LLM | | Create placeholders in INDD | `prepare_indd_merge_template` | Only after user approves mapping | | Run data merge | `document_merge_data_layout` | Template + data → merged PDF |
---
⛔ MANDATORY GATES
Two rules are non-negotiable and override all efficiency instincts.
Gate 1 — PDF template: analyse layout before converting
Never call `convert_pdf_to_indd` on a user-supplied PDF without first inspecting its page layout structure. A multi-page PDF (e.g. a prior merged output) produces a multi-page INDD which breaks the merge. Always distil it to a single-layout condensed PDF first.
Gate 2 — Mapping: show and wait before creating placeholders
Never call `prepare_indd_merge_template` in the same turn you generate or display the mapping JSON. Show the mapping summary + raw JSON, ask for approval, and **end the turn**. Only call `prepare_indd_merge_template` after the user explicitly approves in a later turn.
---
Workflow
Step 0 — Initialize Adobe Tools
{ "skill_name": "adobe-create-pdfs-from-data", "skill_version": "1.0.1" }Call `adobe_mandatory_init` once, before any other Adobe tool.
---
Step 1a — Convert PDF Template to INDD *(skip if already `.indd`)*
**When to run:** The user's template is a PDF (or any non-INDD layout). If you already have a usable `.indd` URL, skip directly to Step 1b.
Sub-step 1 — Inspect all pages
Record the user-supplied PDF URL as `originalPdfUrl`.
Call `asset_inline_preview` on the PDF (or `asset_preview_file` as fallback). Record `totalPages`.
If `totalPages == 1`: set `templatePdfUrl = originalPdfUrl` and skip to Sub-step 5.
Sub-step 2 — Compare page layouts visually
Look at each preview image. Ask: *"If I removed all text and image content and compared only the skeleton — frame positions, structural regions — would this page match another page?"*
Group pages by layout skeleton into `layoutGroups`:
layoutGroups = {
"layout-A": [1, 2, 3, ...], // pages sharing layout A
"layout-B": [N+1, ...], // pages with a distinct layout B
}Pick `templatePages` as a **single** representative page:
- If `layoutGroups` has exactly 1 entry: `templatePages = [first page in that group]`.
- If `layoutGroups` has >1 entry: ask the user which layout group to use (or default to the group with the most pages) and set `templatePages` to **one** page from that group.
Tell the user: > "Your PDF has {totalPages} pages. I found {N} unique layout(s). I'll use page {templatePages[0]} as the template. (If you need multiple layouts, we can run separate merges per layout.)"
Sub-step 3 — Extract only the template pages
Download the PDF from `{originalPdfUrl}` and extract **only** page(s) `{templatePages}` (1-indexed) to `template-condensed.pdf` using PyMuPDF (fitz). Report the absolute file path as `intermediatePdfLocalPath`.
Record the path as `intermediatePdfLocalPath`.
Sub-step 4 — Upload the condensed PDF
asset_initialize_file_upload({ path: "template-condensed.pdf", media_type: "application/pdf" })
// PUT the local file bytes to the returned upload URL, then:
asset_finalize_file_upload({ filename: "template-condensed.pdf", transfer_document: <from initialize resRead more
name: adobe-create-pdfs-from-data description: > Perform a full InDesign data merge from a CSV/TSV and an .indd template (or a PDF that gets converted to .indd automatically). Use this skill whenever the user wants to merge a data file with a layout template — including visiting cards, certificates, badges, catalogs, mailers, labels, invoices, or any per-row personalisation. Triggers on: "data merge", "InDesign merge", "merge my CSV with InDesign", "batch export PDF from template", "variable data InDesign", "personalise each row", or any request combining an .indd / PDF template with a data file. Use this skill even when only two of the three inputs (template, data, images) are mentioned — and even when the user never uses the phrase "data merge". license: Apache-2.0 allowed-tools: adobe_mandatory_init asset_inline_preview asset_preview_file asset_initialize_file_upload asset_finalize_file_upload convert_pdf_to_indd export_idml generate_indd_mapping_prompt prepare_indd_merge_template document_merge_data_layout metadata: version: 1.0.1 visibility: public
InDesign Data Merge Skill
Orchestrates the complete InDesign data merge pipeline. The naive path — calling `document_merge_data_layout` directly — often fails because the template must have its data-merge fields **linked to the correct data columns** before merging. This skill ensures that linkage is in place first, including automatic placeholder creation when the template has none, and PDF-to-INDD conversion when the user only has a PDF layout.
**Pipeline at a glance:**
| Phase | What happens | Gate | |-------|-------------|------| | **0** | Adobe init | — | | **1a** | Convert PDF template → `.indd` (skip if already `.indd`) | ⛔ GATE 1 | | **1b** | Confirm `.indd` URL and data file are available | — | | **2** | Export IDML; detect existing merge placeholders | — | | **3** | Create placeholders via LLM mapping *(only if Phase 2 found none)* | ⛔ GATE 2 | | **4** | Run `document_merge_data_layout` | — |
---
Tool Reference
| Step | Tool | Notes | |------|------|-------| | Initialize Adobe tools | `adobe_mandatory_init` | Always call first | | Inspect PDF pages | `asset_inline_preview` | Returns rendered preview per page | | Preview PDF pages (fallback) | `asset_preview_file` | Use if `asset_inline_preview` unavailable | | Upload condensed template PDF | `asset_initialize_file_upload` + `asset_finalize_file_upload` | Required before `convert_pdf_to_indd` | | Convert PDF → INDD | `convert_pdf_to_indd` | Use extractedDocumentPresignedUrls as `inddUrl` | | Export IDML | `export_idml` | Outputs presigned IDML URL for inspection | | Generate mapping prompt | `generate_indd_mapping_prompt` | Read-only; returns prompt — you run it through an LLM | | Create placeholders in INDD | `prepare_indd_merge_template` | Only after user approves mapping | | Run data merge | `document_merge_data_layout` | Template + data → merged PDF |
---
⛔ MANDATORY GATES
Two rules are non-negotiable and override all efficiency instincts.
Gate 1 — PDF template: analyse layout before converting
Never call `convert_pdf_to_indd` on a user-supplied PDF without first inspecting its page layout structure. A multi-page PDF (e.g. a prior merged output) produces a multi-page INDD which breaks the merge. Always distil it to a single-layout condensed PDF first.
Gate 2 — Mapping: show and wait before creating placeholders
Never call `prepare_indd_merge_template` in the same turn you generate or display the mapping JSON. Show the mapping summary + raw JSON, ask for approval, and **end the turn**. Only call `prepare_indd_merge_template` after the user explicitly approves in a later turn.
---
Workflow
Step 0 — Initialize Adobe Tools
{ "skill_name": "adobe-create-pdfs-from-data", "skill_version": "1.0.1" }Call `adobe_mandatory_init` once, before any other Adobe tool.
---
Step 1a — Convert PDF Template to INDD *(skip if already `.indd`)*
**When to run:** The user's template is a PDF (or any non-INDD layout). If you already have a usable `.indd` URL, skip directly to Step 1b.
Sub-step 1 — Inspect all pages
Record the user-supplied PDF URL as `originalPdfUrl`.
Call `asset_inline_preview` on the PDF (or `asset_preview_file` as fallback). Record `totalPages`.
If `totalPages == 1`: set `templatePdfUrl = originalPdfUrl` and skip to Sub-step 5.
Sub-step 2 — Compare page layouts visually
Look at each preview image. Ask: *"If I removed all text and image content and compared only the skeleton — frame positions, structural regions — would this page match another page?"*
Group pages by layout skeleton into `layoutGroups`:
layoutGroups = {
"layout-A": [1, 2, 3, ...], // pages sharing layout A
"layout-B": [N+1, ...], // pages with a distinct layout B
}Pick `templatePages` as a **single** representative page:
- If `layoutGroups` has exactly 1 entry: `templatePages = [first page in that group]`.
- If `layoutGroups` has >1 entry: ask the user which layout group to use (or default to the group with the most pages) and set `templatePages` to **one** page from that group.
Tell the user: > "Your PDF has {totalPages} pages. I found {N} unique layout(s). I'll use page {templatePages[0]} as the template. (If you need multiple layouts, we can run separate merges per layout.)"
Sub-step 3 — Extract only the template pages
Download the PDF from `{originalPdfUrl}` and extract **only** page(s) `{templatePages}` (1-indexed) to `template-condensed.pdf` using PyMuPDF (fitz). Report the absolute file path as `intermediatePdfLocalPath`.
Record the path as `intermediatePdfLocalPath`.
Sub-step 4 — Upload the condensed PDF
asset_initialize_file_upload({ path: "template-condensed.pdf", media_type: "application/pdf" })
// PUT the local file bytes to the returned upload URL, then:
asset_finalize_file_upload({ filename: "template-condensed.pdf", transfer_document: <from initialize resRepo: adobe/skills
Other skills on adobe-skills.
- /aa-conversion-funnel-analysis
Analyzes a multi-step conversion funnel to find where visitors drop off and which steps have the worst leakage. Use this skill when someone describes a journey and asks about conversion rates, drop-off, fallout, or step completion. Trigger for "analyze our checkout funnel,"
Open skill - /aa-executive-briefing
Generates a concise, executive-ready performance summary covering key metrics, trends, and what's driving movement. Use this skill when someone needs to produce a briefing, executive summary, performance narrative, or stakeholder readout — for example, "write an exec summary of
Open skill - /aa-kpi-pulse
Produces a compact KPI digest showing how key metrics changed over a period and what's driving the movement. Use this skill when someone asks for a performance summary, a weekly recap, a morning briefing, a KPI update, or any variation of "how did we do this week/month." Also
Open skill - /aa-segment-performance-comparator
Compares the performance of two or more audience segments across key metrics side by side. Use this skill when someone wants to compare audiences or visitor groups — for example, "how do mobile visitors compare to desktop on conversion," "compare new vs. returning visitors,"
Open skill - /aa-top-movers-watchlist
Identifies which items (pages, campaigns, products, channels, regions) had the biggest increases or decreases for a key metric between two time periods. Use this skill when someone asks "what's up and what's down," "which campaigns moved the most," "top gainers and losers,"
Open skill - /cja-dimension-analysis
Comprehensive dimension analysis and reporting for CJA. Use this skill whenever the user wants to analyze one or more dimensions — including cardinality, distribution/skew, trends, anomalies, data quality errors, comparisons, and forecasting. Also trigger when someone asks "what
Open skill

