Files
pdfme/docs/cli.html
2026-04-03 16:30:56 +09:00

236 lines
68 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-cli" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title data-rh="true">CLI | pdfme</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://pdfme.com/img/ogimage.png"><meta data-rh="true" name="twitter:image" content="https://pdfme.com/img/ogimage.png"><meta data-rh="true" property="og:url" content="https://pdfme.com/docs/cli"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" property="og:locale:alternate" content="ja"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="CLI | pdfme"><meta data-rh="true" name="description" content="@pdfme/cli is the command-line interface for JSON-first pdfme workflows."><meta data-rh="true" property="og:description" content="@pdfme/cli is the command-line interface for JSON-first pdfme workflows."><link data-rh="true" rel="icon" href="/favicon.ico"><link data-rh="true" rel="canonical" href="https://pdfme.com/docs/cli"><link data-rh="true" rel="alternate" href="https://pdfme.com/docs/cli" hreflang="en"><link data-rh="true" rel="alternate" href="https://pdfme.com/ja/docs/cli" hreflang="ja"><link data-rh="true" rel="alternate" href="https://pdfme.com/docs/cli" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://V6YWG1D4SV-dsn.algolia.net" crossorigin="anonymous"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"CLI","item":"https://pdfme.com/docs/cli"}]}</script><link rel="preconnect" href="https://www.google-analytics.com">
<link rel="preconnect" href="https://www.googletagmanager.com">
<script async src="https://www.googletagmanager.com/gtag/js?id=G-1Z2MZW44WP"></script>
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-1Z2MZW44WP",{})</script>
<link rel="search" type="application/opensearchdescription+xml" title="pdfme" href="/opensearch.xml">
<script src="https://media.ethicalads.io/media/client/ethicalads.min.js" async></script><link rel="stylesheet" href="/assets/css/styles.5431d87a.css">
<script src="/assets/js/runtime~main.19c5c7c8.js" defer="defer"></script>
<script src="/assets/js/main.626013e7.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{const a=new URLSearchParams(window.location.search).entries();for(var[t,e]of a)if(t.startsWith("docusaurus-data-")){var n=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(n,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="theme-announcement-bar announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">🚀 &nbsp; Check out our new <a target="_blank" rel="noopener noreferrer" href="https://deepwiki.com/pdfme/pdfme">DeepWiki</a>! Ask interactive questions on docs and source code. &nbsp; 🧑‍💻</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><b class="navbar__title text--truncate">pdfme</b></a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs/getting-started">Docs</a><a class="navbar__item navbar__link" href="/templates">Examples</a><a class="navbar__item navbar__link" href="/template-design">Template Design</a><a href="https://github.com/pdfme/pdfme" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://discord.gg/xWPTJbmgNV" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Discord<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://app.pdfme.com?utm_source=website&amp;utm_content=navbar" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Try pdfme Cloud<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://app.pdfme.com/contact?utm_source=website&amp;utm_content=navbar" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Contact<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link"><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" class="iconLanguage_nlXk"><path fill="currentColor" d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path></svg>English</a><ul class="dropdown__menu"><li><a href="/docs/cli" target="_self" rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang="en">English</a></li><li><a href="/ja/docs/cli" target="_self" rel="noopener noreferrer" class="dropdown__link" lang="ja">日本語</a></li></ul></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Meta+k)" aria-keyshortcuts="Meta+k"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="8" stroke="currentColor" fill="none" stroke-width="1.4"></circle><path d="m21 21-4.3-4.3" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/getting-started"><span title="Getting Started" class="linkLabel_WmDU">Getting Started</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/supported-features"><span title="Supported Features" class="linkLabel_WmDU">Supported Features</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/tables"><span title="Tables with Dynamic Data" class="linkLabel_WmDU">Tables with Dynamic Data</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/expression"><span title="Expression" class="linkLabel_WmDU">Expression</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/headers-and-footers"><span title="Headers and Footers" class="linkLabel_WmDU">Headers and Footers</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/docs/custom-fonts"><span title="Customization" class="categoryLinkLabel_W154">Customization</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/custom-fonts"><span title="Custom Fonts" class="linkLabel_WmDU">Custom Fonts</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/custom-ui"><span title="Custom UI" class="linkLabel_WmDU">Custom UI</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/custom-schemas"><span title="Custom Schemas(Plugins)" class="linkLabel_WmDU">Custom Schemas(Plugins)</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/docs/cli"><span title="Tools(New)" class="categoryLinkLabel_W154">Tools(New)</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/cli"><span title="CLI" class="linkLabel_WmDU">CLI</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/converter"><span title="Converter" class="linkLabel_WmDU">Converter</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/manipulator"><span title="Manipulator" class="linkLabel_WmDU">Manipulator</span></a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/development-guide"><span title="Development Guide" class="linkLabel_WmDU">Development Guide</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/migration-v6"><span title="Migration Guide v6" class="linkLabel_WmDU">Migration Guide v6</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/template-contribution-guide"><span title="Template Contribution Guide ❤️" class="linkLabel_WmDU">Template Contribution Guide ❤️</span></a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Tools(New)</span></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">CLI</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>CLI</h1></header>
<p><code>@pdfme/cli</code> is the command-line interface for JSON-first pdfme workflows.</p>
<p>It is intended for:</p>
<ul>
<li class="">generating PDFs from templates and inputs without writing a custom Node script</li>
<li class="">validating templates or unified job files before generation</li>
<li class="">diagnosing runtime, font, <code>basePdf</code>, and output-path issues before a CI or agent run</li>
<li class="">converting existing PDFs into images or page-size metadata</li>
<li class="">exporting official example assets as templates or unified job files</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no"></a></h2>
<p>Node.js 20 or later is required.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">npm install -D @pdfme/cli</span><br></span></code></pre></div></div>
<p>You can also run it directly with <code>npx</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">npx @pdfme/cli generate --help</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="commands">Commands<a href="#commands" class="hash-link" aria-label="Direct link to Commands" title="Direct link to Commands" translate="no"></a></h2>
<ul>
<li class=""><code>pdfme generate</code>
<ul>
<li class="">generate a PDF from a unified job file or from <code>--template</code> + <code>--inputs</code></li>
<li class="">optionally render page images</li>
<li class="">optionally overlay grid lines and schema bounds on generated images</li>
</ul>
</li>
<li class=""><code>pdfme validate</code>
<ul>
<li class="">validate a template or unified job before generation</li>
<li class="">return machine-readable inspection data with <code>--json</code></li>
</ul>
</li>
<li class=""><code>pdfme doctor</code>
<ul>
<li class="">diagnose environment, input, font, <code>basePdf</code>, cache, and output-path issues</li>
</ul>
</li>
<li class=""><code>pdfme pdf2img</code>
<ul>
<li class="">convert an existing PDF into page images</li>
</ul>
</li>
<li class=""><code>pdfme pdf2size</code>
<ul>
<li class="">inspect PDF page sizes in millimeters</li>
</ul>
</li>
<li class=""><code>pdfme examples</code>
<ul>
<li class="">list or export official example templates</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pdfme-generate"><code>pdfme generate</code><a href="#pdfme-generate" class="hash-link" aria-label="Direct link to pdfme-generate" title="Direct link to pdfme-generate" translate="no"></a></h2>
<p>Generate a PDF from either:</p>
<ul>
<li class="">a unified job file</li>
<li class="">a template file plus a separate inputs file</li>
</ul>
<p>Examples:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Unified job file: { template, inputs, options? }</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme generate job.json -o out.pdf</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Template + inputs as separate files</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme generate -t template.json -i inputs.json -o out.pdf</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Render page images too</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme generate job.json -o out.pdf --image</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Overlay grid lines and schema bounds on generated images</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme generate job.json -o out.pdf --grid</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Override basePdf from the command line</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme generate -t template.json -i inputs.json --basePdf invoice.pdf -o out.pdf</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Structured output for CI or agents</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme generate job.json -o out.pdf --image --json</span><br></span></code></pre></div></div>
<p>Main options:</p>
<table><thead><tr><th>Option</th><th>Default</th><th>Notes</th></tr></thead><tbody><tr><td><code>[file]</code></td><td>-</td><td>Unified job file containing <code>{ template, inputs, options? }</code></td></tr><tr><td><code>-t, --template</code></td><td>-</td><td>Template JSON file</td></tr><tr><td><code>-i, --inputs</code></td><td>-</td><td>Input JSON file</td></tr><tr><td><code>-o, --output</code></td><td><code>output.pdf</code></td><td>Output PDF path</td></tr><tr><td><code>--force</code></td><td><code>false</code></td><td>Allow overwriting the implicit default <code>output.pdf</code></td></tr><tr><td><code>--image</code></td><td><code>false</code></td><td>Write one image per generated page</td></tr><tr><td><code>--imageFormat</code></td><td><code>png</code></td><td><code>png</code> or <code>jpeg</code></td></tr><tr><td><code>--scale</code></td><td><code>1</code></td><td>Render scale for image output</td></tr><tr><td><code>--grid</code></td><td><code>false</code></td><td>Draw grid lines and schema bounds on generated images</td></tr><tr><td><code>--gridSize</code></td><td><code>10</code></td><td>Grid spacing in millimeters</td></tr><tr><td><code>--font</code></td><td>-</td><td>Local custom fonts as <code>Name=path.ttf</code>, comma-separated for multiple fonts</td></tr><tr><td><code>--basePdf</code></td><td>-</td><td>Override <code>template.basePdf</code> with a PDF file path</td></tr><tr><td><code>--noAutoFont</code></td><td><code>false</code></td><td>Disable automatic <code>NotoSansJP</code> resolution for CJK text</td></tr><tr><td><code>-v, --verbose</code></td><td><code>false</code></td><td>Print input/output/render details to stderr</td></tr><tr><td><code>--json</code></td><td><code>false</code></td><td>Print JSON only to stdout</td></tr></tbody></table>
<p>Notes:</p>
<ul>
<li class="">If <code>output.pdf</code> already exists and you did not explicitly pass <code>-o</code> or <code>--force</code>, <code>generate</code> refuses to overwrite it.</li>
<li class=""><code>--grid</code> also triggers image rendering, even if <code>--image</code> is not set.</li>
<li class="">Generated images are written next to the output PDF as <code>&lt;output-base&gt;-1.png</code>, <code>&lt;output-base&gt;-2.png</code>, or <code>.jpg</code> when <code>--imageFormat jpeg</code> is used.</li>
<li class=""><code>--font</code> resolves local paths relative to the current working directory.</li>
<li class="">Local font paths inside unified job <code>options.font.&lt;name&gt;.data</code> resolve relative to the job or template file directory.</li>
<li class="">When CJK text is detected and no explicit font source is provided, the CLI automatically resolves and caches <code>NotoSansJP</code> unless <code>--noAutoFont</code> is set.</li>
</ul>
<p>Unified job example:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;template&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;basePdf&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;width&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">210</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;height&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">297</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;padding&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;schemas&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;customerName&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;text&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;position&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token property">&quot;x&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token property">&quot;y&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;width&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">80</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;height&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;inputs&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token property">&quot;customerName&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;John Doe&quot;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;font&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;NotoSansJP&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;https://fonts.gstatic.com/...&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;fallback&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;subset&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<p><code>template.basePdf</code> can also be a relative PDF path such as <code>&quot;./invoice.pdf&quot;</code>. You can override that path at runtime with <code>--basePdf</code>.</p>
<p>When <code>--json</code> is enabled, stdout is reserved for JSON only:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;ok&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;command&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;generate&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;mode&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;job&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;templatePageCount&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;inputCount&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;pageCount&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;outputPath&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;out.pdf&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;outputBytes&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">12345</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;imagePaths&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">&quot;out-1.png&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pdfme-validate"><code>pdfme validate</code><a href="#pdfme-validate" class="hash-link" aria-label="Direct link to pdfme-validate" title="Direct link to pdfme-validate" translate="no"></a></h2>
<p>Validate either a template file or a unified job file before generation.</p>
<p>Examples:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme validate template.json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme validate job.json --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">cat job.json | pdfme validate - --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme validate template.json --strict</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme validate template.json -v --json</span><br></span></code></pre></div></div>
<p>What <code>validate</code> checks:</p>
<ul>
<li class="">template structure via pdfme validation</li>
<li class="">unknown schema types</li>
<li class="">duplicate field names on the same page</li>
<li class="">repeated field names across pages as warnings</li>
<li class="">field positions that extend outside page bounds as warnings</li>
<li class="">unknown top-level fields on the template as warnings</li>
<li class="">unified job compatibility with <code>generate</code></li>
<li class="">field-level input contract issues for unified jobs</li>
</ul>
<p>Useful flags:</p>
<ul>
<li class=""><code>--strict</code>
<ul>
<li class="">promote warnings to a failing exit code</li>
</ul>
</li>
<li class=""><code>--json</code>
<ul>
<li class="">include <code>valid</code>, <code>errors</code>, <code>warnings</code>, <code>inspection</code>, and <code>inputHints</code></li>
</ul>
</li>
<li class=""><code>-v, --verbose</code>
<ul>
<li class="">print input source, mode, counts, and summary information to stderr</li>
</ul>
</li>
</ul>
<p><code>inputHints</code> helps automation determine what each writable field expects before calling <code>generate</code>. The CLI currently distinguishes:</p>
<ul>
<li class="">plain strings</li>
<li class="">asset-like strings with <code>contentKind</code></li>
<li class="">barcode strings with a human-readable <code>rule</code></li>
<li class=""><code>string[][]</code> table payloads</li>
<li class="">canonical date/time strings with <code>format</code> metadata</li>
<li class="">constrained enum strings for <code>select</code>, <code>checkbox</code>, and <code>radioGroup</code></li>
<li class="">JSON string objects for <code>multiVariableText</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pdfme-doctor"><code>pdfme doctor</code><a href="#pdfme-doctor" class="hash-link" aria-label="Direct link to pdfme-doctor" title="Direct link to pdfme-doctor" translate="no"></a></h2>
<p>Diagnose the environment or a specific template/job before generation.</p>
<p>Examples:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Environment diagnosis</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme doctor</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Diagnose a template or job</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme doctor job.json --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Diagnose from stdin</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">cat job.json | pdfme doctor - --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Font-focused diagnosis</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme doctor fonts job.json --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Simulate generate with automatic CJK font resolution disabled</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme doctor job.json --noAutoFont --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Preview runtime output and image targets</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme doctor job.json -o artifacts/out.pdf --image --imageFormat jpeg --json</span><br></span></code></pre></div></div>
<p>Modes:</p>
<ul>
<li class=""><code>pdfme doctor</code>
<ul>
<li class="">checks Node version, platform, writable directories, and the <code>NotoSansJP</code> cache state</li>
</ul>
</li>
<li class=""><code>pdfme doctor &lt;job-or-template&gt;</code>
<ul>
<li class="">adds validation, <code>basePdf</code>, font, plugin, and runtime output-path diagnosis</li>
</ul>
</li>
<li class=""><code>pdfme doctor fonts &lt;job-or-template&gt;</code>
<ul>
<li class="">focuses on explicit and implicit font sources</li>
</ul>
</li>
</ul>
<p>Important behavior:</p>
<ul>
<li class=""><code>doctor</code> uses <code>healthy</code> to report whether blocking issues were found.</li>
<li class="">With <code>--json</code>, <code>doctor</code> still returns <code>ok: true</code> when the command itself ran successfully, even if <code>healthy</code> is <code>false</code>.</li>
<li class=""><code>-o, --output</code>, <code>--force</code>, <code>--image</code>, and <code>--imageFormat</code> simulate the same output-path behavior used by <code>generate</code>.</li>
<li class=""><code>doctor fonts --json</code> includes <code>needsNetwork</code> for each font source so automation can tell whether a job depends on network access.</li>
<li class=""><code>validate</code>-style <code>inputHints</code> are also included in JSON mode.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pdfme-pdf2img"><code>pdfme pdf2img</code><a href="#pdfme-pdf2img" class="hash-link" aria-label="Direct link to pdfme-pdf2img" title="Direct link to pdfme-pdf2img" translate="no"></a></h2>
<p>Convert an existing PDF into page images.</p>
<p>Examples:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2img invoice.pdf</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2img invoice.pdf --grid --gridSize 10</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2img invoice.pdf --pages 1-3</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2img invoice.pdf -o ./images --imageFormat jpeg</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2img invoice.pdf -o ./images --json</span><br></span></code></pre></div></div>
<p>Behavior:</p>
<ul>
<li class=""><code>-o, --output</code> expects a directory, not a filename pattern</li>
<li class="">output files are named <code>&lt;input-base&gt;-&lt;page&gt;.png</code> or <code>.jpg</code></li>
<li class=""><code>--pages</code> accepts values such as <code>1-3</code> or <code>1,3,5</code></li>
<li class=""><code>--grid</code> draws a millimeter grid on the rendered page images</li>
<li class=""><code>--json</code> returns <code>pageCount</code>, <code>selectedPageCount</code>, <code>outputPaths</code>, and per-page width/height metadata</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pdfme-pdf2size"><code>pdfme pdf2size</code><a href="#pdfme-pdf2size" class="hash-link" aria-label="Direct link to pdfme-pdf2size" title="Direct link to pdfme-pdf2size" translate="no"></a></h2>
<p>Inspect PDF page sizes in millimeters.</p>
<p>Examples:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2size invoice.pdf</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2size invoice.pdf --json</span><br></span></code></pre></div></div>
<p>Human-readable output includes standard size labels such as <code>A4 portrait</code> when detected. JSON output returns:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;ok&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;command&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;pdf2size&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;pageCount&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token property">&quot;pages&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token property">&quot;pageNumber&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token property">&quot;width&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">210</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token property">&quot;height&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">297</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pdfme-examples"><code>pdfme examples</code><a href="#pdfme-examples" class="hash-link" aria-label="Direct link to pdfme-examples" title="Direct link to pdfme-examples" translate="no"></a></h2>
<p>List or export official example templates from the playground asset manifest.</p>
<p>Examples:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain"># List templates</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme examples --list</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Listing is also the default when no name is provided</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme examples</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Print a template to stdout</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme examples invoice</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Write a template to a file</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme examples invoice -o template.json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Export a unified job with sample inputs</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme examples invoice --withInputs -o job.json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"># Machine-readable manifest output</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme examples --list --json</span><br></span></code></pre></div></div>
<p>Behavior:</p>
<ul>
<li class="">the command fetches the manifest and template assets from <code>https://playground.pdfme.com/template-assets</code></li>
<li class="">you can override that base URL with the <code>PDFME_EXAMPLES_BASE_URL</code> environment variable</li>
<li class=""><code>--withInputs</code> adds sample inputs and includes <code>options.font</code> when the example depends on official hosted fonts</li>
<li class=""><code>--json</code> list mode returns manifest metadata such as template names, schema types, font names, and page counts</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fonts">Fonts<a href="#fonts" class="hash-link" aria-label="Direct link to Fonts" title="Direct link to Fonts" translate="no"></a></h2>
<p>The CLI treats fonts as an explicit source contract.</p>
<p>Supported explicit font sources:</p>
<ul>
<li class="">local <code>.ttf</code> files via <code>--font Name=./path.ttf</code></li>
<li class="">local <code>.ttf</code> files in unified job <code>options.font.&lt;name&gt;.data</code></li>
<li class="">public direct <code>http(s)</code> font asset URLs</li>
<li class=""><code>.ttf</code> data URIs</li>
<li class="">inline bytes in programmatic use</li>
</ul>
<p>Current rules:</p>
<ul>
<li class=""><code>.ttf</code> is the only explicitly supported custom font format</li>
<li class=""><code>.otf</code> and <code>.ttc</code> are rejected</li>
<li class=""><code>fonts.googleapis.com/css*</code> stylesheet URLs are rejected</li>
<li class="">unsafe, private, or loopback <code>http(s)</code> URLs are rejected</li>
<li class="">explicit remote font fetches use a 15-second timeout and a 32 MiB size limit</li>
<li class="">remote font failures are returned as <code>EFONT</code></li>
</ul>
<p>For CJK content, automatic <code>NotoSansJP</code> resolution is only used when no explicit font source is provided. If CJK text is detected, the font is not cached, and automatic resolution is disabled or unavailable, <code>generate</code> fails with <code>EFONT</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="structured-output-and-exit-codes">Structured Output and Exit Codes<a href="#structured-output-and-exit-codes" class="hash-link" aria-label="Direct link to Structured Output and Exit Codes" title="Direct link to Structured Output and Exit Codes" translate="no"></a></h2>
<p>When you pass <code>--json</code>:</p>
<ul>
<li class="">stdout is JSON only</li>
<li class="">success payloads use <code>ok: true</code></li>
<li class="">failures use <code>ok: false</code> and include <code>error.code</code>, <code>error.message</code>, and sometimes <code>error.details</code></li>
<li class=""><code>-v, --verbose</code> still writes human-readable diagnostics to stderr</li>
</ul>
<p>Current exit-code categories:</p>
<table><thead><tr><th>Code</th><th>Meaning</th></tr></thead><tbody><tr><td><code>0</code></td><td>Success</td></tr><tr><td><code>1</code></td><td>Argument, validation, or unsupported-input failure</td></tr><tr><td><code>2</code></td><td>Runtime or font-resolution failure</td></tr><tr><td><code>3</code></td><td>File I/O failure</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="typical-workflows">Typical Workflows<a href="#typical-workflows" class="hash-link" aria-label="Direct link to Typical Workflows" title="Direct link to Typical Workflows" translate="no"></a></h2>
<p>Start from an official example, diagnose it, then generate images for visual review:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme examples invoice --withInputs -o job.json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme doctor job.json --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme generate job.json -o out.pdf --image --grid</span><br></span></code></pre></div></div>
<p>For existing-PDF overlay work:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2img invoice.pdf --grid --gridSize 10</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme pdf2size invoice.pdf --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme doctor template.json -o out.pdf --image --json</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">pdfme generate -t template.json -i inputs.json -o out.pdf --image --grid</span><br></span></code></pre></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/pdfme/pdfme/tree/main/website/docs/cli.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/custom-schemas"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Custom Schemas(Plugins)</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/converter"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Converter</div></a></nav></div></div><div class="col col--3"><div style="position:sticky;top:76px"><div class="tableOfContents_bqdL thin-scrollbar custom-toc"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#installation" class="table-of-contents__link toc-highlight">Installation</a></li><li><a href="#commands" class="table-of-contents__link toc-highlight">Commands</a></li><li><a href="#pdfme-generate" class="table-of-contents__link toc-highlight"><code>pdfme generate</code></a></li><li><a href="#pdfme-validate" class="table-of-contents__link toc-highlight"><code>pdfme validate</code></a></li><li><a href="#pdfme-doctor" class="table-of-contents__link toc-highlight"><code>pdfme doctor</code></a></li><li><a href="#pdfme-pdf2img" class="table-of-contents__link toc-highlight"><code>pdfme pdf2img</code></a></li><li><a href="#pdfme-pdf2size" class="table-of-contents__link toc-highlight"><code>pdfme pdf2size</code></a></li><li><a href="#pdfme-examples" class="table-of-contents__link toc-highlight"><code>pdfme examples</code></a></li><li><a href="#fonts" class="table-of-contents__link toc-highlight">Fonts</a></li><li><a href="#structured-output-and-exit-codes" class="table-of-contents__link toc-highlight">Structured Output and Exit Codes</a></li><li><a href="#typical-workflows" class="table-of-contents__link toc-highlight">Typical Workflows</a></li></ul></div><div data-ea-publisher="pdfmecom" data-ea-type="image"></div></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/getting-started">Getting Started</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/supported-features">Supported Features</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/templates">Examples</a></li><li class="footer__item"><a class="footer__link-item" href="/template-design">Template Design</a></li><li class="footer__item"><a href="https://app.pdfme.com?utm_source=website&amp;utm_content=footer" target="_blank" rel="noopener noreferrer" class="footer__link-item">Try pdfme Cloud<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/pdfme/pdfme" target="_blank" rel="noopener noreferrer" class="footer__link-item">Github<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://discord.gg/xWPTJbmgNV" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 pdfme</div></div></div></footer></div>
</body>
</html>