UNPKG

react-to-pdf

Version:

Create PDF documents from React Components

8 lines (7 loc) 14.1 kB
{ "version": 3, "sources": ["../src/index.ts", "../src/converter.ts", "../src/constants.ts", "../src/utils.ts"], "sourcesContent": ["import { useRef, useCallback } from \"react\";\nimport html2canvas from \"html2canvas\";\n\nimport Converter from \"./converter\";\nimport { Options, TargetElementFinder, UsePDFResult } from \"./types\";\nimport { buildConvertOptions } from \"./utils\";\nimport jsPDF from \"jspdf\";\nexport { Resolution, Margin } from \"./constants\";\nexport type { Options };\n\nconst getTargetElement = (\n targetRefOrFunction: TargetElementFinder\n): HTMLElement | null | undefined => {\n if (typeof targetRefOrFunction === \"function\") {\n return targetRefOrFunction();\n }\n return targetRefOrFunction?.current;\n};\n\nexport const usePDF = (usePDFoptions?: Options): UsePDFResult => {\n const targetRef = useRef();\n const toPDF = useCallback(\n (toPDFoptions?: Options): Promise<InstanceType<typeof jsPDF>> => {\n return generatePDF(targetRef, usePDFoptions ?? toPDFoptions);\n },\n [targetRef, usePDFoptions]\n );\n return { targetRef, toPDF };\n};\n\nconst generatePDF = async (\n targetRefOrFunction: TargetElementFinder,\n customOptions?: Options\n): Promise<InstanceType<typeof jsPDF>> => {\n const options = buildConvertOptions(customOptions);\n const targetElement = getTargetElement(targetRefOrFunction);\n if (!targetElement) {\n console.error(\"Unable to get the target element.\");\n return;\n }\n const canvas = await html2canvas(targetElement, {\n useCORS: options.canvas.useCORS,\n logging: options.canvas.logging,\n scale: options.resolution,\n ...options.overrides?.canvas,\n });\n const converter = new Converter(canvas, options);\n const pdf = converter.convert();\n switch (options.method) {\n case \"build\":\n return pdf;\n case \"open\": {\n window.open(pdf.output(\"bloburl\"), \"_blank\");\n return pdf;\n }\n case \"save\":\n default: {\n const pdfFilename = options.filename ?? `${new Date().getTime()}.pdf`;\n await pdf.save(pdfFilename, { returnPromise: true });\n return pdf;\n }\n }\n};\n\nexport default generatePDF;\n", "import jsPDF from \"jspdf\";\nimport { MM_TO_PX } from \"./constants\";\nimport { ConversionOptions, Options } from \"./types\";\n\nexport default class Converter {\n pdf: InstanceType<typeof jsPDF>;\n canvas: HTMLCanvasElement;\n options: Options;\n constructor(canvas: HTMLCanvasElement, options: ConversionOptions) {\n this.canvas = canvas;\n this.options = options;\n this.pdf = new jsPDF({\n format: this.options.page.format,\n orientation: this.options.page.orientation,\n ...this.options.overrides?.pdf,\n unit: \"mm\",\n });\n }\n getMarginTopMM() {\n const margin =\n typeof this.options.page.margin === \"object\"\n ? this.options.page.margin.top\n : this.options.page.margin;\n return Number(margin);\n }\n getMarginLeftMM() {\n const margin =\n typeof this.options.page.margin === \"object\"\n ? this.options.page.margin.left\n : this.options.page.margin;\n return Number(margin);\n }\n getMarginRightMM() {\n const margin =\n typeof this.options.page.margin === \"object\"\n ? this.options.page.margin.right\n : this.options.page.margin;\n return Number(margin);\n }\n getMarginBottomMM() {\n const margin =\n typeof this.options.page.margin === \"object\"\n ? this.options.page.margin.bottom\n : this.options.page.margin;\n return Number(margin);\n }\n getMarginTop() {\n return this.getMarginTopMM() * MM_TO_PX;\n }\n getMarginBottom() {\n return this.getMarginBottomMM() * MM_TO_PX;\n }\n getMarginLeft() {\n return this.getMarginLeftMM() * MM_TO_PX;\n }\n getMarginRight() {\n return this.getMarginRightMM() * MM_TO_PX;\n }\n getScale() {\n return this.options.resolution;\n }\n getPageHeight() {\n return this.getPageHeightMM() * MM_TO_PX;\n }\n getPageHeightMM() {\n return this.pdf.internal.pageSize.height;\n }\n getPageWidthMM() {\n return this.pdf.internal.pageSize.width;\n }\n getPageWidth() {\n return this.getPageWidthMM() * MM_TO_PX;\n }\n getOriginalCanvasWidth() {\n return this.canvas.width / this.getScale();\n }\n getOriginalCanvasHeight() {\n return this.canvas.height / this.getScale();\n }\n getCanvasPageAvailableHeight() {\n return (\n this.getPageAvailableHeight() *\n this.getScale() *\n this.getHorizontalFitFactor()\n );\n }\n getPageAvailableWidth() {\n return this.getPageWidth() - (this.getMarginLeft() + this.getMarginRight());\n }\n getPageAvailableHeight() {\n return (\n this.getPageHeight() - (this.getMarginTop() + this.getMarginBottom())\n );\n }\n getPageAvailableWidthMM() {\n return this.getPageAvailableWidth() / MM_TO_PX;\n }\n getPageAvailableHeightMM() {\n return this.getPageAvailableHeight() / MM_TO_PX;\n }\n getNumberPages() {\n return Math.ceil(this.canvas.height / this.getCanvasPageAvailableHeight());\n }\n getHorizontalFitFactor() {\n if (this.getPageAvailableWidth() < this.getOriginalCanvasWidth()) {\n return this.getOriginalCanvasWidth() / this.getPageAvailableWidth();\n }\n return 1;\n }\n getCanvasOffsetY(pageNumber: number) {\n return this.getCanvasPageAvailableHeight() * (pageNumber - 1);\n }\n getCanvasHeightLeft(pageNumber: number) {\n return this.canvas.height - this.getCanvasOffsetY(pageNumber);\n }\n getCanvasPageHeight(pageNumber: number) {\n if (this.canvas.height < this.getCanvasPageAvailableHeight()) {\n return this.canvas.height;\n }\n const canvasHeightPending = this.getCanvasHeightLeft(pageNumber);\n return canvasHeightPending < this.getCanvasPageAvailableHeight()\n ? canvasHeightPending\n : this.getCanvasPageAvailableHeight();\n }\n getCanvasPageWidth() {\n return this.canvas.width;\n }\n createCanvasPage(pageNumber: number): HTMLCanvasElement {\n const canvasPageWidth = this.getCanvasPageWidth();\n const canvasPageHeight = this.getCanvasPageHeight(pageNumber);\n const canvasPage = document.createElement(\"canvas\");\n canvasPage.setAttribute(\"width\", String(canvasPageWidth));\n canvasPage.setAttribute(\"height\", String(canvasPageHeight));\n const ctx = canvasPage.getContext(\"2d\");\n ctx.drawImage(\n this.canvas,\n 0,\n this.getCanvasOffsetY(pageNumber),\n this.canvas.width,\n canvasPageHeight,\n 0,\n 0,\n this.canvas.width,\n canvasPageHeight\n );\n return canvasPage;\n }\n convert(): InstanceType<typeof jsPDF> {\n let pageNumber = 1;\n const numberPages = this.getNumberPages();\n while (pageNumber <= numberPages) {\n if (pageNumber > 1) {\n this.pdf.addPage(\n this.options.page.format,\n this.options.page.orientation\n );\n }\n const canvasPage = this.createCanvasPage(pageNumber);\n const pageImageDataURL = canvasPage.toDataURL(\n this.options.canvas.mimeType,\n this.options.canvas.qualityRatio\n );\n this.pdf.setPage(pageNumber);\n this.pdf.addImage({\n imageData: pageImageDataURL,\n width:\n canvasPage.width /\n (this.getScale() * MM_TO_PX * this.getHorizontalFitFactor()),\n height:\n canvasPage.height /\n (this.getScale() * MM_TO_PX * this.getHorizontalFitFactor()),\n x: this.getMarginLeftMM(),\n y: this.getMarginTopMM(),\n });\n pageNumber += 1;\n }\n return this.pdf;\n }\n}\n", "import { ConversionOptions } from \"./types\";\n\nexport const MM_TO_PX = 3.77952755906;\n\nexport enum Resolution {\n LOW = 1,\n NORMAL = 2,\n MEDIUM = 3,\n HIGH = 7,\n EXTREME = 12,\n}\n\nexport enum Margin {\n NONE = 0,\n SMALL = 5,\n MEDIUM = 10,\n LARGE = 25,\n}\n\nexport const DEFAULT_OPTIONS: Readonly<ConversionOptions> = {\n method: \"save\",\n resolution: Resolution.MEDIUM,\n page: {\n margin: Margin.NONE,\n format: \"A4\",\n orientation: \"portrait\",\n },\n canvas: {\n mimeType: \"image/jpeg\",\n qualityRatio: 1,\n useCORS: true,\n logging: false,\n },\n overrides: {},\n};\n", "import { DEFAULT_OPTIONS } from \"./constants\";\nimport { ConversionOptions, Options } from \"./types\";\n\nexport const buildConvertOptions = (options?: Options): ConversionOptions => {\n if (!options) {\n return DEFAULT_OPTIONS;\n }\n return {\n ...DEFAULT_OPTIONS,\n ...options,\n canvas: { ...DEFAULT_OPTIONS.canvas, ...options.canvas },\n page: { ...DEFAULT_OPTIONS.page, ...options.page },\n };\n};\n"], "mappings": "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", "names": ["Resolution", "Margin"] }