PDF Generation Template Editor
Open-source visual PDF generation engine with customizable templates and developer-friendly APIs.
Open-source visual PDF generation engine with customizable templates and developer-friendly APIs.
This guide covers the production build commands, the build pipeline, and the release output layout.
| Script | Command | Effect |
|---|---|---|
dev | pnpm --filter @compdfkit/webview dev | Vite dev server (--host 0.0.0.0 --port 3032). |
dev:core | pnpm --filter @compdfkit/core build:watch | Rollup watch + sourcemaps for core. |
build | pnpm --filter @compdfkit/webview build | vite build → packages/webview/dist/. |
build:core | pnpm --filter @compdfkit/core build:prod | Rollup prod → webview.min.js + PDFWorker.js into webview/lib/. |
build:webviewer | pnpm --filter @compdfkit/core build:webviewer | Rollup webviewer config → webviewer.js + webviewer.global.js into webview/lib/. |
build:release | node scripts/build-release.mjs | Runs build:core → build:webviewer → build, then assembles release/. |
@compdfkit/webview: dev, build (vite build), preview, test:unit (vitest run --environment happy-dom --root src/), lint.
@compdfkit/core: clear (rimraf lib), build (rollup -c), build:watch, build:prod (cross-env NODE_ENV=production rollup -c), build:webviewer.
The full release pipeline (build:release) runs three builds in order, then assembles the release folder:
build:core → packages/webview/lib/webview.min.js, PDFWorker.js
build:webviewer → packages/webview/lib/webviewer.js, webviewer.global.js
build (webview) → packages/webview/dist/ (Vite)
scripts/build-release.mjs → release/packages/webview/lib/ packages/core/rollup.config.js (two bundles): src/worker/compdfkit_worker.js → ../webview/lib/PDFWorker.js (ES); src/index.js → ../webview/lib/webview.min.js (ES). terser with a reserved-names list (WASM-binding symbols like ComPDFKitJS, Rect that must not be mangled); Babel targets edge17/ff60/chrome67/safari10/ie10.packages/core/rollup.webviewer.config.js: webviewer.js → ../webview/lib/webviewer.js (ES) + ../webview/lib/webviewer.global.js (UMD, global ComPDFKitViewer).packages/webview/vite.config.js:
base: './' (relative assets — important for iframe/S3 hosting).@vitejs/plugin-vue, unplugin-vue-components (auto-import), vite-svg-plugin for ./src/assets/icons/.@ → ./src.dev script).packages/webview/lib/ contents Build outputs + prebuilt engine assets: webview.min.js (+ .map), PDFWorker.js (+ .map), webviewer.js, webviewer.global.js, plus ComPDFKit.js, ComPDFKit.wasm, pdf.worker.min.js, DroidSansFallbackFull.ttf, THSarabunNew.ttf, font.ff, CMYK/, and legacy ComPDFKit1/2.*, index.js/wasm, pdfium.js/wasm.
scripts/build-release.mjs copies into:
release/
├── @compdfkit/
│ ├── webviewer.global.js # UMD embed entry (global ComPDFKitViewer)
│ └── webviewer.js # ES embed entry
└── webviewer/
├── index.html
├── favicon.ico
├── assets/ # Vite-built webview assets
├── locales/ # translation-*.json (6 languages)
├── images/
├── example/Quick Start Guide for ComPDFKit Web Demo.pdf
└── lib/
├── ComPDFKit.js
├── ComPDFKit.wasm
├── PDFWorker.js
├── DroidSansFallbackFull.ttf
├── pdf.worker.min.js
└── CMYK/To deploy, serve the release/webviewer/ folder at a public URL and point the integrator's path option at it:
ComPDFKitViewer.init(
{ path: 'https://cdn.example.com/webviewer/', pdfUrl: '...', license: '...' },
document.getElementById('viewer')
);base: './' in the Vite config makes all asset paths relative, so the build works under any sub-path (iframe, S3, CDN).locales/ folder must be served alongside the assets (i18next-http-backend loads ./locales/translation-<lng>.json).lib/ folder (engine + WASM) must be served with the correct MIME types; .wasm should be served as application/wasm.pnpm --filter @compdfkit/webview test:unit # Vitest + happy-dom
pnpm --filter @compdfkit/webview lint # ESLint (.vue/.js/.jsx/.cjs/.mjs)There is no monorepo-wide test runner. The core package has no test infrastructure beyond individual .test.js files run manually.