@sarfarajey/pdf-primitives
v1.0.0
Published
Low-level browser-side PDF generation utilities — raw PDF 1.4, no jsPDF, no server
Maintainers
Readme
@sarfarajey/pdf-primitives
Low-level browser-side PDF generation utilities. Generates valid PDF 1.4 from scratch — no jsPDF, no canvas, no server.
Install
npm install @sarfarajey/pdf-primitivesUsage
import {
buildMultiPagePdf,
addPageChrome,
addWrappedBlock,
textCommand,
lineCommand,
MARGIN,
CONTENT_TOP,
CONTENT_BOTTOM,
} from '@sarfarajey/pdf-primitives';
// Build a single-page PDF
const page: string[] = [];
// Add branded header + footer (all fields optional)
addPageChrome(page, {
accentRgb: [0.2, 0.4, 0.9],
brandLabel: 'My Company | mycompany.com',
footerLine1: 'mycompany.com | [email protected]',
footerLine2: 'Confidential — not for distribution.',
});
// Add a title
page.push(textCommand('Quarterly Report', MARGIN, CONTENT_TOP, 20));
// Add a wrapped paragraph
let y = CONTENT_TOP - 30;
y = addWrappedBlock(page, 'This is a long paragraph that will be wrapped...', MARGIN, y, 11, 85, 15);
// Add a divider
page.push(lineCommand(MARGIN, y, 556, y));
// Produce and download the PDF
const blob = buildMultiPagePdf([page]);
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'report.pdf';
a.click();
URL.revokeObjectURL(url);API
Page geometry constants
| Constant | Value | Description |
|----------|-------|-------------|
| PAGE_WIDTH | 612 | US Letter width (pt) |
| PAGE_HEIGHT | 792 | US Letter height (pt) |
| MARGIN | 56 | Left/right margin (pt) |
| CONTENT_END_X | 556 | Right edge of content area |
| CONTENT_TOP | 740 | Top of content area |
| CONTENT_BOTTOM | 70 | Bottom of content area |
Text
toAscii(input)— Normalize Unicode → printable ASCII.escapePdfText(input)— Escape for PDF string literals.wrapText(text, maxChars)— Word-wrap to string array.textCommand(text, x, y, fontSize)— Raw PDF BT…ET command string.addWrappedBlock(commands, text, x, y, fontSize, maxChars, lineHeight)— Append wrapped text, returns Y cursor below last line.
Graphics
lineCommand(x1, y1, x2, y2)— Raw PDF line-draw command.
Page chrome
addPageChrome(commands, config?)— Append configurable header + footer to a page.
interface PageChromeConfig {
accentRgb?: [number, number, number]; // RGB 0–1, default black
brandLabel?: string;
footerLine1?: string;
footerLine2?: string;
}Multi-page builder
buildMultiPagePdf(pages, pageImages?)— Produce aBlob(application/pdf).
// Multi-page with images
const blob = buildMultiPagePdf(
[page1Commands, page2Commands],
[
[{ id: 'Im0', hexData: '...', nativeWidth: 800, nativeHeight: 600 }],
[], // page 2 has no images
],
);Images must be JPEG encoded and provided as ASCII hex strings.
License
MIT
