///|
fn pdf_capability_command() -> CapabilityCommand {
let variants : Array[CapabilityVariant] = [
{
name: "info",
usage: "office pdf info INPUT.pdf [--detailed] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("detailed", "boolean", false, "detailed"),
]),
outputs: pdf_capability_outputs(
"Document information; detailed reports retain library field names.",
),
constraints: [
"format=pdf", "Document information; detailed reports retain library field names.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "pages",
usage: "office pdf pages INPUT.pdf [--pages SPEC] [--output REPORT] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field(
"pages", "string", false, "Strict 1-based page specification; default all; order and duplicates preserved",
),
capability_field(
"output", "path", false, "Optional report/export file; otherwise stdout",
),
]),
outputs: pdf_capability_outputs(
"Physical page boxes, dimensions, rotation and annotations.",
),
constraints: [
"format=pdf", "Physical page boxes, dimensions, rotation and annotations.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "fonts",
usage: "office pdf fonts INPUT.pdf [--pages SPEC] [--missing] [--output REPORT] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field(
"pages", "string", false, "Strict 1-based page specification; default all; order and duplicates preserved",
),
capability_field("missing", "boolean", false, "missing"),
capability_field(
"output", "path", false, "Optional report/export file; otherwise stdout",
),
]),
outputs: pdf_capability_outputs(
"Missing means absent embedded font programs; not missing system fonts. Type 3 and fonts inside Form XObjects are outside the missing report.",
),
constraints: [
"format=pdf", "Missing means absent embedded font programs; not missing system fonts. Type 3 and fonts inside Form XObjects are outside the missing report.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "validate",
usage: "office pdf validate INPUT.pdf [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
]),
outputs: pdf_capability_outputs(
"Parse, write, and reparse in memory; not PDF/A, accessibility, or visual validation.",
),
constraints: [
"format=pdf", "Parse, write, and reparse in memory; not PDF/A, accessibility, or visual validation.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "rewrite",
usage: "office pdf rewrite INPUT.pdf OUTPUT.pdf [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
]),
outputs: pdf_capability_outputs(
"Serialize and reparse before publication.",
),
constraints: ["format=pdf", "Serialize and reparse before publication."],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "decrypt",
usage: "office pdf decrypt INPUT.pdf OUTPUT.pdf [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
]),
outputs: pdf_capability_outputs(
"Try an empty user password when credentials are omitted; output is unencrypted.",
),
constraints: [
"format=pdf", "Try an empty user password when credentials are omitted; output is unencrypted.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "extract",
usage: "office pdf extract INPUT.pdf OUTPUT.pdf --pages SPEC [--retain-numbering] [--process-struct-tree] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
capability_field(
"pages", "string", true, "Required strict page selection",
),
capability_field(
"retain-numbering", "boolean", false, "retain-numbering",
),
capability_field(
"process-struct-tree", "boolean", false, "process-struct-tree",
),
]),
outputs: pdf_capability_outputs(
"Page selection is required; preserve order and duplicates.",
),
constraints: [
"format=pdf", "Page selection is required; preserve order and duplicates.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "merge",
usage: "office pdf merge OUTPUT.pdf INPUT.pdf INPUT.pdf... [--pages SPEC...] [--retain-numbering] [--remove-duplicate-fonts] [--add-toplevel-document] [--drop-*] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("output", "path", true, "Destination PDF path"),
capability_field(
"inputs", "array(path)", true, "At least two PDFs, in output order",
),
capability_field(
"pages", "array(string)", false, "Omit or repeat exactly once per input",
),
capability_field(
"retain-numbering", "boolean", false, "retain-numbering",
),
capability_field(
"remove-duplicate-fonts", "boolean", false, "remove-duplicate-fonts",
),
capability_field(
"add-toplevel-document", "boolean", false, "add-toplevel-document",
),
capability_field("drop-bookmarks", "boolean", false, "drop-bookmarks"),
capability_field(
"drop-optional-content", "boolean", false, "drop-optional-content",
),
capability_field("drop-acroforms", "boolean", false, "drop-acroforms"),
capability_field(
"drop-named-destinations", "boolean", false, "drop-named-destinations",
),
capability_field(
"drop-name-dictionary", "boolean", false, "drop-name-dictionary",
),
capability_field(
"drop-structure-tree", "boolean", false, "drop-structure-tree",
),
capability_field("drop-info", "boolean", false, "drop-info"),
capability_field(
"drop-catalog-entries", "boolean", false, "drop-catalog-entries",
),
]),
outputs: pdf_capability_outputs(
"Output comes first; --pages is omitted or repeated exactly once per input. --add-toplevel-document wraps tagged trees, not bookmarks. All library retention controls remain available.",
),
constraints: [
"format=pdf", "Output comes first; --pages is omitted or repeated exactly once per input. --add-toplevel-document wraps tagged trees, not bookmarks. All library retention controls remain available.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "metadata get",
usage: "office pdf metadata get INPUT.pdf [--output REPORT.json] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field(
"output", "path", false, "Optional report/export file; otherwise stdout",
),
]),
outputs: pdf_capability_outputs("Read standard Info fields."),
constraints: ["format=pdf", "Read standard Info fields."],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "metadata set",
usage: "office pdf metadata set INPUT.pdf OUTPUT.pdf [--title TEXT] [--author TEXT] [--subject TEXT] [--keywords TEXT] [--creator TEXT] [--producer TEXT] [--creation-date DATE] [--modification-date DATE] [--xmp-also] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
capability_field("title", "string", false, "title"),
capability_field("author", "string", false, "author"),
capability_field("subject", "string", false, "subject"),
capability_field("keywords", "string", false, "keywords"),
capability_field("creator", "string", false, "creator"),
capability_field("producer", "string", false, "producer"),
capability_field("creation-date", "string", false, "creation-date"),
capability_field(
"modification-date", "string", false, "modification-date",
),
capability_field("xmp-also", "boolean", false, "xmp-also"),
]),
outputs: pdf_capability_outputs(
"At least one field is required; empty values clear text. PDF dates use D:YYYYMMDDHHmmSS syntax. --xmp-also creates XMP if needed.",
),
constraints: [
"format=pdf", "At least one field is required; empty values clear text. PDF dates use D:YYYYMMDDHHmmSS syntax. --xmp-also creates XMP if needed.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "metadata export",
usage: "office pdf metadata export INPUT.pdf [--output METADATA.xml] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field(
"output", "path", false, "Optional report/export file; otherwise stdout",
),
]),
outputs: pdf_capability_outputs(
"Export catalog XMP XML; absent metadata is an error.",
),
constraints: [
"format=pdf", "Export catalog XMP XML; absent metadata is an error.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "metadata import",
usage: "office pdf metadata import INPUT.pdf OUTPUT.pdf METADATA.xml [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
capability_field("xml", "path", true, "XML file replacing catalog XMP"),
]),
outputs: pdf_capability_outputs(
"Validate XML and replace catalog XMP; do not synchronize Info.",
),
constraints: [
"format=pdf", "Validate XML and replace catalog XMP; do not synchronize Info.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "metadata remove",
usage: "office pdf metadata remove INPUT.pdf OUTPUT.pdf [--scope info|xmp|all] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
capability_field(
"scope", "enum(info|xmp|all)", false, "Defaults to all",
),
]),
outputs: pdf_capability_outputs(
"Scope defaults to all; removal is not secure erasure.",
),
constraints: [
"format=pdf", "Scope defaults to all; removal is not secure erasure.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "bookmarks export",
usage: "office pdf bookmarks export INPUT.pdf [--text] [--output BOOKMARKS] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field(
"output", "path", false, "Optional report/export file; otherwise stdout",
),
capability_field("text", "boolean", false, "text"),
]),
outputs: pdf_capability_outputs(
"Default JSON preserves actions; cpdf text is less expressive.",
),
constraints: [
"format=pdf", "Default JSON preserves actions; cpdf text is less expressive.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "bookmarks import",
usage: "office pdf bookmarks import INPUT.pdf OUTPUT.pdf BOOKMARKS [--text] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
capability_field("bookmarks", "path", true, "bookmarks"),
capability_field("text", "boolean", false, "text"),
]),
outputs: pdf_capability_outputs(
"Replace bookmarks and verify hierarchy/page references.",
),
constraints: [
"format=pdf", "Replace bookmarks and verify hierarchy/page references.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "bookmarks remove",
usage: "office pdf bookmarks remove INPUT.pdf OUTPUT.pdf [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
]),
outputs: pdf_capability_outputs("Remove the outline."),
constraints: ["format=pdf", "Remove the outline."],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "labels export",
usage: "office pdf labels export INPUT.pdf [--output LABELS.json] [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field(
"output", "path", false, "Optional report/export file; otherwise stdout",
),
]),
outputs: pdf_capability_outputs(
"Export editable label ranges as a JSON array.",
),
constraints: [
"format=pdf", "Export editable label ranges as a JSON array.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "labels import",
usage: "office pdf labels import INPUT.pdf OUTPUT.pdf LABELS.json [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
capability_field("labels", "path", true, "labels"),
]),
outputs: pdf_capability_outputs(
"Replace labels; physical start pages must be unique, increasing and in bounds, and start values positive. Empty arrays clear labels.",
),
constraints: [
"format=pdf", "Replace labels; physical start pages must be unique, increasing and in bounds, and start values positive. Empty arrays clear labels.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
{
name: "labels remove",
usage: "office pdf labels remove INPUT.pdf OUTPUT.pdf [--json|--jsonl] [--dry-run] [--overwrite]",
result_schema: "office.pdf/1",
registry: None,
inputs: pdf_capability_inputs([
capability_field("input", "path", true, "Input PDF path"),
capability_field("output", "path", true, "Destination PDF path"),
]),
outputs: pdf_capability_outputs(
"Remove viewer page labels; these are not printed page text.",
),
constraints: [
"format=pdf", "Remove viewer page labels; these are not printed page text.",
],
actions: [],
output_modes: ["human", "json", "jsonl"],
},
]
{
name: "pdf",
summary: "Inspect and manipulate existing PDFs",
usage: "office pdf [arguments] [--json|--jsonl] [--dry-run] [--overwrite]",
// PDF operations form their own command family. They do not extend the
// OOXML DocumentFormat or imply PDF support for top-level selectors.
formats: [],
aliases: [],
inputs: pdf_capability_inputs([
capability_field(
"operation", "string", true, "info, pages, fonts, validate, rewrite, decrypt, extract, merge, metadata, bookmarks, or labels",
),
]),
outputs: pdf_capability_outputs(
"Operation-specific report data or a verified PDF page count",
),
output_modes: ["human", "json", "jsonl"],
variants,
}
}
///|
fn pdf_capability_inputs(
specific : Array[CapabilityField],
) -> Array[CapabilityField] {
[
..specific,
capability_field(
"json", "boolean", false, "Emit office.output/1 JSON; conflicts with --jsonl",
),
capability_field(
"jsonl", "boolean", false, "Emit one office.output/1 line; conflicts with --json",
),
capability_field(
"dry-run", "boolean", false, "Build and validate without writing; existing destinations still require --overwrite",
),
capability_field(
"overwrite", "boolean", false, "Replace an existing destination; remove then stage, not an atomic swap",
),
capability_field(
"password", "string", false, "UTF-8 user password; conflicts with --password-file",
),
capability_field(
"password-file", "path", false, "Exact user password bytes; no newline trimming",
),
capability_field(
"owner-password", "string", false, "UTF-8 owner password; conflicts with --owner-password-file",
),
capability_field(
"owner-password-file", "path", false, "Exact owner password bytes",
),
]
}
///|
fn pdf_capability_outputs(description : String) -> Array[CapabilityField] {
[
capability_field(
"schema", "literal(office.pdf/1)", true, "Versioned PDF operation result",
),
capability_field(
"operation", "string", true, "Operation including any nested action",
),
capability_field("result", "json", true, description),
capability_field(
"dry_run", "boolean", true, "Whether file publication was disabled",
),
capability_field(
"committed", "boolean", true, "True only after an output file was published",
),
capability_field(
"output", "path", false, "Destination for file-producing operations",
),
capability_field(
"result_size", "integer", false, "Candidate file size in bytes",
),
]
}