{"_id":"pdfnative","_rev":"15-9babc8741c78ec2eb52a05e5cda65843","name":"pdfnative","dist-tags":{"latest":"1.8.0"},"versions":{"0.0.1":{"name":"pdfnative","version":"0.0.1","author":{"name":"nizoka"},"license":"MIT","_id":"pdfnative@0.0.1","maintainers":[{"name":"nizoka","email":"magestionweb@gmail.com"}],"dist":{"shasum":"a41b74f449816e09daa9d3d7156dd27d3b48a29f","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-0.0.1.tgz","fileCount":2,"integrity":"sha512-HJOFIjq4goeXbqy0F1sPzGhESMfNAiCt4tYd7NTQ86RGiYDckMYdwKHZL8UvRoe61onxU2mTPt2ZTfDFMS0hZg==","signatures":[{"sig":"MEUCIQCRdXHamsF77hugZTaMq7ULmNkh926HwtXozReLZejtSgIgMuFbzaZQ6pD+lnPrsZ2QQuw0y30X9U6ODWfvK5b/r9I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181},"main":"index.ts","_npmUser":{"name":"nizoka","email":"magestionweb@gmail.com"},"_npmVersion":"10.9.2","description":"Reserved name for upcoming Local-First PDF engine","directories":{},"_nodeVersion":"22.17.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pdfnative_0.0.1_1776029356126_0.15983820641386082","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"pdfnative","version":"1.0.0","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","multi-font","opentype","iso-32000","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.0.0","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"7a7f309cd181cfa64ecc9e503eb49f2e71321dd5","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.0.0.tgz","fileCount":49,"integrity":"sha512-LUCy8tzjtVrglS7AICcWcLQLzY6T34Up+o8uSS2qq7wxKbcMnw366Ccp1pJYilMepIVjnNCgGykoZu+ihpNf6A==","signatures":[{"sig":"MEUCIQC6oqxzv0dQhCdACzODtHp0bUKOdVoWcKuO7yoSd26sDwIgXQffLoIaWYMPXhUu+JMV/7bPRo/eph5zgDDeekbwB8Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":61750567},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}}},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"f0679cde76c51bba57c5c55b43a5d55f3abfbe3b","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.11.0","description":"Zero-dependency native PDF generation library with multi-font Unicode support (Thai shaping, CJK, Greek, Devanagari). Pure JavaScript ISO 32000-1 implementation.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.1.9","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.0.0_1776715892216_0.9713640109153794","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"pdfnative","version":"1.0.1","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","multi-font","opentype","iso-32000","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.0.1","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"5360ef941743991861a7b86a9e17c6c61e83a4c7","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.0.1.tgz","fileCount":49,"integrity":"sha512-z/yk5Pn4/61jmYcocc/AkR7uNv6hQ45m8zDuvQMl3zJ0ykuiipl2bKEG37N8iA4+Xycd+mVcpkzG1O/S+k4JWQ==","signatures":[{"sig":"MEUCIQCOeEKv+8N93rTnr+vKjkp2STnESzzJNxf72FxLDtOX8gIgVYgOW3J1iGLWpSobKh0rr6gF0EBjRWbH25SA3zLAHIM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":61763267},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}}},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"2f6e8be039fae20d0bb375d97d35a31db2c0577c","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.11.0","description":"Zero-dependency native PDF generation library with multi-font Unicode support (Thai shaping, CJK, Greek, Devanagari). Pure JavaScript ISO 32000-1 implementation.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.1.9","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.0.1_1776944780505_0.4591263217651904","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"pdfnative","version":"1.0.2","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.0.2","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"bc31b4a1c3e9ee2f4cfb7f4c3c73a6ede9d34cad","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.0.2.tgz","fileCount":49,"integrity":"sha512-DHOurbEbhT5Hw4ZPDvOG/MXTQGa78OGzysHJfUQGH8csjlNMrZAX1HUfUtOlCWnA9eZMrAn4HQCGVnTdtvuXqw==","signatures":[{"sig":"MEYCIQD+ffzdUOs7uVQcdvGaJXcCNALikKmmlRPdrJwlNuZx1gIhAJyNkFzLAtwSbX08kjTgZqVe3tVGusU+OpWxPbPcDyHP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":61763632},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}}},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"1d7b662710476c4a3d9862f95b054cfc23be05ab","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.11.0","description":"Zero-dependency native PDF generation library. 16 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Bengali, Tamil, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digital signatures, AcroForm, barcodes, SVG. Pure JavaScri","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.1.9","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.0.2_1777057108961_0.07040710850352805","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"pdfnative","version":"1.0.3","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.0.3","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"d016f2761a930d9eb1e61a070e847c117da87451","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.0.3.tgz","fileCount":49,"integrity":"sha512-K9TtLBX1yqk6ZcJWeOZ4Od873bOv389sSrClPJYcvvEiFa9+xnfido5wRr7Uo7+cXtRKE44HQLDELomuRP6m4A==","signatures":[{"sig":"MEUCIQD0X/RjAsZUl5fjbcuroubvrUkNL8hCCa7oiDvtUcyC+QIgcM9m0Qh/+UFV2cnG6XYZ6nj6CZvxB1/sDj+9c7vDHO4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":61773920},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}}},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"dc773b0a65506b0cb1738decc2549da9ad29c97c","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.11.0","description":"Zero-dependency native PDF generation library. 16 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Bengali, Tamil, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digital signatures, AcroForm, barcodes, SVG. Pure JavaScri","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.1.9","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.0.3_1777127038622_0.3601023196295061","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"pdfnative","version":"1.0.4","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.0.4","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"79e24a327b2704639c6b252dac2e1bd29e1d8917","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.0.4.tgz","fileCount":49,"integrity":"sha512-sfvpxEh3j+eEyXhFGj6yewkw98QCvfzTB1P+ggCLfhUYNb781TD3evA1OdlDC6YFAGAXRxquIKFLXbXyMInfVw==","signatures":[{"sig":"MEUCIQDKmqJEmlMs1Fs4ddx6TCdp/MYCAduEzwiBEjxCor7wjAIgOEqM1r8YEwPoa+OfTJcOW9Khrju3h2JjJQ7bR5eHjeg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":61884677},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}}},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"4b15d227918bee6788b140019c7ff2521684fdeb","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.11.0","description":"Zero-dependency native PDF generation library. 16 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Bengali, Tamil, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digital signatures, AcroForm, barcodes, SVG. Pure JavaScri","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.1.9","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.0.4_1777145396453_0.3818716615811717","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"pdfnative","version":"1.0.5","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.0.5","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"01dca2d4390a85dfa6ae5ac11f30072fdc45ceb0","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.0.5.tgz","fileCount":49,"integrity":"sha512-RnmUqTavEb81BNTDr6tbZySgQ/wXxAQnSBhnEGIkygTUfHljkRzk2+BMMK+3FJtjpjk8ZnJ/sAevAvIyFXYaUQ==","signatures":[{"sig":"MEYCIQDaCAoXEWn8KyTMlIkpBH2Td8w4LjniArYXXfv0j4AylwIhAOrNoBNeU8SgyMPMS5FIDpld5kaqZj5vzILxMNTekT/d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":61891602},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}}},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"ee728afa5c80354a1f75d44d60cad071790b4de5","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.11.0","description":"Zero-dependency native PDF generation library. 16 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Bengali, Tamil, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digital signatures, AcroForm, barcodes, SVG. Pure JavaScri","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.1.9","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.0.5_1777316993975_0.8828561964076749","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"pdfnative","version":"1.1.0","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","emoji","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.1.0","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"9a3bee217b51f25e46c424f742b2cbdbf8759d07","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.1.0.tgz","fileCount":53,"integrity":"sha512-d2+iK0GWgtcXgFl4SoCycu6ZZ5ZmF09Kv+18/FxNa3LMbBy66GZsleUelULNRtJD3aUI73xzSgJJXAD7Of/lwg==","signatures":[{"sig":"MEUCIGsuvBoMx7u5RgwH+Eh1iati6bxbHu/95/zAz2NwS0AAAiEA1WDSicZ8d1EhQxEa4iURLNrCADWugA8tvsAHuN+wkp8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":67776156},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}}},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"62f8c2e7d6994ce4afac0e76fde00cb527835a5a","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.11.0","description":"Zero-dependency native PDF generation library. 16 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Bengali, Tamil, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digital signatures, AcroForm, barcodes, SVG. Pure JavaScri","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.1.9","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.1.0_1777503056781_0.6532172053171439","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"pdfnative","version":"1.2.0","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","emoji","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.2.0","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"d629de211c7b7ee4a486b0cc7e2472ea75374a93","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.2.0.tgz","fileCount":53,"integrity":"sha512-atRSM6rEPAoWwn85tk3JIskVF+OVOrqBxkN7yX5JvZvLcnwhacZlNNo/xkI40kc05cQhI1T3SHMzSdxnYkymjA==","signatures":[{"sig":"MEYCIQDqTvq2gHnZczAjJKnxnhS3KAmkCEGfIfxW3BqhWuaOoQIhANiyUZb4GpvQvyAHgVr2GgwBazS7/+20I7CBgqhVekVp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":68074944},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}}},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"5312a5310582ca3fb0b8e7a30e8c7b73a3857fef","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.12.1","description":"Zero-dependency native PDF generation library. 16 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Bengali, Tamil, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digital signatures, AcroForm, barcodes, SVG. Pure JavaScri","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.1.9","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.2.0_1779915916225_0.2060547884226489","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"pdfnative","version":"1.3.0","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","telugu","sinhala","tibetan","khmer","myanmar","amharic","ethiopic","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","emoji","color-emoji","greek","cyrillic","georgian","armenian","font-subsetting","pdf-ua","watermark","web-worker","streaming","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.3.0","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs"},"dist":{"shasum":"93529a75c86cfb11def204fe9fda0db26bc89276","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.3.0.tgz","fileCount":67,"integrity":"sha512-nAueG9BBVm2GS/yNhWrC4DDSsnrvnvzeSU5VcP/GlYihRSXDD4NRCHOlgHivRlgxah9edfoS45uKFSAOMff+ug==","signatures":[{"sig":"MEUCIQCTbh3MktA2YW0iYruZCTch+7cg/THVzvluw0hHcDODdgIgFSru137HRKA3MDFsMekiISnksHw2k0RVyuWwVclwhPU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":79169448},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}},"./fonts/*":"./fonts/*","./package.json":"./package.json"},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"309d515dff537e5fe6bd65fa6eba451d1ff23484","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.13.0","description":"Zero-dependency native PDF generation library. 22 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Telugu, Bengali, Tamil, Sinhala, Tibetan, Khmer, Myanmar, Ethiopic, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digita","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^4.1.8","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.8"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.3.0_1780941263673_0.5803816949133411","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"pdfnative","version":"1.4.0","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","telugu","sinhala","tibetan","khmer","myanmar","amharic","ethiopic","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","emoji","color-emoji","greek","cyrillic","georgian","armenian","font-subsetting","pdf-ua","watermark","web-worker","streaming","outline","bookmarks","page-labels","merge-pdf","split-pdf","extract-pdf","pdf-manipulation","viewer-preferences","rsa","ecdsa","typescript"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.4.0","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs","pdfnative-build-emoji-font":"dist/tools/build-emoji-font.js"},"dist":{"shasum":"eb520a1b833df98f32b3bb8b19c5fc83425855fa","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.4.0.tgz","fileCount":68,"integrity":"sha512-AckW7BeWr+nRoazFVB5/EoOXs1UOermEqsxL6fUnRV5jvD5+I953PvkDJZtiIWtTk41NsRQLVUFFAr1FKtW8bg==","signatures":[{"sig":"MEUCIQDTlrEJzBfWBz1D1INBwiD6xHlnWlI1AuFjHD+31zNdgwIgc3T8xFY6a3rplLwerU61VyCRCYo9bBcpLqSWuyQRG9Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":79592387},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}},"./fonts/*":"./fonts/*","./package.json":"./package.json"},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"3ea085d1b7f9ef63ec96f4fc73de21b86b71538a","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"overrides":{"esbuild":"0.28.1"},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.13.0","description":"Zero-dependency native PDF generation library. 22 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Telugu, Bengali, Tamil, Sinhala, Tibetan, Khmer, Myanmar, Ethiopic, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digita","directories":{},"sideEffects":false,"_nodeVersion":"24.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^4.1.8","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.8"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.4.0_1782763682942_0.17046122158144272","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"pdfnative","version":"1.5.0","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","telugu","sinhala","tibetan","khmer","myanmar","amharic","ethiopic","bidi","multi-font","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","emoji","color-emoji","greek","cyrillic","georgian","armenian","font-subsetting","pdf-ua","watermark","web-worker","streaming","outline","bookmarks","page-labels","merge-pdf","split-pdf","extract-pdf","pdf-manipulation","viewer-preferences","rsa","ecdsa","typescript","svg-to-pdf","math-symbols","pdf-annotations","layout-inspection","font-tools","ai-governance","human-in-the-loop","hitl","responsible-ai","agent-safety","pdfkit-alternative","puppeteer-alternative","serverless-pdf","invoice","factur-x"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.5.0","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs","pdfnative-build-emoji-font":"dist/tools/build-emoji-font.js"},"dist":{"shasum":"e707b65853964640657bae4af322d1f22c582fba","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.5.0.tgz","fileCount":76,"integrity":"sha512-dl9UYcbErGqtKivaW6lPTqA4t9wqv1xEbQZYq3p1ykbUGS9yKo5PyBCHj1H2skcq54aNON/G/tPAvqyRYz6ZwA==","signatures":[{"sig":"MEUCIAEXVaHpKFmNGV77FS19pngTGf/xOQaT73o3qAdjHNr6AiEAtFa0FoOx1p069kUUoTWW9Qn5wOYHFoxqlpXGj4oWKkQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":81539428},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./tools":{"import":{"types":"./dist/tools/index.d.ts","default":"./dist/tools/index.js"},"require":{"types":"./dist/tools/index.d.cts","default":"./dist/tools/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}},"./fonts/*":"./fonts/*","./package.json":"./package.json"},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"d1299ea29d4bd301d02e9497fc4c5b6c11d9fba9","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run --config vitest.visual.config.ts","verify:issue":"node scripts/verify-issue.mjs","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"overrides":{"esbuild":"0.28.1"},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency native PDF generation library. 22 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Telugu, Bengali, Tamil, Sinhala, Tibetan, Khmer, Myanmar, Ethiopic, Cyrillic, Greek, Georgian, Armenian, Latin), BiDi, PDF/A-1b/2b/3b, AES encryption, digita","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^4.1.8","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.8"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.5.0_1783217128377_0.09090415012729625","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"pdfnative","version":"1.6.0","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","hebrew","bengali","tamil","devanagari","telugu","sinhala","tibetan","khmer","myanmar","ethiopic","bidi","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","acroform","barcode","qr-code","emoji","color-emoji","greek","cyrillic","georgian","armenian","font-subsetting","pdf-ua","watermark","web-worker","streaming","outline","bookmarks","page-labels","merge-pdf","split-pdf","extract-pdf","pdf-manipulation","pdf-parser","pdf-text-extraction","extract-text-from-pdf","fill-pdf-form","flatten-pdf","pdf-form-filling","decrypt-pdf","encrypt-pdf","aes-256","pdf-charts","rsa","ecdsa","typescript","svg-to-pdf","math-symbols","pdf-annotations","font-tools","ai-governance","human-in-the-loop","responsible-ai","agent-safety","pdfkit-alternative","puppeteer-alternative","serverless-pdf","invoice","factur-x"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.6.0","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs","pdfnative-build-emoji-font":"dist/tools/build-emoji-font.js"},"dist":{"shasum":"75f063f60933ace22283fbe3d6d3df7a7a7e6579","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.6.0.tgz","fileCount":76,"integrity":"sha512-gzwDxXD8iMLM5tSd86RQwIiX0gh9Oe2IzpYCnOgVzsHqOIPnbOZdiHWRkxZphAXIofEdrqBb5Zr/uhSBiVyD7w==","signatures":[{"sig":"MEUCIDHR0rqr3b9RMT6en78d5H1IQeJHWLnmvnGkeEGE8noaAiEA4uyMQx49yrcgBFP/IMk5Fyx7Mz2GtPnkaZfgq/rk0rc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":85675103},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./tools":{"import":{"types":"./dist/tools/index.d.ts","default":"./dist/tools/index.js"},"require":{"types":"./dist/tools/index.d.cts","default":"./dist/tools/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}},"./fonts/*":"./fonts/*","./package.json":"./package.json"},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"f88c3b05cb507617b2329ab5e0b98445a0b72b88","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run tests/visual/","verify:issue":"node scripts/verify-issue.mjs","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"overrides":{"esbuild":"0.28.1"},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency native PDF library: generate, parse, merge/split, extract text with positions, fill & flatten AcroForms, decrypt and re-encrypt (RC4, AES-128/256), and draw native vector charts. 22 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Telugu, B","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^4.1.8","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.8"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.6.0_1784491127976_0.3322032091821623","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"pdfnative","version":"1.7.0","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","persian","farsi","hebrew","bengali","tamil","devanagari","telugu","sinhala","tibetan","khmer","myanmar","ethiopic","bidi","rtl","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","sign-pdf","pades","ltv","long-term-validation","dss","rfc3161","document-timestamp","ocsp","crl","acroform","barcode","qr-code","emoji","color-emoji","greek","cyrillic","georgian","armenian","font-subsetting","pdf-ua","watermark","web-worker","streaming","outline","bookmarks","page-labels","merge-pdf","split-pdf","extract-pdf","pdf-manipulation","pdf-parser","pdf-text-extraction","extract-text-from-pdf","fill-pdf-form","flatten-pdf","pdf-form-filling","decrypt-pdf","encrypt-pdf","aes-256","pdf-charts","rsa","ecdsa","typescript","svg-to-pdf","math-symbols","pdf-annotations","font-tools","ai-governance","human-in-the-loop","responsible-ai","agent-safety","pdfkit-alternative","puppeteer-alternative","serverless-pdf","invoice","factur-x","print-ready","bleed","crop-marks","prepress"],"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","_id":"pdfnative@1.7.0","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"homepage":"https://github.com/Nizoka/pdfnative#readme","bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"bin":{"pdfnative-build-font":"tools/build-font-data.cjs","pdfnative-build-emoji-font":"dist/tools/build-emoji-font.js"},"dist":{"shasum":"716d615d47f16a50db3ec226688fc407748cde22","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.7.0.tgz","fileCount":77,"integrity":"sha512-GTU2XFmhhbJrbX67ctYU5ctleBdUx9ClbEMKnB4QJSgB2VN5Xylylxm+Tj39BfFnNt/yGldzJLhSwhC1WNnJgg==","signatures":[{"sig":"MEYCIQCapPIfYrmifyijMb1eixB3dYCYMV2eDBiQcahO1jnt9gIhAOeGqYlD6TPD+Rb2PM49zkLJyemIIcS61c/u849wTi3z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":87465935},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./tools":{"import":{"types":"./dist/tools/index.d.ts","default":"./dist/tools/index.js"},"require":{"types":"./dist/tools/index.d.cts","default":"./dist/tools/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}},"./fonts/*":"./fonts/*","./package.json":"./package.json"},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"ae2785e810dcabb1ac295465cb508ead4569b914","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup","docs:llms":"npx tsx scripts/build-llms-full.ts","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","test:visual":"vitest run tests/visual/","verify:docs":"npx tsx scripts/verify-docs.ts","verify:issue":"node scripts/verify-issue.mjs","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"overrides":{"esbuild":"0.28.1"},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.17.0","description":"Zero-dependency native PDF library: generate, parse, merge/split, extract text with positions, fill & flatten AcroForms, decrypt and re-encrypt (RC4, AES-128/256), and draw native vector charts (stacked/area/scatter, log & time axes). 22 scripts (Arabic, ","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^4.1.8","typescript":"^5.4.0","@types/node":"^22.0.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.8"},"_npmOperationalInternal":{"tmp":"tmp/pdfnative_1.7.0_1787338860723_0.8766406537570237","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"_id":"pdfnative@1.8.0","bin":{"pdfnative-build-font":"tools/build-font-data.cjs","pdfnative-build-emoji-font":"dist/tools/build-emoji-font.js"},"bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"dist":{"shasum":"c70bb8571440aeb67660b21d4543ef3366e204da","tarball":"https://registry.npmjs.org/pdfnative/-/pdfnative-1.8.0.tgz","fileCount":87,"integrity":"sha512-17No1Xn9ZwnMNSMWIaGtgHNGYiayEzn1B59YYLS/1EJr/GHMFRRSMnXRGIbJktAjktzRV61NYGl4bTlAc7Ii1w==","signatures":[{"sig":"MEQCIFTHO8r//nPj+8K7/UdQruTOA4cXpvZcluhnl0etpsq2AiB5ys3uA7ftYt8c+sBrX8s0U70g7uq2e2izc/WxsEPVQg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEWTSQb6YRgh8Bi8dKQLstyVCNsJQLGB3tGSikbWh0X2AiAZ3FTOgJnN/1MSaUfm/VvB32l+vkYIooo6lUD6mFku3Q=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfnative@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":92972885},"main":"./dist/index.cjs","name":"pdfnative","type":"module","types":"./dist/index.d.ts","author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"module":"./dist/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./tools":{"import":{"types":"./dist/tools/index.d.ts","default":"./dist/tools/index.js"},"require":{"types":"./dist/tools/index.d.cts","default":"./dist/tools/index.cjs"}},"./worker":{"import":{"types":"./dist/worker/index.d.ts","default":"./dist/worker/index.js"},"require":{"types":"./dist/worker/index.d.cts","default":"./dist/worker/index.cjs"}},"./fonts/*":"./fonts/*","./package.json":"./package.json"},"funding":{"url":"https://plika.app","type":"individual"},"gitHead":"69d6a5f504a982d359b447aa272ad079d1c5e269","license":"MIT","scripts":{"dev":"tsup --watch","gate":"npx tsx scripts/gate.ts","lint":"eslint src/","test":"vitest run","bench":"vitest bench","build":"tsup --silent","docs:all":"npm run docs:api && npm run docs:guides && npm run docs:llms","docs:api":"npx tsx scripts/build-api-json.ts","docs:llms":"npx tsx scripts/build-llms-full.ts","gate:fast":"npx tsx scripts/gate.ts --fast","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/ --listen 5000","test:watch":"vitest","docs:guides":"npx tsx scripts/build-guides.ts","test:visual":"vitest run tests/visual/","verify:docs":"npx tsx scripts/verify-docs.ts","agents:rules":"npx tsx scripts/build-claude-rules.ts","verify:fonts":"npx tsx scripts/verify-fonts.ts","verify:issue":"node scripts/verify-issue.mjs","fonts:subsets":"npx tsx scripts/build-latin-subsets.ts","hooks:install":"node scripts/install-git-hooks.mjs","test:coverage":"vitest run --coverage","test:generate":"npx tsx scripts/generate-samples.ts","typecheck:all":"npm run typecheck && npm run typecheck:tests && npm run typecheck:scripts","validate:pdfa":"npx tsx scripts/validate-pdfa.ts","verify:bundle":"npx tsx scripts/verify-bundle.ts","fonts:download":"npx tsx scripts/download-fonts.ts","prepublishOnly":"npm run build","verify:samples":"npx tsx scripts/verify-samples.ts","verify:unicode":"npx tsx scripts/generate-use-data.ts --check","hooks:uninstall":"node scripts/install-git-hooks.mjs --uninstall","typecheck:tests":"tsc --project tsconfig.test.json --noEmit","typecheck:scripts":"tsc --project tsconfig.scripts.json --noEmit"},"version":"1.8.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5ccb2765-a6b0-4ed8-9c84-9aa3b7aa3903"}},"homepage":"https://github.com/Nizoka/pdfnative#readme","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","persian","farsi","hebrew","bengali","tamil","devanagari","telugu","sinhala","tibetan","khmer","myanmar","lao","tai-tham","lanna","new-tai-lue","tai-le","cham","ethiopic","bidi","rtl","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","sign-pdf","pades","ltv","long-term-validation","dss","rfc3161","document-timestamp","ocsp","crl","acroform","barcode","qr-code","emoji","color-emoji","greek","cyrillic","georgian","armenian","font-subsetting","pdf-ua","watermark","web-worker","streaming","outline","bookmarks","page-labels","merge-pdf","split-pdf","extract-pdf","pdf-manipulation","pdf-parser","pdf-text-extraction","extract-text-from-pdf","fill-pdf-form","flatten-pdf","pdf-form-filling","decrypt-pdf","encrypt-pdf","aes-256","pdf-charts","rsa","ecdsa","typescript","svg-to-pdf","math-symbols","pdf-annotations","font-tools","ai-governance","human-in-the-loop","responsible-ai","agent-safety","pdfkit-alternative","puppeteer-alternative","serverless-pdf","invoice","factur-x","print-ready","bleed","crop-marks","prepress","cmyk","pdf-x","pdfx-4","icc-profile","typography","kerning","hyphenation","justification","pagination","indic","text-shaping","universal-shaping-engine","colrv1","reproducible-pdf","pdf-validation","yoruba","swahili"],"overrides":{"esbuild":"0.28.1","js-yaml":"4.3.2"},"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"_npmVersion":"11.19.1","description":"Zero-dependency native PDF library: generate, parse, merge/split, extract text with positions, fill & flatten AcroForms, decrypt and re-encrypt (RC4, AES-128/256), and draw native vector charts (stacked/area/scatter, log & time axes). 27 scripts (Arabic, ","directories":{},"maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"npm@10.9.2","devDependencies":{"tsx":"^4.22.4","tsup":"^8.0.0","react":"^19.2.8","eslint":"^9.0.0","marked":"12.0.2","vitest":"^4.1.11","typescript":"^5.4.0","@types/node":"^22.0.0","pdfnative-react":"^1.2.0","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.11"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pdfnative_1.8.0_1789478865589_0.7610937436220804"}}},"time":{"created":"2026-04-12T21:29:16.125Z","modified":"2026-09-15T13:27:46.557Z","0.0.1":"2026-04-12T21:29:16.259Z","1.0.0":"2026-04-20T20:11:33.124Z","1.0.1":"2026-04-23T11:46:21.383Z","1.0.2":"2026-04-24T18:58:29.819Z","1.0.3":"2026-04-25T14:23:59.530Z","1.0.4":"2026-04-25T19:29:57.315Z","1.0.5":"2026-04-27T19:09:54.869Z","1.1.0":"2026-04-29T22:50:57.716Z","1.2.0":"2026-05-27T21:05:16.891Z","1.3.0":"2026-06-08T17:54:24.295Z","1.4.0":"2026-06-29T20:08:03.537Z","1.5.0":"2026-07-05T02:05:28.991Z","1.6.0":"2026-07-19T19:58:48.607Z","1.7.0":"2026-08-21T19:01:01.356Z","1.8.0":"2026-09-15T13:27:46.177Z"},"bugs":{"url":"https://github.com/Nizoka/pdfnative/issues"},"author":{"url":"https://pdfnative.dev","name":"Nizoka","email":"hello@pdfnative.dev"},"license":"MIT","homepage":"https://github.com/Nizoka/pdfnative#readme","keywords":["pdf","pdf-generation","zero-dependency","native-pdf","unicode","thai","cjk","arabic","persian","farsi","hebrew","bengali","tamil","devanagari","telugu","sinhala","tibetan","khmer","myanmar","lao","tai-tham","lanna","new-tai-lue","tai-le","cham","ethiopic","bidi","rtl","opentype","iso-32000","pdf-a","tagged-pdf","accessibility","encryption","digital-signature","sign-pdf","pades","ltv","long-term-validation","dss","rfc3161","document-timestamp","ocsp","crl","acroform","barcode","qr-code","emoji","color-emoji","greek","cyrillic","georgian","armenian","font-subsetting","pdf-ua","watermark","web-worker","streaming","outline","bookmarks","page-labels","merge-pdf","split-pdf","extract-pdf","pdf-manipulation","pdf-parser","pdf-text-extraction","extract-text-from-pdf","fill-pdf-form","flatten-pdf","pdf-form-filling","decrypt-pdf","encrypt-pdf","aes-256","pdf-charts","rsa","ecdsa","typescript","svg-to-pdf","math-symbols","pdf-annotations","font-tools","ai-governance","human-in-the-loop","responsible-ai","agent-safety","pdfkit-alternative","puppeteer-alternative","serverless-pdf","invoice","factur-x","print-ready","bleed","crop-marks","prepress","cmyk","pdf-x","pdfx-4","icc-profile","typography","kerning","hyphenation","justification","pagination","indic","text-shaping","universal-shaping-engine","colrv1","reproducible-pdf","pdf-validation","yoruba","swahili"],"repository":{"url":"git+https://github.com/Nizoka/pdfnative.git","type":"git"},"description":"Zero-dependency native PDF library: generate, parse, merge/split, extract text with positions, fill & flatten AcroForms, decrypt and re-encrypt (RC4, AES-128/256), and draw native vector charts (stacked/area/scatter, log & time axes). 27 scripts (Arabic, ","maintainers":[{"name":"nizoka","email":"nizoka@plika.app"}],"readme":"# pdfnative\n\n[![CI](https://github.com/Nizoka/pdfnative/actions/workflows/ci.yml/badge.svg)](https://github.com/Nizoka/pdfnative/actions/workflows/ci.yml)\n[![CodeQL](https://github.com/Nizoka/pdfnative/actions/workflows/codeql.yml/badge.svg)](https://github.com/Nizoka/pdfnative/actions/workflows/codeql.yml)\n[![npm version](https://img.shields.io/npm/v/pdfnative)](https://www.npmjs.com/package/pdfnative)\n[![npm downloads](https://img.shields.io/npm/dm/pdfnative)](https://www.npmjs.com/package/pdfnative)\n[![bundle size](https://img.shields.io/bundlephobia/minzip/pdfnative)](https://bundlephobia.com/package/pdfnative)\n[![zero dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)](https://www.npmjs.com/package/pdfnative)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue)](https://www.typescriptlang.org/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![npm provenance](https://img.shields.io/badge/provenance-signed-blueviolet)](https://docs.npmjs.com/generating-provenance-statements)\n[![website](https://img.shields.io/badge/pdfnative.dev-0066FF?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxyZWN0IHg9IjMiIHk9IjIiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxOCIgcng9IjIiIGZpbGw9Im5vbmUiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMS41Ii8+PHBhdGggZD0iTTcgN2g2TTcgMTFoOE03IDE1aDQiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48L3N2Zz4=)](https://pdfnative.dev)\n[![pdfnative-mcp](https://img.shields.io/npm/v/pdfnative-mcp?label=pdfnative-mcp&color=6366f1)](https://www.npmjs.com/package/pdfnative-mcp)\n[![pdfnative-cli](https://img.shields.io/npm/v/pdfnative-cli?label=pdfnative-cli&color=0e7490)](https://www.npmjs.com/package/pdfnative-cli)\n[![pdfnative-react](https://img.shields.io/npm/v/pdfnative-react?label=pdfnative-react&color=06b6d4)](https://www.npmjs.com/package/pdfnative-react)\n\nPure native PDF generation library — zero vendor dependencies. Conforms to ISO 32000-1 (PDF 1.7).\n\n## Ecosystem\n\npdfnative ships as four coordinated packages — pick whichever entry point fits your workflow:\n\n| Package | Latest | Use it for |\n|---|:---:|---|\n| [`pdfnative`](https://www.npmjs.com/package/pdfnative) | **v1.8.0** | The library itself — call from Node, browsers, Workers, Deno, Bun. |\n| [`pdfnative-cli`](https://www.npmjs.com/package/pdfnative-cli) | **v1.4.0** | Render JSON → PDF, sign with the **complete PAdES ladder** (`sign --timestamp` B-T, `ltv` B-LT with air-gapped collect → embed, `doc-timestamp` B-LTA; RSA-SHA256/384/512 + ECDSA, native constant-time crypto by default), inspect, verify, **compare** (CI text + structure diff), signature-safe **metadata** edits, **merge / split / extract** pages, **annotate**, **govern** (AI-governance / HITL gate), declarative **batch `--manifest`** pipelines, and emit JSON Schemas from the shell. Pins pdfnative `^1.7.0`: 27 scripts + COLRv1 emoji, `--font math`, charts v2, print production, `render --strict` PDF/A gating, and an agent-native `--json`/`E_*`/`--dry-run`/`--summary` contract. Node ≥ 22. |\n| [`pdfnative-mcp`](https://www.npmjs.com/package/pdfnative-mcp) | **v1.6.0** | Use pdfnative from Claude Desktop, Cursor, Continue, Zed (or any MCP client, stdio or HTTP) — **28 production tools** spanning the engine's full document model: all 13 block kinds in `generate_basic_pdf`, layout options, build-time `encrypt` that keeps the AcroForm, image watermarks, print production (page boxes, bleed, marks, `/UserUnit`, OutputIntent), charts v2 (stacked / area / scatter, dual axis, log & time scales), the complete PAdES ladder B-B → B-LTA (`sign_pdf` with RFC 3161 timestamps, `add_ltv`, `timestamp_pdf`, `verify_pdf ltv: true`), `update_metadata`, the read-only `inspect_layout` pagination preview, honest PDF/A (`embedFonts` / `strict` / diagnostics), six MCP prompts, token-frugal read modes (`verbosity` / `fields`), the network-free `draft_governance_issue` (AI-governance / HITL), and the MCP **2026-07-28** spec with automatic legacy fallback. No outbound request by default — the only permitted egress is operator-configured TSA / OCSP / CRL. Pins pdfnative `^1.7.0`. |\n| [`pdfnative-react`](https://www.npmjs.com/package/pdfnative-react) | **v1.2.0** | Write PDFs as declarative JSX — `<Document>`, `<Page>`, `<Table>`, `<Barcode>`, `<Svg>`, `<FormField>`… compiled on-device to pdfnative blocks by a custom React 19 reconciler. Charts v2 (9 kinds, dual axes, log/time scales), print production (`<Document print>`), the PDF/A diagnostics channel (`layout.strict` / `onDiagnostic`), HTTP caching on `renderToResponse` (`etag` / `cacheControl`), 25 lint rules, client hooks & components (`usePdf`, `PDFViewer`, `PDFDownloadLink`), and a versioned `DocSpec` grammar (`docSpecSchema()`) for AI agents. Peer: pdfnative ^1.7.0, React ^19.0.0, Node ≥22. (A 1.6 engine would throw mid-render on the charts-v2 fields.) |\n\n```bash\nnpm install pdfnative                 # library\nnpm install pdfnative pdfnative-react react   # React renderer (pdfnative + React 19 peers)\nnpm install -g pdfnative-cli          # CLI\nnpm install -g pdfnative-mcp          # MCP server\n```\n\nDetailed docs: [CLI guide](docs/guides/cli.md) · [MCP guide](docs/guides/mcp.md) · [React guide](docs/guides/react.md) · [Onboarding cheatsheet](docs/guides/onboarding.md).\n\n## Highlights\n\n- **Zero dependencies** — built from scratch in pure TypeScript. Zero runtime dependencies, tree-shakeable, auditable\n- **Conforms to ISO 32000-1** — valid xref tables, /Info metadata, proper font embedding\n- **27 Unicode scripts** — Thai, Japanese, Chinese (SC), Korean, Greek, Devanagari, Telugu, Turkish, Vietnamese, Polish, Arabic, Hebrew, Cyrillic, Georgian, Armenian, Bengali, Tamil, Sinhala, Tibetan, Khmer, Myanmar, Lao, Tai Tham (Lanna), New Tai Lue, Tai Le, Cham, Ethiopic\n- **Universal Shaping Engine** — cluster categories derived from the Unicode Character Database, driving Tai Tham and Cham\n- **Thai and Lao OpenType shaping** — GSUB substitution + GPOS mark-to-base + mark-to-mark positioning\n- **Arabic positional shaping** — GSUB isolated/initial/medial/final forms + lam-alef ligatures\n- **BiDi text layout** — Unicode Bidirectional Algorithm (UAX #9) with isolates (LRI/RLI/FSI/PDI) and explicit embeddings (LRE/RLE/LRO/RLO/PDF) including character-level X4–X5 overrides (v1.3.0). **v1.7.0** implements I1/I2 even embedding levels so digit runs (European, Arabic-Indic, Extended Arabic-Indic) keep logical order in RTL text, and full rule-L4 glyph mirroring through the complete 428-pair `BidiMirroring.txt` table\n- **Indic OpenType engine** (v1.8.0) — Devanagari, Bengali, Tamil, Telugu and Sinhala share one engine that applies the font's own GSUB features per syllable in specification order (`rphf`, `half`, `blwf`, `pstf`, `vatu`, `cjct`, `pres` … `haln`, contextual lookups included) and attaches every vowel sign to the anchor its font declares: reph over the consonant after the base, half forms, subjoined consonants, pre-base matras in front. Fed by the `otl` layout tables every font module now carries; the words of a rendering report on the Hindi, Tamil and Telugu samples are golden tests on the bundled fonts\n- **Latin combining marks** (v1.8.0) — free-standing marks (Yoruba ẹ́ ọ̀, Igbo ị́, NFD accents, Greek and Cyrillic diacritics) compose through the font's `ccmp` and GPOS anchors; Hausa, Yoruba, Igbo and Swahili render on the bundled `latin` module with no new font\n- **USE-lite shaping** — `classifyUseCategory` / `classifyClusters` classify joiners for the Indic engine and the Khmer, Myanmar and Tibetan shapers (v1.3.0)\n- **Colour emoji (COLRv1)** — opt-in Noto Color Emoji subset (**expanded to 1167 glyphs in v1.6.0**, ~4.5 MB with the v1.7.0 sequence ligatures, incl. the complete Transport & Map block); solid + linear + radial gradient layers rendered as native PDF Form XObjects; monochrome fallback when not registered (v1.3.0). Variation selectors, ZWJ/ZWNJ, and skin-tone modifiers no longer leave tofu, and glyph `/BBox` is computed from contour bounds so emoji are never clipped (v1.3.0). **Advanced compositing** (v1.4.0): COLRv1 sweep (conic) gradients render as native flat-shaded wedges, and `PaintComposite` separable blend modes (Multiply, Screen, Overlay, Darken, Lighten, …) map to PDF `/BM` ExtGState; structural Porter-Duff modes fall back to monochrome. **Flag & ZWJ sequences** (v1.7.0): 51 flags + 22 ZWJ sequences (families, professions, rainbow/pirate flags, …) resolve through the source font's GSUB into single colour ligature glyphs with a longest-match pre-pass — both VS-16 spellings match, uncovered sequences degrade to the historical per-codepoint rendering, and the CLI bundles any custom set (`--sequences`, `--sequence-list`, skin tones included). **Skin tones, transforms and masks** (v1.8.0): 30 gestures and people bundled in all five tones (1189 glyphs + 223 sequences, ~4.9 MB); every COLRv1 transform and variable paint is read, and `SRC_IN`/`DEST_IN` masks render as clipping paths, so flags keep their shaded wave. [Guide →](docs/guides/colour-emoji.md)\n- **Multi-font fallback** — automatic cross-script font switching with continuation bias\n- **TTF subsetting** — only used glyphs embedded (dramatic file size reduction)\n- **Tagged PDF / PDF/A** — structure tree, /ActualText, XMP metadata, sRGB OutputIntent (PDF/A-1b, 2b, 2u, 3b with embedded file attachments). **Conformance guards** (v1.7.0): configurations that would break the declared PDF/A level (no embedded fonts, DeviceCMYK images) surface a diagnostic — `console.warn` by default, a custom `onDiagnostic` sink, or a thrown error under `strict: true`. **CMYK intents** (v1.8.0): CMYK and Gray OutputIntent profiles, with RGB content kept conforming through a calibrated `/DefaultRGB`. [Guide →](docs/guides/pdfa.md)\n- **PDF Encryption (round-trip)** — **write** AES-128 (V4/R4) and AES-256 (V5/R6) encrypted PDFs (RC4 is never emitted), and **read** all of AES-128, AES-256, and legacy RC4 (V1–V4); owner + user passwords, granular permissions. **v1.6.0** adds a Standard Security Handler **decryptor** — `openPdf(bytes, { password })` decrypts transparently, the merge/split API ingests encrypted sources **and re-encrypts its output** (`MergeOptions.encrypt`, AES only, fresh keys) — closing the full *open → edit → re-secure* round trip. [Guide →](docs/guides/pdf-manipulation.md)\n- **Native vector charts** (v1.6.0, **charts v2 in v1.7.0**) — bar, horizontal-bar, line, pie, donut, **stacked bars, area, and scatter** `chart` blocks rendered as pure PDF path operators (zero deps, no rasterisation); multi-series, legends, \"nice\" axis ticks, negative values, tagged `/Figure` + alt text. v1.7.0 adds a **secondary right axis**, **log and UTC-deterministic time scales**, **per-point data labels**, and x-label collision handling (automatic stride + `labelStride` / `labelRotation`). [Guide →](docs/guides/charts.md)\n- **Text extraction** (v1.6.0) — `extractText()` decodes page content streams into per-page reading-order Unicode text plus optional positioned runs; `/ToUnicode` CMap, `/Encoding /Differences`, and WinAnsi/MacRoman decoding; works on encrypted documents (`{ password }`); hard `maxTextLength` memory cap for untrusted input. [Guide →](docs/guides/text-extraction.md)\n- **Free-form document builder** — headings, paragraphs, lists (incl. **nested / hierarchical** bullet & numbered lists, v1.4.0), tables, images, barcodes, SVG paths, form fields, spacers, page breaks, table of contents. Configurable block limit via `layout.maxBlocks` (default 100 000) for very large reports (v1.3.0)\n- **Smart tables** — multi-page slicing with repeated headers, auto-wrap on column overflow, zebra striping, captions, and smart auto-fit columns (v1.2.0), plus per-cell **borders** (`cellBorders`) and **vertical alignment** (`cellVAlign` / `ColumnDef.vAlign`, v1.4.0). [Guide →](docs/guides/tables.md)\n- **Barcode & QR code generation** — Code 128, EAN-13, QR Code, Data Matrix, PDF417 — pure PDF path operators (no images)\n- **SVG rendering** — path, rect, circle, ellipse, line, polyline, polygon as native PDF operators, plus `<text>` elements rendered as upright PDF text with `x`/`y` positioning and `text-anchor` (start/middle/end) support (v1.5.0)\n- **AcroForm fields** — text, multiline, checkbox, radio, dropdown, listbox with appearance streams (ISO 32000-1 §12.7). **v1.6.0** adds **fill & flatten of existing forms**: `readFormFields()`, `fillForm()` (regenerates appearances), and `flattenForm()` — non-destructive incremental update that preserves prior signatures, **including on encrypted documents** (appended objects are encrypted under the document's existing scheme). [Guide →](docs/guides/form-filling.md)\n- **Digital signatures** — CMS/PKCS#7 detached signatures with RSA (SHA-256/384/512, v1.7.0) + ECDSA-SHA256 (P-256) and X.509 parsing (ISO 32000-1 §12.8). One-call placeholder injection via `addSignaturePlaceholder()` (v1.2.0). Pluggable **native crypto provider** (`setCryptoProvider()` / `PdfSignOptions.provider`, v1.4.0) for constant-time, hardware-backed signing (`node:crypto` / Web Crypto / HSM). **v1.7.0**: PAdES baseline profile (`profile: 'pades'` — ESS signing-certificate-v2, `ETSI.CAdES.detached`), **multiple signatures** (`allowMultiple` + `fieldName` selector), and `listSignatures()` inspection. [Guide →](docs/guides/signatures.md)\n- **Print production** (v1.7.0) — bleed/trim/art/crop **page boxes** (`layout.print`, with a one-line `bleed` shorthand), **crop & registration marks** drawn as pure vector operators outside the TrimBox, `/Trapped` metadata with XMP parity, print-dialog defaults (**duplex**, tray pick, page range, copies), caller-supplied **OutputIntent ICC profile** (tagged mode), and large-format `/UserUnit` (banners, plans). Boxes survive `mergePdfs`/`splitPdf`. Byte-identical output when unused. **CMYK & PDF/X-4** (v1.8.0): CMYK colours on every colour option (`[c, m, y, k]` in percent), CMYK and Gray OutputIntents with RGB content kept conforming, marks in the all-separation registration colour and clear of both the trim line and the sheet edge, opt-in **colour control bars** (`marks: { colourBars: true }`), marks tagged as a `/Page` artifact in accessible output, a `pdfx: 'pdfx4'` conformance claim, and `validatePdfX()` to check it. [Guide →](docs/guides/print.md)\n- **Typography** (v1.8.0) — paragraphs that break across pages under **widow and orphan** rules, headings **kept with** what they introduce (with a `minLines` quota), opt-in **short-word binding** so a line never ends on \"a\" or \"I\", `align: 'justify'` written as one `TJ` array per line (spaces preserved for search and extraction), **optical margin** alignment, soft hyphens plus a `setHyphenationProvider()` seam with a document language, ISO 80000-1 **number–unit binding**, French and Canadian-French **punctuation spacing** (narrow no-break spaces rendered with a registered font), exact Adobe Core 14 **metrics**, GPOS pair **kerning** and OpenType single-substitution **features** (`onum`, `pnum`, `smcp`, …) with a diagnostic when a tag changes nothing. All opt-in under `layout.typography`; byte-identical when unset. [Guide →](docs/guides/typography.md)\n- **Long-term validation (LTV, PAdES B-B → B-LTA)** (v1.7.0) — RFC 3161 **signature timestamps** (`signPdfBytesWithTimestamp()`), embedded revocation material in `/DSS` + per-signature `/VRI` (`addValidationInfo()` — OCSP RFC 6960 + CRL RFC 5280), and **document timestamps** (`addDocumentTimestamp()`). Network transport is injected (`TimestampProvider` / `RevocationProvider`) — the engine stays offline and zero-dependency; rejected or tampered TSA tokens are never embedded. [Guide →](docs/guides/ltv.md)\n- **Streaming output** — AsyncGenerator-based progressive PDF emission with configurable chunk size, object-boundary page-by-page streaming, and **true constant-memory streaming** (`buildDocumentPDFStreamTrue()`, v1.3.0) where the full PDF binary never materialises. One-call `streamToFile()` drains any stream to disk with back-pressure and `AbortSignal` support (v1.4.0). [Guide →](docs/guides/streaming.md)\n- **Document outline & page labels** — nested bookmarks (`/Outlines` tree, with bold/italic/colour, collapsible nodes via `open: false`, explicit or `outline: 'auto'` from headings) and logical page numbering (`/PageLabels`: decimal, roman, alpha, prefixes, custom start) (v1.4.0). [Guide →](docs/guides/outlines.md)\n- **Viewer preferences** — `PdfLayoutOptions.viewerPreferences` controls initial `/PageLayout` & `/PageMode` plus the `/ViewerPreferences` dict (hide toolbar/menubar, fit/center window, display doc title, non-full-screen mode, reading direction, print scaling) — PDF/A-safe (v1.4.0). **v1.7.0** adds the print-dialog defaults: `duplex`, `pickTrayByPDFSize`, `printPageRange`, `numCopies`. [Guide →](docs/guides/viewer-preferences.md)\n- **Font-data validator** — opt-in `validateFontData()` structurally checks custom font modules (SFNT magic, base64 integrity, cmap coverage, glyph-id range, width array, finite metrics) and returns `{ valid, errors, warnings }` (v1.4.0). [Guide →](docs/guides/font-validation.md)\n- **PDF parser & modifier** — read existing PDFs (tokenizer, xref, object parser, FlateDecode inflate) + incremental modification. Read-only PDF/UA structural checker `validatePdfUA()` (ISO 14289-1: MarkInfo, StructTree, ParentTree, Lang, per-page MCID uniqueness) (v1.3.0), and its PDF/X-4 counterpart `validatePdfX()` (ISO 15930-7: header, XMP identification, OutputIntent profile, page boxes, embedded fonts, annotations, device colour) (v1.8.0). **Page-tree manipulation** (v1.4.0): `mergePdfs()`, `splitPdf()`, `extractPages()` rebuild a clean object graph (inherited attributes resolved, annotations/signatures optionally dropped, deterministic trailer `/ID`, bounded-depth copy, 256 MiB output cap via `maxOutputSize`). **Round-trip readers** (v1.5.0): `getPageLabels()` parses `/PageLabels` back into a typed `PageLabelRange[]`; `getAnnotations()` / `getPageRef()` read page annotations, and `PdfModifier.addAnnotation()` injects new ones incrementally. **v1.6.0**: a Standard Security Handler **decryptor** (`openPdf(bytes, { password })`, RC4/AES-128/AES-256) lets the reader and page-tree API ingest encrypted sources, and **constant-memory streaming** variants `streamMergedPdfs()` / `streamSplitPdf()` / `streamExtractPages()` emit merges/splits in fixed-size chunks (byte-identical to the buffered functions). [Guide →](docs/guides/pdf-manipulation.md)\n- **Markup annotations** — typed annotation model (text, highlight, underline, strikeout, squiggly, square, circle, line, freetext) via `buildAnnotation()` / `buildAnnotationBody()`, plus `PdfReader.getAnnotations()` and `PdfModifier.addAnnotation()` for round-trip read/write (v1.5.0); **v1.6.0** lets `addAnnotation()` operate on encrypted documents (RC4/AES sources, annotations stored encrypted). [Guide →](docs/guides/annotations.md)\n- **Layout debug & inspection** — opt-in `layout: { debug: true }` overlays margin / content / cell boxes for visual layout debugging; `inspectDocumentLayout()` returns a programmatic per-page block-geometry report. Byte-identical when debug is off (v1.5.0). [Guide →](docs/guides/debugging.md)\n- **Math & technical symbols** — bundleable math font under lang `'math'`; mathematical operators, Greek, arrows, and technical symbols route automatically via script detection (v1.5.0)\n- **Font-data tooling** — `pdfnative/tools` exposes `compileFontData()` / `parseFontData()` to build and introspect font-data modules programmatically (v1.5.0)\n- **Image embedding** — JPEG (DCTDecode) and PNG (FlateDecode) with auto-scaling and alignment\n- **Hyperlinks** — PDF link annotations (/URI) with URL validation, blue underlined text, tagged /Link\n- **Header/footer templates** — configurable `PageTemplate` with left/center/right zones and `{page}`/`{pages}`/`{date}`/`{title}` placeholders\n- **Watermarks** — text and image overlays with configurable opacity, rotation, and position (background/foreground)\n- **Table of contents** — auto-generated TOC with internal /GoTo links, dot leaders, and page numbers\n- **FlateDecode compression** — zlib stream compression (50–90% size reduction), zero-dependency, platform-native\n- **Web Worker support** — off-main-thread generation for large datasets\n- **Tree-shakeable** — ESM + CJS dual build with TypeScript declarations\n- **Heavily tested** — 3824+ tests across 160 files, fuzz suite, dual-mode visual-regression suite, performance benchmarks; 91.5 % statement coverage measured at the v1.8.0 release, with CI enforcing ≥88% statements / 80% branches / 85% functions / 90% lines (vitest.config.ts)\n- **NPM provenance** — signed builds via GitHub Actions OIDC\n- **On-device generation** — runs in Node, browsers, Workers, Deno, Bun. No SaaS round-trip; documents never leave the calling process unless your application explicitly sends them\n- **No telemetry, no network calls** — verifiable in source. The library never opens a socket, fetches remote fonts, or phones home\n- **AI client integration** — use pdfnative from Claude Desktop, Cursor, Continue, and Zed via [`pdfnative-mcp`](https://github.com/Nizoka/pdfnative-mcp) — **28 production tools** (generate, tables, barcodes, forms, sign with the full PAdES ladder, verify, validate, attachments, extraction, inspect, metadata, layout preview, plus page-tree `merge_pdfs` / `split_pdf` / `extract_pages`)\n- **Command-line interface** — render, sign, verify, inspect, and batch-render PDFs from the shell with [`pdfnative-cli`](https://github.com/Nizoka/pdfnative-cli) — zero-config, scriptable, agent-native (`--json`/`E_*`/`--dry-run`), ideal for CI/CD pipelines\n- **React renderer** — author PDFs as declarative JSX with [`pdfnative-react`](https://github.com/Nizoka/pdfnative-react): `<Document>`/`<Table>`/`<Barcode>` components, `usePdf`/`PDFViewer` client hooks, on-device rendering with no DOM or headless browser\n\n## Installation\n\n```bash\nnpm install pdfnative\n```\n\n**Requirements:** Node.js >= 22 | Modern browsers | Deno | Bun\n\n## Documentation\n\n- 🌐 **Website:** [pdfnative.dev](https://pdfnative.dev) — landing page, live in-browser demo with 12 examples, comparisons, benchmarks.\n- 📘 **Quick Start:** [docs/guides/quickstart.md](docs/guides/quickstart.md) — Node.js, browser, Web Worker, streaming.\n- 🏛️ **Architecture:** [docs/guides/architecture.md](docs/guides/architecture.md) — modules, builders, generation pipeline.\n- ♿ **Accessibility:** [docs/guides/accessibility.md](docs/guides/accessibility.md) — tagged PDF, PDF/UA, PDF/A.\n- ✍️ **Typography:** [docs/guides/typography.md](docs/guides/typography.md) — page breaking under widow and orphan rules, justification, hyphenation, spacing rules, kerning, OpenType features (v1.8.0).\n- 🖨️ **Print production:** [docs/guides/print.md](docs/guides/print.md) — page boxes, printer's marks and colour bars, CMYK colours and OutputIntents, PDF/X-4 and `validatePdfX()`.\n- ❓ **FAQ:** [docs/guides/faq.md](docs/guides/faq.md) — fonts, encryption, signatures, comparisons.\n- 🤖 **Agentic workflows:** [docs/guides/agentic-workflows.md](docs/guides/agentic-workflows.md) — extend the engine at runtime (register fonts without a release) and embed agent-generated images.\n- 🛠️ **Troubleshooting:** [docs/guides/troubleshooting.md](docs/guides/troubleshooting.md) — common pitfalls.\n- 🎮 **Playgrounds:** twelve interactive demos at [docs/playgrounds/](docs/playgrounds/) — [typography](docs/playgrounds/typography.html) (each typographic option against the default), [print](docs/playgrounds/print.html) (bleed, CMYK, PDF/X-4 and its validation report), [extreme-scripts](docs/playgrounds/extreme-scripts.html) (live BiDi/Indic stress tests), [all-scripts](docs/playgrounds/all-scripts.html) (every Unicode script), [scale](docs/playgrounds/scale.html) (1k-100k pages, Web Worker + true streaming), [authoring-plus](docs/playgrounds/authoring-plus.html) (SVG text, layout overlay, annotations), [toolkit](docs/playgrounds/toolkit.html) (bookmarks, page labels, viewer prefs, merge/split/extract, and v1.6.0 form fill/flatten), [charts](docs/playgrounds/charts.html) (native vector charts — all 9 v1.7.0 types), [inspect](docs/playgrounds/inspect.html) (drop any PDF and read a full report, entirely client-side), plus [cli](docs/playgrounds/cli.html), [mcp](docs/playgrounds/mcp.html) and [react](docs/playgrounds/react.html) ecosystem explorers.\n- 🧪 **Sample PDFs:** [scripts/generators/](scripts/generators/) — 292 sample PDFs across 38 categories (49 generators) (see [Sample PDFs](#sample-pdfs) below).\n- 🎓 **Learn:** [docs/learn/](docs/learn/) — an eight-step guided path from installing the package to generating 100,000 pages, live at [pdfnative.dev/learn/](https://pdfnative.dev/learn/).\n- 🤖 **Machine-readable:** [llms.txt](llms.txt) (doc index for LLMs), [AGENTS.md](AGENTS.md) (agent guidance), and [docs/assets/ecosystem.json](docs/assets/ecosystem.json) — the canonical manifest of ecosystem versions and counts, enforced by `npm run verify:docs`.\n\n## Why pdfnative?\n\npdfnative was designed for teams that need **ISO-compliant, production-grade PDF generation** with zero supply-chain risk. Here is how it compares to other popular JavaScript PDF libraries:\n\n| Feature | pdfnative | jsPDF | pdfkit | pdf-lib | pdfmake |\n|---------|:---------:|:-----:|:------:|:-------:|:------:|\n| Runtime dependencies | **0** | 3 | 6 | 4 | 3 |\n| TypeScript declarations | Built-in | Built-in | @types/* | Built-in | @types/* |\n| PDF/A (ISO 19005) | 1b, 2b, 2u, 3b | — | — | — | — |\n| Tagged PDF / PDF/UA | ✅ | — | ✅ | — | — |\n| Encryption (read + write) | AES-128/256 + RC4 read | write (RC4) | write | — | write |\n| Complex text shaping (GSUB/GPOS) | ✅ Thai, Arabic, Devanagari, Bengali, Tamil, Telugu, Sinhala, Khmer, Myanmar, Tibetan, Lao, USE, Latin marks | — | Via fontkit | Via @pdf-lib/fontkit | Via pdfkit |\n| BiDi (RTL) layout | ✅ | — | — | — | — |\n| Modify existing PDFs | ✅ (incremental) | — | — | ✅ | — |\n| Forms (create + fill + flatten) | ✅ all three | create | create | create + fill | — |\n| Native charts (vector) | ✅ 9 kinds incl. stacked/area/scatter | — | — | — | — |\n| Digital signatures | ✅ (RSA + ECDSA, PAdES) | — | — | — | — |\n| LTV / timestamps (PAdES B-LTA) | ✅ RFC 3161 + /DSS | — | — | — | — |\n| Print production (bleed/trim boxes, marks) | ✅ | — | — | — | — |\n| Barcode / QR code (native) | ✅ 5 formats | — | — | — | QR |\n| SVG path rendering | ✅ | Plugin | ✅ | Paths only | ✅ |\n| Streaming output | ✅ | — | ✅ | — | ✅ |\n| PDF parser | ✅ | — | — | ✅ | — |\n| Tree-shakeable (ESM) | ✅ | — | — | ✅ | — |\n| NPM provenance (SLSA) | ✅ | — | — | — | ✅ |\n\n> **Data sources:** npm registry metadata and official README/documentation for each library, compared on **2026-07-28** (pdfkit 0.19.1, jsPDF 4.2.1, pdfmake 0.3.11, pdf-lib 1.17.1 — see [docs/data/comparison-2026-07-28.json](docs/data/comparison-2026-07-28.json)). Dependency counts reflect direct `dependencies` listed in each package's published manifest. \"—\" means the feature is not supported or not documented. Feature claims about third-party libraries are based on their public documentation and may not reflect the latest version — please verify against current releases. Sample PDFs validate with veraPDF (PDF/A) and Adobe Acrobat.\n\n**When to choose another library:** You need advanced vector graphics (complex gradients, arbitrary transforms), rich interactive form scripting (JavaScript actions), or mature ecosystem integrations with existing toolchains.\n\n**When to choose pdfnative:** You need zero-dependency PDF generation with ISO archival compliance (PDF/A), accessibility (tagged PDF), AES encryption, digital signatures, multi-script Unicode support — particularly Arabic/Hebrew BiDi and Thai GSUB/GPOS shaping — form fields, barcode generation, SVG rendering, or the ability to parse and incrementally modify existing PDFs.\n\n## Quick Start\n\n```typescript\nimport { buildPDFBytes, downloadBlob } from 'pdfnative';\n\nconst pdf = buildPDFBytes({\n  title: 'Monthly Report',\n  infoItems: [\n    { label: 'Period', value: 'January 2026' },\n    { label: 'Account', value: 'Main Account' },\n  ],\n  balanceText: 'Balance: $1,234.56',\n  countText: '42 transactions',\n  headers: ['Date', 'Description', 'Category', 'Amount', 'Status'],\n  rows: [\n    { cells: ['01/15', 'Grocery Store', 'Food', '-$45.00', ''], type: 'debit', pointed: false },\n    { cells: ['01/16', 'Salary', 'Income', '+$3,000.00', 'X'], type: 'credit', pointed: true },\n  ],\n  footerText: 'Generated by MyApp',\n});\n\n// Browser: trigger download\ndownloadBlob(pdf, 'report.pdf');\n\n// Node.js: write to file\nimport { writeFileSync } from 'fs';\nwriteFileSync('report.pdf', pdf);\n```\n\n### Document Builder\n\nBuild free-form documents with headings, paragraphs, lists, tables, images, barcodes, and more:\n\n```typescript\nimport { buildDocumentPDFBytes } from 'pdfnative';\n\nconst pdf = buildDocumentPDFBytes({\n  title: 'Project Report',\n  blocks: [\n    { type: 'toc' },\n    { type: 'heading', text: 'Executive Summary', level: 1 },\n    { type: 'paragraph', text: 'This quarter saw strong growth across all divisions...' },\n    { type: 'image', data: jpegBytes, width: 400, align: 'center', alt: 'Revenue chart' },\n    { type: 'list', items: ['Revenue up 15%', 'Costs down 8%', 'Net profit +23%'], style: 'bullet' },\n    { type: 'table', headers: ['Q1', 'Q2', 'Q3', 'Q4'], rows: [\n      { cells: ['$1.2M', '$1.4M', '$1.6M', '$1.8M'], type: 'credit', pointed: false },\n    ]},\n    { type: 'spacer', height: 20 },\n    { type: 'heading', text: 'Next Steps', level: 2 },\n    { type: 'paragraph', text: 'Focus areas for next quarter include...', align: 'left' },\n    { type: 'link', text: 'View full report online', url: 'https://example.com/report' },\n    { type: 'barcode', format: 'qr', data: 'https://example.com/report', align: 'center' },\n  ],\n  footerText: 'Confidential',\n}, {\n  headerTemplate: { center: 'Project Report', right: '{date}' },\n  footerTemplate: { left: 'Confidential', right: 'Page {page} of {pages}' },\n});\n```\n\n## Unicode Font Support\n\nFor non-Latin scripts, register font data loaders (lazy-loaded on demand):\n\n```typescript\nimport { registerFonts, loadFontData, buildPDFBytes } from 'pdfnative';\n\nregisterFonts({\n  th: () => import('pdfnative/fonts/noto-thai-data.js'),\n  ja: () => import('pdfnative/fonts/noto-jp-data.js'),\n  zh: () => import('pdfnative/fonts/noto-sc-data.js'),\n  ko: () => import('pdfnative/fonts/noto-kr-data.js'),\n  el: () => import('pdfnative/fonts/noto-greek-data.js'),\n  hi: () => import('pdfnative/fonts/noto-devanagari-data.js'),\n  tr: () => import('pdfnative/fonts/noto-turkish-data.js'),\n  vi: () => import('pdfnative/fonts/noto-vietnamese-data.js'),\n  pl: () => import('pdfnative/fonts/noto-polish-data.js'),\n  ar: () => import('pdfnative/fonts/noto-arabic-data.js'),\n  he: () => import('pdfnative/fonts/noto-hebrew-data.js'),\n  ru: () => import('pdfnative/fonts/noto-cyrillic-data.js'),\n  ka: () => import('pdfnative/fonts/noto-georgian-data.js'),\n  hy: () => import('pdfnative/fonts/noto-armenian-data.js'),\n  bn: () => import('pdfnative/fonts/noto-bengali-data.js'),\n  ta: () => import('pdfnative/fonts/noto-tamil-data.js'),\n  te: () => import('pdfnative/fonts/noto-telugu-data.js'), // v1.3.0\n  si: () => import('pdfnative/fonts/noto-sinhala-data.js'), // v1.3.0\n  bo: () => import('pdfnative/fonts/noto-tibetan-data.js'), // v1.3.0\n  km: () => import('pdfnative/fonts/noto-khmer-data.js'), // v1.3.0\n  my: () => import('pdfnative/fonts/noto-myanmar-data.js'), // v1.3.0\n  am: () => import('pdfnative/fonts/noto-ethiopic-data.js'), // v1.3.0\n  // v1.1.0+ — optional Latin fallback for PDF/A documents with curly quotes,\n  // em-dash, ellipsis, etc. (activates automatically when needed). Since\n  // v1.8.0 it also carries Hausa ɓ ɗ ƙ ƴ, Yoruba and Igbo tone marks (ẹ́ ọ̀ ị́)\n  // and Swahili — no separate module or lang key for those languages:\n  latin: () => import('pdfnative/fonts/noto-sans-data.js'),\n  // v1.1.0+ — optional monochrome emoji:\n  emoji: () => import('pdfnative/fonts/noto-emoji-data.js'),\n});\n\nconst thaiFont = await loadFontData('th');\n\nconst pdf = buildPDFBytes({\n  title: 'รายงานประจำเดือน',\n  // ... other params\n  fontEntries: thaiFont ? [{ fontData: thaiFont, fontRef: '/F3', lang: 'th' }] : [],\n});\n```\n\n### Supported Languages\n\n| Language | Code | Font | Script |\n|----------|------|------|--------|\n| Thai | `th` | Noto Sans Thai | GSUB + GPOS shaping |\n| Japanese | `ja` | Noto Sans JP | CJK ideographs + kana |\n| Chinese (Simplified) | `zh` | Noto Sans SC | CJK ideographs |\n| Korean | `ko` | Noto Sans KR | Hangul syllables |\n| Greek | `el` | Noto Sans Greek | Greek alphabet |\n| Hindi (Devanagari) | `hi` | Noto Sans Devanagari | Indic OpenType engine — conjuncts, reph, half forms, matras (v1.8.0) |\n| Turkish | `tr` | Noto Sans Turkish | Latin extended (İ/ı) |\n| Vietnamese | `vi` | Noto Sans Vietnamese | Latin + combining marks |\n| Polish | `pl` | Noto Sans Polish | Latin extended (Ł/ł) |\n| Arabic | `ar` | Noto Sans Arabic | GSUB positional shaping |\n| Hebrew | `he` | Noto Sans Hebrew | Right-to-left script |\n| Russian (Cyrillic) | `ru` | Noto Sans | Cyrillic alphabet |\n| Georgian | `ka` | Noto Sans Georgian | Mkhedruli script |\n| Armenian | `hy` | Noto Sans Armenian | Armenian alphabet |\n| Bengali | `bn` | Noto Sans Bengali | Indic OpenType engine — conjuncts, reph, ya-phala, split vowels (v1.8.0) |\n| Tamil | `ta` | Noto Sans Tamil | Indic OpenType engine — ligatures, pre-base and split vowels (v1.8.0) |\n| Telugu | `te` | Noto Sans Telugu | Indic OpenType engine — subjoined consonants, vattu (v1.3.0; engine v1.8.0) |\n| Sinhala | `si` | Noto Sans Sinhala | Indic OpenType engine — kombuva, rakaransaya, two-part vowels (v1.3.0; engine v1.8.0) |\n| Hausa | `latin` | Noto Sans VF | Latin with ɓ ɗ ƙ ƴ ʼ — no dedicated module (v1.8.0) |\n| Yoruba | `latin` | Noto Sans VF | Latin with ẹ ọ ṣ and combining tone marks, composed by the Latin-marks shaper (v1.8.0) |\n| Igbo | `latin` | Noto Sans VF | Latin with ị ọ ụ ṅ and combining tone marks (v1.8.0) |\n| Swahili | `latin` | Noto Sans VF | Plain Latin — renders with the base-14 fonts too (v1.8.0) |\n| Latin (PDF/A) | `latin` | Noto Sans VF | WinAnsi-extended Latin (curly quotes, em-dash, ellipsis…) |\n| Emoji | `emoji` | Noto Emoji | Monochrome emoji (BMP/SMP, Fitzpatrick, ZWJ, VS-15/16) |\n\n## Multi-Font (Mixed Scripts)\n\nGenerate PDFs with multiple scripts in the same document:\n\n```typescript\nconst fonts = await Promise.all([\n  loadFontData('th'),\n  loadFontData('ja'),\n  loadFontData('zh'),\n]);\n\nconst fontEntries = fonts\n  .filter(Boolean)\n  .map((fd, i) => ({ fontData: fd!, fontRef: `/F${3 + i}`, lang: ['th', 'ja', 'zh'][i] }));\n\nconst pdf = buildPDFBytes({\n  title: 'Multi-Language Report',\n  headers: ['Date', 'Description', 'Category', 'Amount', 'Status'],\n  rows: [\n    { cells: ['01/01', 'English text', 'Test', '+100', 'OK'], type: 'credit', pointed: false },\n    { cells: ['01/02', 'ข้อความไทย', 'ทดสอบ', '-50', ''], type: 'debit', pointed: false },\n    { cells: ['01/03', '日本語テキスト', 'テスト', '+200', '済'], type: 'credit', pointed: true },\n  ],\n  // ... other params\n  fontEntries,\n});\n```\n\n## Web Worker (Large Datasets)\n\n```typescript\nimport { createPDF } from 'pdfnative';\n\nconst pdf = await createPDF(params, {\n  workerUrl: new URL('pdfnative/worker', import.meta.url),\n  threshold: 500, // use Worker above 500 rows\n  timeout: 30000, // Worker timeout in ms (default: 60000)\n  onProgress: (percent) => console.log(`${percent}%`),\n});\n```\n\nFor lower-level control, use `generatePDFInWorker` directly with `WorkerGenerationOptions`:\n\n```typescript\nimport { generatePDFInWorker } from 'pdfnative';\nimport type { WorkerGenerationOptions } from 'pdfnative';\n\nconst options: WorkerGenerationOptions = {\n  timeout: 15000,\n  onProgress: (percent) => console.log(`${percent}%`),\n};\n\nconst pdf = await generatePDFInWorker(workerUrl, params, options);\n```\n\n## Layout Customization\n\n```typescript\nconst pdf = buildPDFBytes(params, {\n  pageWidth: 595.28,   // A4 (default)\n  pageHeight: 841.89,  // A4 (default)\n  margins: { t: 45, r: 36, b: 35, l: 36 },\n  colors: {\n    title: '#2563EB',           // hex — primary format\n    credit: [15, 145, 121],     // RGB tuple [0–255]\n    debit: '0.863 0.149 0.149', // PDF operator string [0.0–1.0]\n    // ... see PdfColors type\n  },\n  columns: [\n    { f: 0.15, a: 'l', mx: 12, mxH: 12 },\n    { f: 0.35, a: 'l', mx: 50, mxH: 50 },\n    { f: 0.20, a: 'r', mx: 20, mxH: 20 },\n    { f: 0.30, a: 'r', mx: 30, mxH: 30 },\n  ],\n});\n```\n\n### Color Formats\n\nAll color values accept five formats — three RGB, two CMYK (v1.8.0):\n\n| Format | Example | Description |\n|--------|---------|-------------|\n| Hex string | `'#2563EB'` or `'#26E'` | Primary format — `#RRGGBB` or `#RGB` |\n| RGB tuple | `[37, 99, 235]` | Array with values 0–255 |\n| PDF operator | `'0.145 0.388 0.922'` | Raw PDF RGB string (0.0–1.0) |\n| CMYK tuple | `[100, 60, 0, 10]` | Four-element array, ink coverage in percent 0–100 (v1.8.0) |\n| CMYK operand | `'1 0.6 0 0.1'` | Raw PDF CMYK string (0.0–1.0) (v1.8.0) |\n\n```typescript\nimport { parseColor } from 'pdfnative';\n\nparseColor('#2563EB');           // '0.145 0.388 0.922'\nparseColor([37, 99, 235]);       // '0.145 0.388 0.922'\nparseColor('0.145 0.388 0.922'); // '0.145 0.388 0.922'\nparseColor([0, 0, 0, 100]);      // '0 0 0 1'  (CMYK, v1.8.0)\n```\n\nThe component count decides the colour space: three components write `rg` / `RG`, four write `k` / `K`. All inputs are validated and normalized before interpolation into PDF content streams, preventing operator injection. Under a PDF/A or PDF/X claim whose OutputIntent is not CMYK, a CMYK colour raises `PDFA_DEVICE_CMYK_CONTENT` / `PDFX_DEVICE_CMYK` — see the [print guide](docs/guides/print.md#cmyk-colours-v180).\n\n### Font Sizes\n\nCustomize font sizes for each zone (title, info bar, table header, table cells, footer):\n\n```typescript\nconst pdf = buildPDFBytes(params, {\n  fontSizes: {\n    title: 20,   // Title text (default: 16)\n    info: 10,    // Info bar items (default: 9)\n    th: 9,       // Table header cells (default: 8)\n    td: 8,       // Table body cells (default: 7.5)\n    ft: 8,       // Footer text (default: 7)\n  },\n});\n```\n\n| Zone | Key | Default | Description |\n|------|-----|---------|-------------|\n| Title | `title` | 16 | PDF title text |\n| Info bar | `info` | 9 | Key-value pairs below title |\n| Table header | `th` | 8 | Column header row |\n| Table cells | `td` | 7.5 | Data row cells |\n| Footer | `ft` | 7 | Page footer text |\n\nAll values are in PDF points (1pt = 1/72 inch). Partial overrides are supported — unspecified keys use defaults.\n\n## Building Custom Font Data\n\n### Obtaining TTF Files\n\nFor Noto Sans fonts, download the raw `.ttf` file directly from the [noto-fonts GitHub repository](https://github.com/notofonts):\n\n1. Navigate to the font's GitHub repository (e.g., `github.com/notofonts/bengali`)\n2. Find the TTF file under `fonts/NotoSansBengali/unhinted/ttf/` (or similar path)\n3. Click the file, then click **\"Download raw file\"** (or use the raw URL)\n4. Save it to `fonts/ttf/`\n\nNo zip download or extraction needed — each TTF is a standalone file you can download directly.\n\n### Building the Data Module\n\nConvert any TTF font into an importable data module:\n\n```bash\nnpx pdfnative-build-font fonts/ttf/MyFont.ttf fonts/my-font-data.js\n```\n\nThe tool extracts cmap, widths, metrics, GSUB, GPOS, and embeds the raw TTF as base64.\n\n### Full colour-emoji coverage (`pdfnative-build-emoji-font`)\n\nThe bundled colour-emoji module (`pdfnative/fonts/noto-color-emoji-data.js`)\nships a lean curated subset to keep the package small. When you need glyphs\nbeyond that subset — up to the **full ~3,600-glyph** Noto Color Emoji set — a\nsecond bundled binary generates a custom data module on demand, so even\n**pdfnative-only** users get full coverage without the package ever carrying the\n~32 MB source font:\n\n```bash\n# Download the pinned Noto Color Emoji (SHA-256 verified) and emit every glyph\nnpx pdfnative-build-emoji-font --download --all --out my-color-emoji-data.js\n\n# …or build from a local TTF, selecting only the glyphs you need\nnpx pdfnative-build-emoji-font --ttf NotoColorEmoji-Regular.ttf \\\n  --codepoints \"1F600,1F680,2764\" --out my-color-emoji-data.js\n```\n\nSelect glyphs with `--all`, `--preset`, `--codepoints`, or `--ranges`, then\nregister the generated module under lang `'emoji'`. See the\n[Colour-emoji CLI guide](docs/guides/colour-emoji-cli.md).\n\n## Agentic workflows\n\npdfnative is shaped so an AI agent can do more than *call* the engine — it can\n**extend** it at runtime and **feed it content it generated itself**, without\nwaiting for a library release. Both patterns use already-shipped, public APIs.\n\n**1. Extend the engine at runtime — no release required.** The font registry is a\nruntime API. An agent can compile a TTF/OTF in memory and register it on the spot,\nso a document renders the moment it needs a new script, symbol set, or brand font:\n\n```js\nimport { registerFont, loadFontData, buildDocumentPDFBytes } from 'pdfnative';\nregisterFont('th', () => import('pdfnative/fonts/noto-thai-data.js'));\nconst th = await loadFontData('th');\nif (!th) throw new Error('Thai font failed to load');\nconst bytes = buildDocumentPDFBytes({\n  title: 'Thai demo',\n  blocks: [{ type: 'paragraph', text: 'สวัสดีชาวโลก' }],\n  fontEntries: [{ fontData: th, fontRef: '/F3', lang: 'th' }], // /F1 and /F2 are reserved\n});\n```\n\nThis is how the bundled **Noto Sans Math** font existed as a *working runtime\npattern* before it shipped as a default in v1.5.0. Use `compileFontData()` to emit\na reusable `*-data.js` module (byte-identical to `npx pdfnative-build-font`).\n\n**2. Embed agent-generated images.** Image-generating agents (e.g. Antigravity,\nChatGPT, and other multimodal assistants) can pipe a generated PNG/JPEG straight\ninto a document — via the `image` block (library / CLI) or the `embed_image` MCP\ntool. pdfnative parses and embeds it natively (no rasterization) and validates it\nat the boundary.\n\nRuntime extensibility is **not** autonomous modification of the published package:\nthe agent extends its own in-process instance; the repository is only ever changed\nby a human under the [AI-governance / human-in-the-loop contract](docs/guides/ai-governance.md).\nSee the [Agentic workflows guide](docs/guides/agentic-workflows.md) for the full walkthrough.\n\n## Visual PDF Inspection\n\n<a id=\"sample-pdfs\"></a>\n\nGenerate sample PDFs for all supported languages to visually verify output:\n\n```bash\nnpm run test:generate\n```\n\nThis creates **292 sample PDFs** in `test-output/` (git-ignored), organized in 38 categories produced by 49 generators (including `charts/` native vector charts, `bidi/` Persian and mirroring showcases, `signatures/` LTV pipelines, and `print/` prepress output added in v1.7.0).\nSee [scripts/README.md](scripts/README.md) for the modular generator architecture.\n\n### Financial Statements (per language)\n\n| File | Content |\n|------|---------|\n| `sample-latin.pdf` | English / Helvetica |\n| `sample-th.pdf` | Thai with GSUB + GPOS shaping |\n| `sample-ja.pdf` | Japanese (CJK ideographs) |\n| `sample-zh.pdf` | Chinese Simplified |\n| `sample-ko.pdf` | Korean (Hangul) |\n| `sample-el.pdf` | Greek |\n| `sample-hi.pdf` | Hindi (Devanagari) |\n| `sample-tr.pdf` | Turkish (İ/ı special casing) |\n| `sample-vi.pdf` | Vietnamese (combining marks) |\n| `sample-pl.pdf` | Polish (Ł/ł) |\n| `sample-ar.pdf` | Arabic (RTL, positional shaping) |\n| `sample-he.pdf` | Hebrew (RTL) |\n| `sample-ru.pdf` | Russian (Cyrillic) |\n| `sample-ka.pdf` | Georgian (Mkhedruli) |\n| `sample-hy.pdf` | Armenian |\n| `sample-bn.pdf` | Bengali (GSUB conjuncts + GPOS marks) |\n| `sample-ta.pdf` | Tamil (GSUB + split vowel decomposition) |\n| `sample-multi.pdf` | Mixed: all 27 scripts in one PDF |\n| `sample-pagination.pdf` | 200 rows, multi-page layout |\n\n### Diverse Use Cases (non-financial)\n\n| File | Content |\n|------|---------|\n| `diverse-student-transcript.pdf` | University academic transcript (Latin) |\n| `diverse-recipe-th.pdf` | Thai recipe — Tom Yum Goong ingredients (Thai) |\n| `diverse-server-ja.pdf` | Server monitoring dashboard (Japanese) |\n| `diverse-inventory-zh.pdf` | Warehouse product inventory (Chinese) |\n| `diverse-sports-ko.pdf` | K-League football standings (Korean) |\n| `diverse-library-el.pdf` | Classical Greek library catalog (Greek) |\n| `diverse-medical-hi.pdf` | Blood test lab results (Hindi) |\n| `diverse-menu-tr.pdf` | Turkish restaurant dinner menu (Turkish) |\n| `diverse-weather-vi.pdf` | Weekly weather forecast — Hanoi (Vietnamese) |\n| `diverse-train-pl.pdf` | Train schedule — Warsaw (Polish) |\n| `diverse-marketplace-ar.pdf` | Gold marketplace catalog — Dubai (Arabic) |\n| `diverse-museum-he.pdf` | Museum exhibition catalog — Jerusalem (Hebrew) |\n\n### Alphabet / Character Coverage\n\n| File | Content |\n|------|---------|\n| `alphabet-thai.pdf` | 44 consonants, vowels, tone marks, digits |\n| `alphabet-japanese.pdf` | Hiragana, Katakana, Kanji numerals & common |\n| `alphabet-chinese.pdf` | 121 characters by category (HSK frequency) |\n| `alphabet-korean.pdf` | Hangul jamo, syllables, complex clusters |\n| `alphabet-greek.pdf` | Full uppercase/lowercase, accented, archaic |\n| `alphabet-devanagari.pdf` | Vowels, consonants, matras, conjuncts, digits |\n| `alphabet-turkish.pdf` | 29 letters, İ/ı dotted-I distinction test |\n| `alphabet-vietnamese.pdf` | 7 base vowels × 6 tones, all diacritics |\n| `alphabet-polish.pdf` | 32 letters, digraphs, pangram |\n| `alphabet-arabic.pdf` | 28 letters, harakat, numerals, ligatures |\n| `alphabet-hebrew.pdf` | 22 letters, final forms, vowel points |\n| `alphabet-cyrillic.pdf` | 33 Russian letters, Ukrainian/Serbian extended |\n| `alphabet-georgian.pdf` | 33 Mkhedruli letters, Asomtavruli |\n| `alphabet-armenian.pdf` | 38 letters, ligatures |\n| `alphabet-bengali.pdf` | Vowels, consonants, conjuncts, digits |\n| `alphabet-tamil.pdf` | Vowels, consonants, compound characters, digits |\n| `alphabet-hausa.pdf` | Boko alphabet, hooked letters ɓ ɗ ƙ ƴ, digraphs, ʼy (v1.8.0) |\n| `alphabet-yoruba.pdf` | ẹ ọ ṣ, tone marks on ẹ / ọ, syllabic ń ǹ (v1.8.0) |\n| `alphabet-igbo.pdf` | ị ọ ụ ṅ, tone marks, digraphs (v1.8.0) |\n| `alphabet-swahili.pdf` | Plain Latin — proof that no module is required (v1.8.0) |\n\n### PDF/A Conformance Variants\n\n| File | Content |\n|------|---------|\n| `tagged-pdfa2b-default.pdf` | PDF/A-2b (tagged=true, default) |\n| `tagged-pdfa2b-explicit.pdf` | PDF/A-2b (tagged='pdfa2b', explicit) |\n| `tagged-pdfa1b.pdf` | PDF/A-1b (tagged='pdfa1b', legacy) |\n| `tagged-pdfa2u.pdf` | PDF/A-2u (tagged='pdfa2u', Unicode) |\n| `tagged-pdfa3b.pdf` | PDF/A-3b (tagged='pdfa3b', embedded file attachments) |\n\n### Encrypted PDFs\n\n| File | Content |\n|------|---------|\n| `encrypted-aes128.pdf` | AES-128 (V4/R4) owner-only |\n| `encrypted-aes256.pdf` | AES-256 (V5/R6) owner-only |\n| `encrypted-aes128-user.pdf` | AES-128 with user+owner passwords |\n| `encrypted-aes256-user.pdf` | AES-256 with user+owner passwords |\n| `encrypted-readonly.pdf` | AES-128 read-only (no copy/modify) |\n| `encrypted-noprint.pdf` | AES-128 fully restricted |\n\n**Sample passwords** (for testing only — all documented in `scripts/generate-samples.ts`):\n\n| File | Owner Password | User Password |\n|------|---------------|---------------|\n| `encrypted-aes128.pdf` | `owner123` | _(none — opens freely)_ |\n| `encrypted-aes256.pdf` | `owner256` | _(none — opens freely)_ |\n| `encrypted-aes128-user.pdf` | `owner123` | `user456` |\n| `encrypted-aes256-user.pdf` | `owner256` | `user789` |\n| `encrypted-readonly.pdf` | `owner-ro` | _(none — opens freely)_ |\n| `encrypted-noprint.pdf` | `owner-np` | _(none — opens freely)_ |\n| `doc-encrypted-aes128.pdf` | `docowner` | `docuser` |\n| `doc-encrypted-aes256.pdf` | `strongowner256` | _(none — opens freely)_ |\n\n### Document Builder Samples\n\n| File | Content |\n|------|---------|\n| `doc-headings-paragraphs.pdf` | H1/H2/H3 + paragraphs with text wrapping |\n| `doc-lists.pdf` | Bullet + numbered lists |\n| `doc-links.pdf` | External hyperlink annotations |\n| `doc-table.pdf` | Embedded table in document |\n| `doc-spacer-pagebreak.pdf` | Spacers + forced page breaks (3 pages) |\n| `doc-encrypted-aes128.pdf` | Document builder + AES-128 encryption |\n| `doc-encrypted-aes256.pdf` | Document builder + AES-256 encryption |\n| `doc-image.pdf` | Image embedding (JPEG, centered) |\n| `doc-custom-colors.pdf` | Color formats (hex, tuple, PDF operator) |\n| `doc-japanese.pdf` | Japanese Unicode document (headings, lists, table) |\n| `doc-arabic.pdf` | Arabic one-page conformance document — stacked harakat, lam-alef, Persian/Urdu letters in mixed BiDi, Arabic-Indic digits (rewritten v1.8.0) |\n| `doc-hebrew.pdf` | Hebrew one-page conformance document — niqqud, dagesh, shin/sin dots, mixed LTR (rewritten v1.8.0) |\n| `doc-thai.pdf` | Thai one-page conformance document — tone marks over vowels, sara am, stacked marks (rewritten v1.8.0) |\n| `doc-bengali.pdf` | Bengali one-page conformance document — reph, ya-phala, ra-phala, ক্ষ জ্ঞ, split vowels ো ৌ, chandrabindu (rewritten v1.8.0) |\n| `doc-tamil.pdf` | Tamil one-page conformance document — ி after its consonant, ெ ே ை before, split ொ ோ ௌ, pulli, ரூ ஸ்ரீ ligatures (rewritten v1.8.0) |\n| `doc-devanagari.pdf` | Hindi one-page conformance document — ि reordering, reph, rakar, half forms, क्ष ज्ञ त्र, nukta, anusvara, digits (rewritten v1.8.0) |\n| `doc-telugu.pdf` | Telugu one-page conformance document — subjoined consonants, vattu, ై, anusvara, digits (rewritten v1.8.0) |\n| `doc-sinhala.pdf` | Sinhala one-page conformance document — kombuva, rakaransaya ශ්‍රී, yansaya, two-part vowels, hal kirima (rewritten v1.8.0) |\n| `doc-tibetan.pdf` | Tibetan one-page conformance document — consonant stacks, vowel signs, tsheg and shad (rewritten v1.8.0) |\n| `doc-khmer.pdf` | Khmer one-page conformance document — coeng subscripts, pre-base vowels, series (rewritten v1.8.0) |\n| `doc-myanmar.pdf` | Myanmar one-page conformance document — kinzi, medials, stacked consonants (rewritten v1.8.0) |\n| `doc-amharic.pdf` | Amharic one-page conformance document — syllabary orders, ። ፣ punctuation, Ethiopic digits (rewritten v1.8.0) |\n| `doc-hausa.pdf` | Hausa one-page conformance document — ɓ ɗ ƙ ƴ, capitals Ɓ Ɗ Ƙ Ƴ, ʼy, digraphs, on the `latin` module (v1.8.0) |\n| `doc-yoruba.pdf` | Yoruba one-page conformance document — ẹ ọ ṣ, acute and grave tone marks on ẹ / ọ, syllabic ń ǹ (v1.8.0) |\n| `doc-igbo.pdf` | Igbo one-page conformance document — ị ọ ụ ṅ with tone marks, digraphs (v1.8.0) |\n| `doc-swahili.pdf` | Swahili one-page conformance document — plain Latin, numbers and dates (v1.8.0) |\n| `doc-lao.pdf` | Lao one-page conformance document — leading vowels, tone marks over vowels, tall and descender variants, sara am, ຫຼ ໜ ໝ ligatures (v1.8.0) |\n| `doc-taitham.pdf` | Northern Thai (Tai Tham) one-page conformance document — sakot stacks, pre-base vowels, medials, tone marks, Hora digits (v1.8.0) |\n| `doc-newtailue.pdf` | Tai Lue (New Tai Lue) one-page conformance document — spacing vowels before and after, combining finals, tone letters (v1.8.0) |\n| `doc-taile.pdf` | Tai Nüa (Tai Le) one-page conformance document — spacing vowels, tone letters, finals (v1.8.0) |\n| `doc-cham.pdf` | Cham one-page conformance document — pre-base vowels, medials, finals, Cham digits (v1.8.0) |\n| `doc-korean.pdf` | Korean one-page conformance document — precomposed syllables, complex batchim, compatibility jamo, Hanja, character-level wrapping (v1.8.0) |\n| `doc-greek.pdf` | Greek one-page conformance document — tonos, dialytika, final sigma, polytonic, Greek punctuation (v1.8.0) |\n| `doc-cyrillic.pdf` | Russian one-page conformance document — ё й щ, stress marks (U+0301), Ukrainian and Serbian letters, guillemets (v1.8.0) |\n| `doc-georgian.pdf` | Georgian one-page conformance document — Mkhedruli, Mtavruli, Asomtavruli, Nuskhuri, consonant clusters (v1.8.0) |\n| `doc-armenian.pdf` | Armenian one-page conformance document — both cases, և ligature, Armenian punctuation, dram sign (v1.8.0) |\n| `doc-turkish.pdf` | Turkish one-page conformance document — İ ı, ğ ş ç ö ü, circumflex, capitalisation, lira sign (v1.8.0) |\n| `doc-vietnamese.pdf` | Vietnamese one-page conformance document — six tones, stacked diacritics, ơ ư đ, capitals with tones, dong sign (v1.8.0) |\n| `doc-polish.pdf` | Polish one-page conformance document — ogonek, kreska, ł ż, digraphs, pangram, low-high quotes (v1.8.0) |\n| `doc-chinese-catalog.pdf` | Chinese product catalog (tables, ordering info) |\n| `doc-multi-language.pdf` | Multi-language showcase: all 27 Unicode scripts in one PDF |\n| `doc-invoice.pdf` | Invoice template (line items, totals, payment link) |\n| `doc-report-multipage.pdf` | 3-page technical report (7 sections, 4 tables) |\n| `doc-contract-bilingual.pdf` | Bilingual EN/AR contract (legal sections, signatures) |\n| `doc-showcase-all-blocks.pdf` | All 13 block types in one PDF |\n\n### Compressed PDFs (FlateDecode)\n\n| File | Content |\n|------|---------|\n| `compressed-latin-100rows.pdf` | 100-row Latin table (87% smaller) |\n| `uncompressed-latin-100rows.pdf` | Same 100-row table without compression (baseline) |\n| `compressed-japanese.pdf` | Japanese CIDFont + TTF subset (62% smaller) |\n| `compressed-arabic.pdf` | Arabic RTL + GSUB shaping (compressed) |\n| `compressed-thai.pdf` | Thai GSUB+GPOS shaping (compressed) |\n| `compressed-tagged-pdfa2b.pdf` | FlateDecode + Tagged PDF/A-2b (XMP uncompressed) |\n| `compressed-encrypted-aes128.pdf` | FlateDecode + AES-128 encryption |\n| `doc-compressed.pdf` | Document builder with FlateDecode |\n\n### Stress Test PDFs\n\n| File | Content |\n|------|---------|  \n| `stress-test-10k-rows.pdf` | 10,000-row table (167 pages, 4.3MB) |\n| `doc-extreme-bidi-wrapping.pdf` | Extreme BiDi mixed-script text wrapping |\n| `table-heavy-text-overflow.pdf` | Dense table with heavy text overflow |\n| `media-rich-document.pdf` | Media-rich document with multiple images |\n| `tagged-accessibility-complex.pdf` | Complex tagged PDF/A accessibility tree |\n| `layout-extreme-customization.pdf` | Extreme layout customization (margins, columns, colors) |\n\n### Edge-Case Stress Tests\n\n| File | Content |\n|------|---------|  \n| `doc-unbreakable-text.pdf` | 1000-char words with no spaces (DNA, URL, Base64) |\n| `table-micro-columns.pdf` | Extreme column fractions (f=0.025, mx=1) |\n| `doc-link-annotation-bomb.pdf` | 500 link annotations across 10 pages |\n| `zero-content-empty-table.pdf` | Table with headers but 0 rows |\n| `zero-content-empty-doc.pdf` | Document with no blocks |\n| `zero-content-empty-strings.pdf` | Empty headings, paragraphs, and list items |\n| `doc-heavy-buffer-5mb.pdf` | 5 MB synthetic JPEG embedded (memory stress) |\n\n### Barcode & QR Code Samples\n\n| File | Content |\n|------|---------|\n| `barcode-showcase.pdf` | All 5 formats: Code 128, EAN-13, QR Code, Data Matrix, PDF417 |\n| `barcode-alignment-sizing.pdf` | Alignment (left/center/right) and custom size variations |\n| `barcode-tagged-pdfa.pdf` | Barcodes in tagged PDF/A-2b mode (/Figure structure elements) |\n\n### SVG Path Rendering Samples\n\n| File | Content |\n|------|---------|\n| `svg-basic-shapes.pdf` | Rect, circle, ellipse, line, polyline, polygon |\n| `svg-complex-paths.pdf` | Cubic/quadratic Bézier curves, arcs, combined paths |\n| `svg-tagged-pdfa.pdf` | SVG elements in tagged PDF/A-2b mode |\n\n### Form Field Samples\n\n| File | Content |\n|------|---------|\n| `form-fields.pdf` | All field types: text, multiline, checkbox, radio, dropdown, listbox |\n| `form-contact.pdf` | Contact form with name, email, message, and submit fields |\n\n### Digital Signature Samples\n\n| File | Content |\n|------|---------|\n| `sig-rsa-self-signed.pdf` | RSA PKCS#1 v1.5 self-signed signature |\n| `sig-ecdsa-p256.pdf` | ECDSA P-256 digital signature |\n| `sig-multi-field.pdf` | PDF with multiple signature fields |\n\n### Streaming Output Samples\n\n| File | Content |\n|------|---------|\n| `streaming-document.pdf` | Document streamed via `buildDocumentPDFStream()` |\n| `streaming-table.pdf` | Table streamed via `buildPDFStream()` |\n\n### PDF Parser & Modifier Samples\n\n| File | Content |\n|------|---------|\n| `parser-original.pdf` | Generated → parsed → verified round-trip |\n| `parser-modified.pdf` | Generated → parsed → modified → incremental save |\n| `parser-document.pdf` | Document builder → parser round-trip verification |\n\n### Outline & Page Label Samples (v1.4.0)\n\n| File | Content |\n|------|---------|\n| `outline/outline-explicit.pdf` | Nested bookmarks (`/Outlines`) + roman/decimal page labels |\n| `outline/outline-auto.pdf` | `outline: 'auto'` — bookmarks derived from headings |\n| `outline/page-labels.pdf` | Roman front matter + prefixed appendix page labels |\n\n### PDF Manipulation Samples (v1.4.0)\n\n| File | Content |\n|------|---------|\n| `manipulation/merged.pdf` | `mergePdfs()` — multiple documents combined |\n| `manipulation/split-report.pdf` | `splitPdf()` — first page range |\n| `manipulation/split-invoice.pdf` | `splitPdf()` — second page range |\n| `manipulation/extract-reordered.pdf` | `extractPages()` — selected pages, reordered |\n| `manipulation/streamed.pdf` | `streamToFile()` — document streamed straight to disk |\n\n## API Reference\n\n### Core\n\n| Function | Description |\n|----------|-------------|\n| `buildPDF(params, layout?)` | Build table-centric PDF as binary string |\n| `buildPDFBytes(params, layout?)` | Build table-centric PDF as `Uint8Array` |\n| `buildDocumentPDF(params, layout?)` | Build free-form document PDF as binary string |\n| `buildDocumentPDFBytes(params, layout?)` | Build free-form document PDF as `Uint8Array` |\n| `wrapText(text, maxWidth, fontSize, enc)` | Word-wrap text into lines |\n| `createPDF(params, options?)` | Smart dispatch (Worker or main thread) |\n| `initNodeCompression()` | Initialize native zlib for ESM (call once before `compress: true`) |\n| `downloadBlob(bytes, filename)` | Trigger browser download |\n| `toBytes(str)` | Convert binary string to `Uint8Array` |\n| `slugify(str)` | Sanitize string for filename |\n\n### Image Support\n\n| Function | Description |\n|----------|-------------|\n| `parseImage(bytes)` | Auto-detect and parse JPEG or PNG |\n| `parseJPEG(bytes)` | Parse JPEG image (DCTDecode) |\n| `parsePNG(bytes)` | Parse PNG image (FlateDecode) |\n| `detectImageFormat(bytes)` | Detect JPEG or PNG from magic bytes |\n| `buildImageXObject(img, smaskObj?)` | Build PDF Image XObject dictionary |\n| `buildImageOperators(ref, x, y, w, h)` | Build `q cm Do Q` content stream operators |\n\n### Link Annotations\n\n| Function | Description |\n|----------|-------------|\n| `validateURL(url)` | Validate URL scheme (http/https/mailto only) |\n| `buildLinkAnnotation(annot)` | Build PDF /Link annotation with /URI action |\n| `buildInternalLinkAnnotation(link)` | Build PDF /Link with /GoTo action |\n| `isLinkAnnotation(annot)` | Type guard for LinkAnnotation |\n\n### BiDi & Arabic/Hebrew Shaping\n\n| Function | Description |\n|----------|-------------|\n| `resolveBidiRuns(text)` | Resolve text into BiDi runs with levels |\n| `containsRTL(text)` | Check if text contains RTL characters |\n| `shapeArabicText(str, fontData)` | Arabic GSUB positional shaping |\n| `containsArabic(text)` | Check for Arabic characters |\n| `containsHebrew(text)` | Check for Hebrew characters |\n\n### Barcode & QR Code\n\n| Function | Description |\n|----------|-------------|\n| `renderBarcode(format, data, x, y, opts?)` | Unified barcode renderer (dispatches to format-specific function) |\n| `encodeCode128(data)` | Encode data into Code 128 barcode pattern (ISO 15417) |\n| `renderCode128(data, x, y, w, h)` | Render Code 128 barcode as PDF path operators |\n| `ean13CheckDigit(digits)` | Compute EAN-13 check digit (ISO 15420) |\n| `renderEAN13(data, x, y, w, h)` | Render EAN-13 barcode with guard bars and digits |\n| `generateQR(data, ecLevel?)` | Generate QR Code matrix (ISO 18004) |\n| `renderQR(data, x, y, size, ecLevel?)` | Render QR Code as PDF path operators |\n| `generateDataMatrix(data)` | Generate Data Matrix ECC 200 matrix (ISO 16022) |\n| `renderDataMatrix(data, x, y, size)` | Render Data Matrix as PDF path operators |\n| `encodePDF417(data, ecLevel?)` | Encode data into PDF417 codewords (ISO 15438) |\n| `renderPDF417(data, x, y, w, h, ecLevel?)` | Render PDF417 barcode as PDF path operators |\n\n### SVG Rendering\n\n| Function | Description |\n|----------|-------------|\n| `parseSvgPath(d)` | Parse SVG path `d` attribute into segments |\n| `renderSvg(segments, options?)` | Render SVG segments (paths + `<text>`) as PDF operators |\n\n### Markup Annotations\n\n| Function | Description |\n|----------|-------------|\n| `buildAnnotation(annot, objNum)` | Build a full markup annotation indirect object (v1.5.0) |\n| `buildAnnotationBody(annot)` | Build a markup annotation dictionary body (for the modifier) (v1.5.0) |\n\nSupported `MarkupAnnotation` types: `text`, `highlight`, `underline`, `strikeout`, `squiggly`, `square`, `circle`, `line`, `freetext`.\n\n### Layout Debug & Inspection\n\n| Function | Description |\n|----------|-------------|\n| `inspectDocumentLayout(params, layout?)` | Return a programmatic per-page block-geometry `LayoutInspection` (v1.5.0) |\n\nEnable the visual overlay via `layout: { debug: true }` or a granular `LayoutDebugOptions` (`showMargins` / `showContentBounds` / `showCells`). Byte-identical when debug is off.\n\n### Font-Data Tools (`pdfnative/tools`)\n\n| Function | Description |\n|----------|-------------|\n| `compileFontData(buffer, opts?)` | Compile a TTF/OTF `Uint8Array` into a font-data module source string (v1.5.0) |\n| `parseFontData(buffer, opts?)` | Parse a TTF/OTF `Uint8Array` into a `FontDataObject` (metrics, cmap, widths, glyph coverage) (v1.5.0) |\n\n### AcroForm Fields\n\n| Function | Description |\n|----------|-------------|\n| `buildFormWidget(field, objNum, pageRef)` | Build form field widget annotation + appearance stream |\n| `buildAcroFormDict(fieldRefs)` | Build `/AcroForm` dictionary for catalog |\n| `buildRadioGroupParent(group)` | Build radio button group parent object |\n| `buildAppearanceStreamDict(width, height)` | Build appearance stream dictionary |\n| `defaultFieldHeight(type)` | Default height by field type |\n\n### Digital Signatures\n\n| Function | Description |\n|----------|-------------|\n| `buildSigDict(options)` | Build `/Sig` dictionary with ByteRange/Contents placeholders (`subFilter: 'ETSI.CAdES.detached'` for PAdES, v1.7.0) |\n| `buildDocTimeStampDict(contentsSize?)` | Build a `/DocTimeStamp` dictionary variant (ISO 32000-2 §12.8.5, v1.7.0) |\n| `signPdfBytes(pdf, options)` | Sign a PDF with CMS/PKCS#7 detached signature (`profile: 'pades'`, `digestAlgorithm`, multi-signature `fieldName` selector, v1.7.0) |\n| `signPdfBytesWithTimestamp(pdf, options)` | Sign + embed a verified RFC 3161 signature timestamp (PAdES B-T, v1.7.0) |\n| `listSignatures(pdf)` | Enumerate signature fields — SubFilter, ByteRange, /Contents, placeholder/timestamp flags (v1.7.0) |\n| `collectValidationInfo(pdf, opts?)` | Gather certificates + OCSP/CRL material for every signature via the injected `RevocationProvider` (v1.7.0) |\n| `embedValidationInfo(pdf, data)` | Write pre-collected LTV material as `/DSS` + `/VRI` — sync, offline, deterministic (v1.7.0) |\n| `addValidationInfo(pdf, opts?)` | Collect + embed in one call (PAdES B-LT, v1.7.0) |\n| `addDocumentTimestamp(pdf, opts?)` | Append a `/DocTimeStamp` revision (PAdES B-LTA, v1.7.0) |\n| `estimateContentsSize(certSizes, algorithm?, opts?)` | Estimate `/Contents` size (`{ timestamp: true }` adds RFC 3161 headroom, v1.7.0) |\n| `setCryptoProvider(provider)` | Install (or clear with `null`) a global native signature provider (v1.4.0) |\n| `getCryptoProvider()` | Return the current global `CryptoProvider`, or `null` (v1.4.0) |\n| `setTimestampProvider(provider)` / `getTimestampProvider()` | Global RFC 3161 transport — TimeStampReq bytes in, TimeStampResp bytes out (v1.7.0) |\n| `setRevocationProvider(provider)` / `getRevocationProvider()` | Global OCSP/CRL transport (v1.7.0) |\n\n### Streaming Output\n\n| Function | Description |\n|----------|-------------|\n| `buildDocumentPDFStream(params, layout?, streamOpts?)` | Stream document PDF as `AsyncGenerator<Uint8Array>` |\n| `buildPDFStream(params, layout?, streamOpts?)` | Stream table PDF as `AsyncGenerator<Uint8Array>` |\n| `buildDocumentPDFStreamTrue(params, layout?, streamOpts?)` | **True constant-memory** document streaming — frees each part as it yields (v1.3.0) |\n| `buildPDFStreamTrue(params, layout?, streamOpts?)` | **True constant-memory** table streaming (v1.3.0) |\n| `buildDocumentPDFStreamPageByPage(params, layout?)` | Stream document PDF chunked at PDF object boundaries |\n| `buildPDFStreamPageByPage(params, layout?)` | Stream table PDF chunked at PDF object boundaries |\n| `validateDocumentStreamable(params, layout?)` | Validate document is compatible with streaming (no TOC, no `{pages}`) |\n| `validateTableStreamable(params, layout?)` | Validate table is compatible with streaming |\n| `chunkBinaryString(str, chunkSize)` | Split binary string into `Uint8Array` chunks |\n| `concatChunks(chunks)` | Concatenate `Uint8Array` chunks into one |\n| `streamByteLength(stream)` | Count total bytes from an async stream |\n| `streamToFile(stream, filePath, opts?)` | Drain an `AsyncGenerator<Uint8Array>` to disk with back-pressure + `AbortSignal` (Node) — returns `{ bytesWritten, path }` (v1.4.0) |\n\n### Crypto (Hashing, ASN.1, RSA, ECDSA, X.509, CMS)\n\n| Function |","readmeFilename":"README.md"}