diff --git a/pdfkit/pdfkit-tests.ts b/pdfkit/pdfkit-tests.ts new file mode 100644 index 0000000000..f60a00b1c9 --- /dev/null +++ b/pdfkit/pdfkit-tests.ts @@ -0,0 +1,136 @@ +/// + +import PDFGradient = require("pdfkit/js/gradient"); + +var PDFRadialGradiant = PDFGradient.PDFRadialGradiant; +var PDFLinearGradient = PDFGradient.PDFLinearGradient; + +import mtext = require("pdfkit/js/mixins/text"); + +import PDFDocument = require("pdfkit"); + +import font = require("pdfkit/js/mixins/fonts"); +import pdfData = require("pdfkit/js/data"); +import text = require("pdfkit/js/mixins/text"); + +font.registerFont("Arial"); +text.widthOfString("Kila",{ellipsis:true}); + +var doc = new PDFDocument({compress:false, sizes:[526,525],autoFirstPage:true}); + + +doc.addPage({ + margin: 50 +}); + +doc.addPage({ + margins: { + top: 50, + bottom: 50, + left: 72, + right: 72 + } +}); + +doc.info.Title = "Sample"; +doc.info.Author = "kila Mogrosso"; + +// Create basic shapes +doc.moveTo(0,20) + .lineTo(100,160) + .quadraticCurveTo(130,200,150,120) + .lineTo(400,90) + .stroke(); + +//SVG Paths +doc.path("M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90") + .stroke(); + +//Rectangle shape helper sample +doc.rect(100,200,100,100); + +//polygon +doc.polygon([100,0],[50,100],[50,100]); + + +doc.lineWidth(25); +doc.lineCap('butt').moveTo(50, 20).lineTo(100, 20).stroke(); +doc.lineCap('round').moveTo(150, 20).lineTo(200, 20).stroke(); +doc.lineCap('square').moveTo(250, 20).circle(275, 30, 15).stroke(); +doc.lineJoin('miter').rect(50, 100, 50, 50).stroke(); +doc.lineJoin('round').rect(150, 100, 50, 50).stroke(); +doc.lineJoin('bevel').rect(250, 100, 50, 50).stroke(); + + +doc.circle(100, 50, 50) + .lineWidth(3) + .fillOpacity(0.8) + .fillAndStroke("red", "#900"); + +var grad = doc.linearGradient(50, 0, 150, 100) + .stop(0, 'green') + .stop(1, 'red'); + +doc.rect(50, 0, 100, 100) +.fill(grad); + +doc.circle(100, 50, 50).dash(5, { + space: 10 +}).stroke(); + +var rgrad = doc.radialGradient(300, 50, 0, 300, 50, 50); +rgrad.stop(0, 'orange', 0).stop(1, 'orange', 1); +doc.circle(300, 50, 50) + .fill(rgrad); + +doc.fillColor('red') + .translate(-100, -50) + .scale(0.8); + +doc.path('M 250,75 L 323,301 131,161 369,161 177,301 z') + .fill('non-zero'); + +doc.translate(280, 0) + .path('M 250,75 L 323,301 131,161 369,161 177,301 z') + .fill('even-odd'); + +doc.circle(100,100,100) + .clip(); + +doc.fontSize(25) + .fillColor('blue') + .text('This is a link!', 20, 0); + +var width = doc.widthOfString('This is a link!'); + +var height = doc.currentLineHeight(); + +doc.underline(20, 0, width, height, { + color: 'blue' +}).link(20, 0, width, height, 'http://google.com/'); + +doc.moveDown() + .fillColor('black') + .highlight(20, doc.y, doc.widthOfString('This text is highlighted!'), height) + .text('This text is highlighted!'); + +doc.moveDown() +.strike(20, doc.y, doc.widthOfString('STRIKE!'), height) +.text('STRIKE!'); + +doc.image('images/test.jpeg', 0, 15, { + width: 300 +}).text('Proprotional to width', 0, 0); + +doc.image('images/test.jpeg', 320, 15, { + fit: [100, 100] +}).rect(320, 15, 100, 100).stroke().text('Fit', 320, 0); + +doc.image('images/test.jpeg', 320, 145, { + width: 200, + height: 100 +}).text('Stretch', 320, 130); + +doc.image('images/test.jpeg', 320, 280, { + scale: 0.25 +}).text('Scale', 320, 265); diff --git a/pdfkit/pdfkit.d.ts b/pdfkit/pdfkit.d.ts new file mode 100644 index 0000000000..d4e1beeecb --- /dev/null +++ b/pdfkit/pdfkit.d.ts @@ -0,0 +1,390 @@ +// Type definitions for Pdfkit v0.7.1 +// Project: http://pdfkit.org +// Definitions by: Eric Hillah +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +declare module PDFKit { + interface PDFGradient { + new(document: any): PDFGradient ; + stop(pos: number, color?: string|PDFKit.PDFGradient, opacity?: number): PDFGradient; + embed(): void; + apply(): void; + } + + interface PDFLinearGradient extends PDFGradient { + new(document: any, x1: number, y1: number, x2: number, y2: number): PDFLinearGradient; + shader(fn: () => any): any; + opacityGradient(): PDFLinearGradient; + } + + interface PDFRadialGradient extends PDFGradient { + new(document: any, x1: number, y1: number, x2: number, y2: number): PDFRadialGradient; + shader(fn: () => any): any; + opacityGradient(): PDFRadialGradient; + } +} + +declare module PDFKit.Mixins { + + interface AnnotationOption { + Type?: string; + Rect?: any; + Border?: Array; + SubType?: string; + Contents?: string; + Name?: string; + color?: string; + QuadPoints?: Array; + + A?: any; + B?: any; + C?: any; + L?: any; + DA?: string; + } + + interface PDFAnnotation { + annotate(x: number, y: number, w: number, h: number, option: AnnotationOption): TDocument; + note(x: number, y: number, w: number, h: number, content: string, option?: AnnotationOption): TDocument; + link(x: number, y: number, w: number, h: number, url: string, option?: AnnotationOption): TDocument; + highlight(x: number, y: number, w: number, h: number, option?: AnnotationOption): TDocument; + underline(x: number, y: number, w: number, h: number, option?: AnnotationOption): TDocument; + strike(x: number, y: number, w: number, h: number, option?: AnnotationOption): TDocument; + lineAnnotation(x1: number, y1: number, x2: number, y2: number, option?: AnnotationOption): TDocument; + rectAnnotation(x: number, y: number, w: number, h: number, option?: AnnotationOption): TDocument; + ellipseAnnotation(x: number, y: number, w: number, h: number, option?: AnnotationOption): TDocument; + textAnnotation(x: number, y: number, w: number, h: number, text: string, option?: AnnotationOption): TDocument; + } + + interface PDFColor { + fillColor(color: string|PDFGradient, opacity?: number): TDocument; + strokeColor(color: string, opacity?: number): TDocument; + opacity(opacity: number): TDocument; + fillOpacity(opacity: number): TDocument; + strokeOpacity(opacity: number): TDocument; + linearGradient(x1: number, y1: number, x2: number, y2: number): PDFLinearGradient; + radialGradient(x1: number, y1: number, r1: number, x2: number, y2: number, r2: number): PDFRadialGradient; + } + + interface PDFFont { + font(src: string, family?: string, size?: number): TDocument; + fontSize(size: number): TDocument; + currentLineHeight(includeGap?: boolean): number; + registerFont(name: string, src?: string, family?: string): TDocument; + } + + interface ImageOption { + width?: number; + height?: number; + /** Scale percentage */ + scale?: number; + /** Two elements array specifying dimensions(w,h) */ + fit?: number[]; + } + + interface PDFImage { + /** + * Draw an image in PDFKit document. + * No need chainning capabilities + */ + image(src: any, x: number, y: number, options: ImageOption): any; + } + + interface TextOptions { + /** Set to false to disable line wrapping all together */ + lineBreak?: boolean; + /** The width that text should be wrapped to (by default, the page width minus the left and right margin) */ + width?: number; + /** The maximum height that text should be clipped to */ + height?: number; + /** The character to display at the end of the text when it is too long. Set to true to use the default character. */ + ellipsis?: boolean|string; + /** the number of columns to flow the text into */ + columns?: number; + /** the amount of space between each column (1/4 inch by default) */ + columnGap?: number; + /** The amount in PDF points (72 per inch) to indent each paragraph of text */ + indent?: number; + /** the amount of space between each paragraph of text */ + paragrahGap?: number; + /** the amount of space between each line of text */ + lineGap?: number; + /** the amount of space between each word in the text */ + wordSpacing?: number; + /** the amount of space between each character in the text */ + characterSpacing?: number; + /** whether to fill the text (true by default) */ + fill?: boolean; + /** whether to stroke the text */ + stroke?: boolean; + /** A URL to link this text to (shortcut to create an annotation) */ + link?: string; + /** whether to underline the text */ + underline?: boolean; + /** whether to strike out the text */ + strike?: boolean; + /**whether the text segment will be followed immediately by another segment. Useful for changing styling in the middle of a paragraph. */ + continued?: boolean; + } + + interface PDFText { + lineGap(lineGap: number): TDocument; + moveDown(line?: number): TDocument; + moveUp(line?: number): TDocument; + text(text: string, x?: number, y?: number, options?: TextOptions): TDocument; + text(text: string, options?: TextOptions): TDocument; + widthOfString(text: string, options?: TextOptions): number; + heightOfString(text: string, options?: TextOptions): number; + list(list: Array, x?: number, y?: number, options?: TextOptions): TDocument; + list(list: Array, options?: TextOptions): TDocument; + } + + interface PDFVector { + + save(): TDocument; + restore(): TDocument; + closePath(): TDocument; + lineWidth(w: number): TDocument; + lineCap(c: string): TDocument; + lineJoin(j: string): TDocument; + miterLimit(m: any): TDocument; + dash(length: number, option: any): TDocument; + undash(): TDocument; + moveTo(x: number, y: number): TDocument; + lineTo(x: number, y: number): TDocument; + bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): TDocument; + quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): TDocument; + rect(x: number, y: number, w: number, h: number): TDocument; + roundRect(x: number, y: number, w: number, h: number, r?: number): TDocument; + ellipse(x: number, y: number, r1: number, r2?: number): TDocument; + circle(x: number, y: number, raduis: number): TDocument; + polygon(...points: number[][]): TDocument; + path(path: string): TDocument; + fill(color: string|PDFKit.PDFGradient, rule?: string): TDocument; + stroke(color?: string|PDFKit.PDFGradient): TDocument; + fillAndStroke(fillColor: string, strokeColor?: string, rule?: string): TDocument; + clip(rule?: string): TDocument; + transform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): TDocument; + translate(x: number, y: number): TDocument; + rotate(angle: number, options?: { origin?: number[] }): TDocument; + scale(xFactor: number, yFactor?: number, options?: { origin?: number[] }): TDocument; + } +} + +declare module PDFKit { + /** + * PDFKit data + */ + interface PDFData { + new (data: any[]): PDFData; + readByte(): any; + writeByte(byte: any): void; + byteAt(index: number): any; + readBool(): boolean; + writeBool(val: boolean): boolean; + readUInt32(): number; + writeUInt32(val: number): void; + readInt32(): number; + writeInt32(val: number): void; + readUInt16(): number; + writeUInt16(val: number): void; + readInt16(): number; + writeInt16(val: number): void; + readString(length: number): string; + writeString(val: string): void; + stringAt(pos: number, length: number): string; + readShort(): number; + writeShort(val: number): void; + readLongLong(): number; + writeLongLong(val: number): void; + readInt(): number; + writeInt(val: number): void; + slice(start: number, end: number): any[]; + read(length: number): any[]; + write(bytes: any[]): void; + } +} + +declare module "pdfkit/js/data" { + var PDFKitData: PDFKit.PDFData; + export = PDFKitData; +} + +declare module PDFKit { + interface DocumentInfo { + Producer?: string; + Creator?: string; + CreationDate?: Date; + Title?: string; + Author?: string; + Keywords?: string; + ModDate?: Date; + } + + interface PDFDocumentOptions { + compress?: boolean; + info?: DocumentInfo; + autoFirstPage?: boolean; + sizes?: number[]; + margin?: { top: number; left: number; bottom: number; right: number }|number; + + bufferPages?: boolean; + } + + interface PDFDocument extends NodeJS.ReadableStream, + Mixins.PDFAnnotation, Mixins.PDFColor, Mixins.PDFImage, + Mixins.PDFText, Mixins.PDFVector, Mixins.PDFFont { + /** + * PDF Version + */ + version: number; + /** + * Wheter streams should be compressed + */ + compress: boolean; + /** + * PDF document Metadata + */ + info: DocumentInfo; + /** + * Options for the document + */ + options: PDFDocumentOptions; + /** + * Represent the current page. + */ + page: PDFPage; + + x: number; + y: number; + + new (options?: PDFDocumentOptions): PDFDocument; + + addPage(options?: PDFDocumentOptions): PDFDocument; + bufferedPageRanges(): { start: number; count: number }; + switchToPage(n?: number): PDFPage; + flushPages(): void; + ref(data: {}): PDFKitReference; + addContent(data: any): PDFDocument + /** + * Deprecated + */ + write(fileName: string, fn: any): void; + /** + * Deprecated. Throws exception + */ + output(fn: any): void; + end(): void; + toString(): string; + } +} + +declare module "pdfkit" { + var doc: PDFKit.PDFDocument; + export = doc; +} + +declare module "pdfkit/js/gradient" { + var gradient : { + PDFGradient: PDFKit.PDFGradient; + PDFLinearGradient: PDFKit.PDFLinearGradient; + PDFRadialGradiant: PDFKit.PDFRadialGradient; + } + + export = gradient; +} + +declare module PDFKit { + /** + * Represent a single page in the PDF document + */ + interface PDFPage { + size: string; + layout: string; + margin: { top: number; left: number; bottom: number; right: number }|number; + width: number; + height: number; + document: PDFDocument; + content: PDFKitReference; + + /** + * The page dictionnary + */ + dictionary: PDFKitReference; + + fonts: any; + xobjects: any; + ext_gstates: any; + patterns: any; + annotations: any; + + maxY(): number; + write(chunk: any): void; + end(): void; + } +} + +declare module "pdfkit/js/page" { + var PDFKitPage: PDFKit.PDFPage + + export = PDFKitPage +} + +declare module PDFKit { + /** PDFReference - represents a reference to another object in the PDF object heirarchy */ + class PDFKitReference { + id: number; + gen: number; + deflate:any; + compress: boolean; + uncompressedLength: number; + chunks: any[]; + data: { Font?: any; XObject?: any; ExtGState?: any; Pattern: any; Annots: any }; + document: PDFDocument; + + constructor(document: PDFDocument, id: number, data: {}); + initDeflate(): void; + write(chunk: any): void; + end(chunk: any): void; + finalize(): void; + toString(): string; + } +} + +declare module "pdfkit/js/reference" { + var PDFKitReference: PDFKit.PDFKitReference; + + export = PDFKitReference; +} + +declare module "pdfkit/js/mixins/annotations" { + var PDFKitAnnotation: PDFKit.Mixins.PDFAnnotation; + export = PDFKitAnnotation; +} + +declare module "pdfkit/js/mixins/color" { + var PDFKitColor: PDFKit.Mixins.PDFColor; + export = PDFKitColor; +} + +declare module "pdfkit/js/mixins/fonts" { + var PDFKitFont: PDFKit.Mixins.PDFFont; + export = PDFKitFont; +} + +declare module "pdfkit/js/mixins/images" { + var PDFKitImage: PDFKit.Mixins.PDFImage; + export = PDFKitImage; +} + +declare module "pdfkit/js/mixins/text" { + var PDFKitText: PDFKit.Mixins.PDFText; + export = PDFKitText; +} + +declare module "pdfkit/js/mixins/vector" { + var PDFKitVector: PDFKit.Mixins.PDFVector; + export = PDFKitVector; +}