///
///
export type PageSize = PredefinedPageSize | CustomPageSize;
export interface CustomPageSize {
width: number;
height: number | 'auto';
}
export type PredefinedPageSize =
| '4A0' | '2A0'
| 'A0' | 'A1' | 'A2' | 'A3' | 'A4' | 'A5' | 'A6' | 'A7' | 'A8' | 'A9' | 'A10'
| 'B0' | 'B1' | 'B2' | 'B3' | 'B4' | 'B5' | 'B6' | 'B7' | 'B8' | 'B9' | 'B10'
| 'C0' | 'C1' | 'C2' | 'C3' | 'C4' | 'C5' | 'C6' | 'C7' | 'C8' | 'C9' | 'C10'
| 'RA1' | 'RA2' | 'RA3' | 'RA4'
| 'SRA1' | 'SRA2' | 'SRA3' | 'SRA4'
| 'EXECUTIVE' | 'FOLIO' | 'LEGAL' | 'LETTER' | 'TABLOID';
export type PageOrientation = 'portrait' | 'landscape';
export type PageBreak = 'before' | 'after';
export type Size =
| number // absolute
| 'auto'
| '*'
| string; // percentage
export interface TFontDictionary {
[fontName: string]: TFontFamilyTypes;
}
export interface TFontFamilyTypes {
normal?: string;
bold?: string;
italics?: string;
bolditalics?: string;
}
export interface TDocumentInformation {
/** the title of the document */
title?: string;
/** the name of the author */
author?: string;
/** the subject of the document */
subject?: string;
/** keywords associated with the document */
keywords?: string;
creator?: string;
producer?: string;
creationDate?: Date;
modDate?: Date;
trapped?: string;
}
export type DynamicContent = (
currentPage: number,
pageCount: number,
pageSize: ContextPageSize,
) => Content | null | undefined;
export type DynamicBackground = (currentPage: number, pageSize: ContextPageSize) => Content | null | undefined;
export type Margins = number | [number, number] | [number, number, number, number];
export type Decoration = 'underline' | 'lineThrough' | 'overline';
export type DecorationStyle = 'dashed' | 'dotted' | 'double' | 'wavy';
export type Alignment = 'left' | 'right' | 'justify' | 'center';
export type DynamicRowSize = (row: number) => number | 'auto';
export interface CustomTableLayout {
hLineWidth?: DynamicLayout;
vLineWidth?: DynamicLayout;
hLineColor?: string | DynamicLayout;
vLineColor?: string | DynamicLayout;
hLineStyle?: DynamicLayout;
vLineStyle?: DynamicLayout;
fillColor?: string | DynamicLayout;
paddingLeft?: DynamicLayout;
paddingRight?: DynamicLayout;
paddingTop?: DynamicLayout;
paddingBottom?: DynamicLayout;
fillOpacity?: number | DynamicLayout;
defaultBorder?: boolean;
}
export type DynamicLayout = (rowIndex: number, node: ContentTable, columnIndex: number) => T | null | undefined;
export interface LineStyle {
dash?: {
length: number;
space?: number;
};
}
export type TableCell =
| {} // Used when another cell spans over this cell
| (Content & {
rowSpan?: number;
colSpan?: number;
border?: [boolean, boolean, boolean, boolean];
borderColor?: [string, string, string, string];
fillOpacity?: number;
});
export interface Table {
body: TableCell[][];
widths?: '*' | 'auto' | Size[];
heights?: number | number[] | DynamicRowSize;
headerRows?: number;
dontBreakRows?: boolean;
keepWithHeaderRows?: number;
layout?: TableLayout;
}
export type PredefinedTableLayout = 'noBorders' | 'headerLineOnly' | 'lightHorizontalLines';
export type TableLayout = string | PredefinedTableLayout | CustomTableLayout;
export interface Style {
/** name of the font */
font?: string;
/** size of the font in pt */
fontSize?: number;
fontFeatures?: PDFKit.Mixins.OpenTypeFeatures[];
/** the line height (default: 1) */
lineHeight?: number;
/** whether to use bold text (default: false) */
bold?: boolean;
/** whether to use italic text (default: false) */
italics?: boolean;
/** the alignment of the text */
alignment?: Alignment;
/** the color of the text (color name e.g., ‘blue’ or hexadecimal color e.g., ‘#ff5500’) */
color?: string;
/** the background color of the text */
background?: string;
/** the color of the bullets in a buletted list */
markerColor?: string;
/** the text decoration to applu (‘underline’ or ‘lineThrough’ or ‘overline’) */
decoration?: Decoration;
/** (‘dashed’ or ‘dotted’ or ‘double’ or ‘wavy’) */
decorationStyle?: DecorationStyle;
/** the color of the text decoration, see color */
decorationColor?: string;
margin?: Margins;
preserveLeadingSpaces?: boolean;
opacity?: number;
characterSpacing?: number;
leadingIndent?: number;
// Table-cell properties:
noWrap?: boolean;
/** the background color of a table cell */
fillColor?: string;
/** the background opacity of a table cell */
fillOpacity?: number;
/** optional space between columns */
columnGap?: Size;
// These properties appear in the documentation but don't do anything:
// tableCellPadding?: unknown;
// cellBorder?: unknown;
// headerCellBorder?: unknown;
// oddRowCellBorder?: unknown;
// evenRowCellBorder?: unknown;
// tableBorder?: unknown;
}
export type Content =
| string
| ArrayOfContent
| ContentText
| ContentColumns
| ContentStack
| ContentUnorderedList
| ContentOrderedList
| ContentTable
| ContentAnchor
| ContentPageReference
| ContentTextReference
| ContentToc
| ContentTocItem
| ContentImage
| ContentSvg
| ContentQr
| ContentCanvas;
// not exported, only used to prevent Content from circularly referencing itself
interface ArrayOfContent extends Array {}
export interface ContentText extends ContentLink, ContentBase {
text: Content;
}
export interface ContentColumns extends ContentBase {
columns: Column[];
}
export interface ContentStack extends ContentBase {
stack: Content[];
}
/** for numbered lists set the ol key */
export interface ContentOrderedList extends ContentBase {
ol: OrderedListElement[];
type?: OrderedListType;
markerColor?: string;
separator?: string | [string, string];
reversed?: boolean;
start?: number;
}
/** to treat a paragraph as a bulleted list, set an array of items under the ul key */
export interface ContentUnorderedList extends ContentBase {
ul: UnorderedListElement[];
type?: UnorderedListType;
markerColor?: string;
}
export interface ContentCanvas extends ContentBase {
canvas: CanvasElement[];
}
export interface ContentSvg extends ContentBase {
svg: string;
width?: number;
height?: number;
fit?: [number, number];
}
export interface ContentImage extends ContentLink, ContentBase {
image: string;
width?: number;
height?: number;
fit?: [number, number];
}
export interface ContentTable extends ContentBase {
table: Table;
layout?: TableLayout;
}
export interface ContentAnchor extends ContentBase {
text: string | ContentAnchor;
id: string;
}
export interface ContentTocItem extends ContentBase {
text: string | ContentTocItem;
tocItem: boolean | string | string[];
tocStyle?: string | string[] | Style;
tocNumberStyle?: string | string[] | Style;
tocMargin?: Margins;
}
export interface ContentPageReference extends ContentBase {
pageReference: string;
}
export interface ContentTextReference extends ContentBase {
textReference: string;
}
export interface ContentToc extends ContentBase {
toc: TableOfContent;
}
export interface ContentQr extends ContentBase {
qr: string;
foreground?: string;
fit?: number;
version?: number;
eccLevel?: 'L' | 'M' | 'Q' | 'H';
mode?: 'numeric' | 'alphanumeric' | 'octet';
mask?: number;
}
export interface ContentBase extends Style {
style?: string | string[] | Style;
absolutePosition?: { x: number; y: number };
relativePosition?: { x: number; y: number };
pageBreak?: PageBreak;
pageOrientation?: PageOrientation;
headlineLevel?: number;
}
export interface ContentLink {
link?: string;
linkToPage?: number;
linkToDestination?: string;
}
export interface TableOfContent {
title?: Content;
textMargin?: Margins;
textStyle?: string | string[] | Style;
numberStyle?: string | string[] | Style;
id?: string;
}
export type Column = Content & {
width?: Size;
};
export type OrderedListType = 'lower-alpha' | 'upper-alpha' | 'lower-roman' | 'upper-roman' | 'none';
export type OrderedListElement = Content & {
counter?: number;
listType?: OrderedListType;
};
export type UnorderedListType = 'square' | 'circle' | 'none';
export type UnorderedListElement = Content & {
listType?: UnorderedListType;
};
export type CanvasElement = CanvasRect | CanvasPolyline | CanvasLine | CanvasEllipse;
export interface CanvasRect extends CanvasLineElement, CanvasFilledElement {
type: 'rect';
x: number;
y: number;
w: number;
h: number;
r?: number;
}
export interface CanvasPolyline extends CanvasLineElement, CanvasFilledElement {
type: 'polyline';
points: Array<{ x: number; y: number }>;
closePath?: boolean;
lineCap?: 'round' | 'square';
}
export interface CanvasLine extends CanvasLineElement {
type: 'line';
x1: number;
y1: number;
x2: number;
y2: number;
lineCap?: 'round' | 'square';
}
export interface CanvasEllipse extends CanvasLineElement, CanvasFilledElement {
type: 'ellipse';
x: number;
y: number;
r1: number;
r2?: number;
}
export interface CanvasFilledElement {
color?: string;
fillOpacity?: number;
linearGradient?: string[];
}
export interface CanvasLineElement {
lineWidth?: number;
lineColor?: string;
dash?: {
length: number;
space?: number;
};
}
export interface StyleDictionary {
[name: string]: Style;
}
export type PDFVersion = '1.3' | '1.4' | '1.5' | '1.6' | '1.7' | '1.7ext3';
export interface Watermark {
/** watermark text */
text: string;
/** opacity of text */
opacity?: number;
/** angle of text rotation (minimal version: 0.1.60) */
angle?: number;
font?: string;
/** own font size of text (ideal size is calculated automatically) (minimal version: 0.1.60) */
fontSize?: number;
/** color of text */
color?: string;
/** bold style of text */
bold?: boolean;
/** italics style of text */
italics?: boolean;
}
export interface TDocumentDefinitions {
content: Content;
background?: DynamicBackground | Content;
compress?: boolean;
defaultStyle?: Style;
footer?: DynamicContent | Content;
header?: DynamicContent | Content;
images?: { [key: string]: string };
info?: TDocumentInformation;
pageBreakBefore?: (
currentNode: Node,
followingNodesOnPage: Node[],
nodesOnNextPage: Node[],
previousNodesOnPage: Node[],
) => boolean;
pageMargins?: Margins;
pageOrientation?: PageOrientation;
pageSize?: PageSize;
styles?: StyleDictionary;
userPassword?: string;
ownerPassword?: string;
permissions?: PDFKit.DocumentPermissions;
version?: PDFVersion;
watermark?: string | Watermark;
}
export interface Node {
text?: Content;
ul?: UnorderedListElement[];
ol?: OrderedListElement[];
table?: Table;
image?: string;
qr?: string;
canvas?: CanvasElement;
svg?: string;
columns?: Column[];
id?: string;
headlineLevel?: number;
style?: string | string[] | Style;
pageBreak?: PageBreak;
pageOrientation?: PageOrientation;
pageNumbers: number[];
pages: number;
stack: boolean;
startPosition: {
pageNumber: number;
pageOrientation: PageOrientation;
pageInnerHeight: number;
pageInnerWidth: number;
left: number;
top: number;
verticalRatio: number;
horizontalRatio: number;
};
}
export interface ContextPageSize {
height: number;
width: number;
orientation: PageOrientation;
}
export interface BufferOptions {
fontLayoutCache?: boolean;
bufferPages?: boolean;
tableLayouts?: { [key: string]: CustomTableLayout };
autoPrint?: boolean;
progressCallback?: (progress: number) => void;
}
// disable automatic exporting
export {};