Skip to content
AI & Agents
Skill

/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,

From plugin
adobe-skills
162160 skills6 agents4 MCP
Install
$ npx -y skills add adobe/skills --skill adobe-create-pdfs-from-data --agent claude-code

How 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.md
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 res
Read more
Ships withadobe-skills

Repository of Adobe skills for AI coding agents.

Get the whole plugin

Other skills on adobe-skills.