declare module 'pdfmake/build/pdfmake' { interface PdfMakeStatic { fonts: Record; virtualfs: VirtualFileSystem; createPdf(docDefinition: TDocumentDefinitions, options?: Record): OutputDocumentBrowser; setFonts(fonts: Record): void; addFonts(fonts: Record): void; addVirtualFileSystem(vfs: Record): void; setUrlAccessPolicy(callback: ((url: string) => boolean) | undefined): void; } interface FontDefinition { normal: string; bold: string; italics: string; bolditalics: string; } interface VirtualFileSystem { storage: Record; existsSync(filename: string): boolean; readFileSync(filename: string, options?: string | { encoding?: string }): unknown; writeFileSync(filename: string, content: unknown, options?: string | { encoding?: string }): void; } interface OutputDocumentBrowser { getBlob(): Promise; getBuffer(): Promise; download(filename?: string): Promise; open(win?: Window | null): Promise; print(win?: Window | null): Promise; } type Margins = number | [number, number] | [number, number, number, number]; type Alignment = 'left' | 'center' | 'right' | 'justify'; interface Style { font?: string; fontSize?: number; bold?: boolean; italics?: boolean; alignment?: Alignment; color?: string; fillColor?: string; fillOpacity?: number; margin?: Margins; lineHeight?: number; decoration?: 'underline' | 'lineThrough' | 'overline'; columnGap?: number; outline?: boolean; } type Content = string | ContentText | ContentColumns | ContentStack | ContentTable | ContentImage | ContentSvg | ContentCanvas | Content[]; interface ContentText extends Style { text: string | Content[]; style?: string | string[]; pageBreak?: 'before' | 'after'; } interface ContentColumns extends Style { columns: Content[]; } interface ContentStack extends Style { stack: Content[]; } interface ContentImage extends Style { image: string; width?: number; height?: number; fit?: [number, number]; } interface ContentSvg extends Style { svg: string; width?: number; height?: number; fit?: [number, number]; } interface ContentCanvas extends Style { canvas: { type: string; x: number; y: number; w: number; h: number; r: number; color: string; }[]; } interface TableCell extends Style { text?: string | Content[]; rowSpan?: number; colSpan?: number; /** 单元格垂直对齐(pdfmake 0.3+,合并 rowSpan 时常用 middle;非 CSS 的 valign) */ verticalAlignment?: 'top' | 'middle' | 'bottom'; border?: [boolean, boolean, boolean, boolean]; noWrap?: boolean; } interface ContentTable extends Style { table: { headerRows?: number; widths?: ('auto' | '*' | number | string)[]; body: (string | TableCell | Content)[][]; }; layout?: string | TableLayout; } interface TableLayout { hLineWidth?: (i: number, node: unknown) => number; vLineWidth?: (i: number, node: unknown) => number; hLineColor?: (i: number, node: unknown) => string; vLineColor?: (i: number, node: unknown) => string; paddingLeft?: (i: number, node: unknown) => number; paddingRight?: (i: number, node: unknown) => number; paddingTop?: (i: number, node: unknown) => number; paddingBottom?: (i: number, node: unknown) => number; fillColor?: (rowIndex: number, node: unknown, columnIndex: number) => string | null; } interface TDocumentDefinitions { content: Content; defaultStyle?: Style; styles?: Record; pageSize?: string | { width: number; height: number }; pageOrientation?: 'portrait' | 'landscape'; pageMargins?: Margins; header?: Content | ((currentPage: number, pageCount: number) => Content); footer?: Content | ((currentPage: number, pageCount: number) => Content); info?: Record; images?: Record }>; } const pdfMake: PdfMakeStatic; export default pdfMake; export type { TDocumentDefinitions, Content, ContentText, ContentColumns, ContentStack, ContentTable, ContentImage, TableCell, TableLayout, Style, Margins, Alignment, OutputDocumentBrowser, }; }