UNPKG

@codewithrajat/rm-ng-pdf-export

Version:

Angular library for exporting HTML content to PDF using html2canvas and pdf-lib with smart page breaking

1 lines 30.4 kB
{"version":3,"file":"codewithrajat-rm-ng-pdf-export.mjs","sources":["../../../projects/rm-ng-pdf-export/src/lib/tokens/pdf-export-config.token.ts","../../../projects/rm-ng-pdf-export/src/lib/services/pdf-export.service.ts","../../../projects/rm-ng-pdf-export/src/lib/directives/pdf-export.directive.ts","../../../projects/rm-ng-pdf-export/src/lib/components/pdf-export.component.ts","../../../projects/rm-ng-pdf-export/src/codewithrajat-rm-ng-pdf-export.ts"],"sourcesContent":["// pdf-export-config.token.ts\nimport { InjectionToken } from '@angular/core';\n\nexport type PageSize = 'A4' | 'A3' | 'A5' | 'Letter' | 'Legal' | 'Tabloid' | 'Ledger' | 'Executive' | 'B4' | 'B5';\nexport type PageOrientation = 'portrait' | 'landscape';\n\nexport interface PdfExportConfig {\n pageSize?: PageSize; // e.g. 'A4'\n orientation?: PageOrientation;\n margins?: { top: number; bottom: number; left: number; right: number };\n filename?: string;\n metadata?: { title?: string; author?: string; subject?: string };\n openInNewTab?: boolean;\n}\n\nexport const PDF_EXPORT_CONFIG = new InjectionToken<PdfExportConfig>('PDF_EXPORT_CONFIG');\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {PDFDocument, PDFImage, PDFPage} from 'pdf-lib';\nimport { PDF_EXPORT_CONFIG, PdfExportConfig } from '../tokens/pdf-export-config.token';\nimport html2canvas from 'html2canvas';\n\ninterface PageDimensions {\n width: number;\n height: number;\n}\n\ninterface PageSizeDefinition {\n name: string;\n width: number; // in points\n height: number; // in points\n}\n\ninterface ContentBreakPoint {\n y: number;\n priority: number; // Higher number = better break point\n elementType: string;\n}\n\n@Injectable()\nexport class PdfExportService {\n // Predefined page sizes in points (72 DPI)\n private readonly PAGE_SIZES: Record<string, PageSizeDefinition> = {\n 'A4': { name: 'A4', width: 595.28, height: 841.89 },\n 'A3': { name: 'A3', width: 841.89, height: 1190.55 },\n 'A5': { name: 'A5', width: 419.53, height: 595.28 },\n 'Letter': { name: 'Letter', width: 612, height: 792 },\n 'Legal': { name: 'Legal', width: 612, height: 1008 },\n 'Tabloid': { name: 'Tabloid', width: 792, height: 1224 },\n 'Ledger': { name: 'Ledger', width: 1224, height: 792 },\n 'Executive': { name: 'Executive', width: 522, height: 756 },\n 'B4': { name: 'B4', width: 708.66, height: 1000.63 },\n 'B5': { name: 'B5', width: 498.90, height: 708.66 }\n };\n\n constructor(\n @Inject(PDF_EXPORT_CONFIG) private readonly config: PdfExportConfig,\n @Inject(PLATFORM_ID) private readonly platformId: object\n ) {}\n\n async exportHtml(element: HTMLElement, overrideConfig?: PdfExportConfig): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) {\n throw new Error('PDF export is only supported in browser environments.');\n }\n\n const config = { ...this.config, ...overrideConfig };\n\n // Get page dimensions based on configuration\n const pageSize = config.pageSize || 'A4';\n const orientation = config.orientation || 'portrait';\n const pageDimensions = this._getPageDimensions(pageSize, orientation);\n\n // Convert HTML element to canvas\n const canvas: HTMLCanvasElement = await html2canvas(element);\n\n // Calculate scale factor to fit content width to page width\n const scaleFactor = this._calculateScaleFactor(canvas.width, pageDimensions.width);\n\n // Detect optimal break points in the content\n const breakPoints = this._detectContentBreakPoints(element, canvas, scaleFactor);\n\n // Calculate smart page breaks\n const pageBreaks = this._calculateSmartPageBreaks(canvas.height, scaleFactor, pageDimensions.height, breakPoints);\n\n // Create PDF document\n const pdf: PDFDocument = await PDFDocument.create();\n\n // Add metadata if provided\n if (config.metadata) {\n pdf.setTitle(config.metadata.title || '');\n pdf.setAuthor(config.metadata.author || '');\n pdf.setSubject(config.metadata.subject || '');\n }\n\n // Generate each page with smart breaks\n for (let pageIndex = 0; pageIndex < pageBreaks.length; pageIndex++) {\n const currentBreak = pageBreaks[pageIndex];\n const nextBreak = pageBreaks[pageIndex + 1];\n\n // Create canvas for this page with smart bounds\n const pageCanvas = this._createSmartPageCanvas(\n canvas,\n currentBreak,\n nextBreak,\n scaleFactor,\n pageDimensions\n );\n\n // Convert page canvas to image data\n const pageImgData = pageCanvas.toDataURL('image/png');\n\n // Add page to PDF with configured dimensions\n const page: PDFPage = pdf.addPage([pageDimensions.width, pageDimensions.height]);\n\n // Embed the image and draw it on the page\n const png: PDFImage = await pdf.embedPng(pageImgData);\n page.drawImage(png, {\n x: 0,\n y: 0,\n width: pageDimensions.width,\n height: pageDimensions.height\n });\n }\n\n // Save and download the PDF\n const bytes: Uint8Array = await pdf.save();\n this._triggerDownload(bytes, config.filename || 'document.pdf', config.openInNewTab);\n }\n\n private _triggerDownload(data: Uint8Array, filename: string, openInNewTab?: boolean): void {\n const blob = new Blob([data as BlobPart], { type: 'application/pdf' });\n const url: string = URL.createObjectURL(blob);\n\n if (openInNewTab) {\n window.open(url, '_blank');\n } else {\n const a: HTMLAnchorElement = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n }\n\n URL.revokeObjectURL(url);\n }\n\n private _widthPxToPt(px: number): number {\n return (px * 72) / 96;\n }\n\n private _heightPxToPt(px: number): number {\n return (px * 72) / 96;\n }\n\n /**\n * Get page dimensions based on page size and orientation\n */\n private _getPageDimensions(pageSize: string = 'A4', orientation: 'portrait' | 'landscape' = 'portrait'): PageDimensions {\n const pageDef = this.PAGE_SIZES[pageSize.toUpperCase()];\n if (!pageDef) {\n throw new Error(`Unsupported page size: ${pageSize}. Supported sizes: ${Object.keys(this.PAGE_SIZES).join(', ')}`);\n }\n\n if (orientation === 'landscape') {\n return {\n width: pageDef.height,\n height: pageDef.width\n };\n } else {\n return {\n width: pageDef.width,\n height: pageDef.height\n };\n }\n }\n\n /**\n * Get available page sizes\n */\n public getAvailablePageSizes(): string[] {\n return Object.keys(this.PAGE_SIZES);\n }\n\n /**\n * Calculate the scale factor to fit content width to page width\n */\n private _calculateScaleFactor(canvasWidth: number, pageWidth: number): number {\n const contentWidthInPoints = this._widthPxToPt(canvasWidth);\n return pageWidth / contentWidthInPoints;\n }\n\n /**\n * Calculate how many pages are needed for the given content height\n */\n private _calculateRequiredPages(canvasHeight: number, scaleFactor: number, pageHeight: number): number {\n const scaledHeightInPoints = this._heightPxToPt(canvasHeight) * scaleFactor;\n return Math.ceil(scaledHeightInPoints / pageHeight);\n }\n\n /**\n * Detect optimal content break points by analyzing element boundaries\n */\n private _detectContentBreakPoints(element: HTMLElement, canvas: HTMLCanvasElement, scaleFactor: number): ContentBreakPoint[] {\n const breakPoints: ContentBreakPoint[] = [];\n\n // Add start point\n breakPoints.push({ y: 0, priority: 10, elementType: 'start' });\n\n // Find elements with page-break CSS properties\n const sectionsElements = element.querySelectorAll('.pdf-section, section, .content-block, .blog-card, .feature-card');\n\n sectionsElements.forEach((el) => {\n const htmlEl = el as HTMLElement;\n const rect = htmlEl.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n // Calculate relative position to the exported element\n const relativeTop = rect.top - elementRect.top;\n const relativeBottom = rect.bottom - elementRect.top;\n\n // Convert to canvas coordinates\n const canvasTop = relativeTop * (canvas.height / element.scrollHeight);\n const canvasBottom = relativeBottom * (canvas.height / element.scrollHeight);\n\n // Check CSS page-break properties\n const computedStyle = window.getComputedStyle(htmlEl);\n const pageBreakBefore = computedStyle.getPropertyValue('page-break-before');\n const pageBreakAfter = computedStyle.getPropertyValue('page-break-after');\n const pageBreakInside = computedStyle.getPropertyValue('page-break-inside');\n\n // Add break point before element if requested\n if (pageBreakBefore === 'always' || pageBreakBefore === 'auto') {\n breakPoints.push({\n y: canvasTop,\n priority: pageBreakBefore === 'always' ? 9 : 7,\n elementType: htmlEl.className || htmlEl.tagName.toLowerCase()\n });\n }\n\n // Add break point after element if requested\n if (pageBreakAfter === 'always' || pageBreakAfter === 'auto') {\n breakPoints.push({\n y: canvasBottom,\n priority: pageBreakAfter === 'always' ? 9 : 7,\n elementType: htmlEl.className || htmlEl.tagName.toLowerCase()\n });\n }\n\n // If element should not be broken inside, add high-priority boundaries\n if (pageBreakInside === 'avoid') {\n breakPoints.push({\n y: canvasTop,\n priority: 8,\n elementType: `${htmlEl.className || htmlEl.tagName.toLowerCase()}-start`\n });\n breakPoints.push({\n y: canvasBottom,\n priority: 8,\n elementType: `${htmlEl.className || htmlEl.tagName.toLowerCase()}-end`\n });\n }\n });\n\n // Add end point\n breakPoints.push({ y: canvas.height, priority: 10, elementType: 'end' });\n\n // Sort by Y position\n breakPoints.sort((a, b) => a.y - b.y);\n\n // Remove duplicates and very close points\n const cleanedBreakPoints: ContentBreakPoint[] = [];\n for (let i = 0; i < breakPoints.length; i++) {\n const current = breakPoints[i];\n const lastAdded = cleanedBreakPoints[cleanedBreakPoints.length - 1];\n\n // Keep if it's the first point or far enough from the last point\n if (!lastAdded || Math.abs(current.y - lastAdded.y) > 20) {\n cleanedBreakPoints.push(current);\n } else if (current.priority > lastAdded.priority) {\n // Replace with higher priority point\n cleanedBreakPoints[cleanedBreakPoints.length - 1] = current;\n }\n }\n\n return cleanedBreakPoints;\n }\n\n /**\n * Calculate smart page breaks that respect content boundaries\n */\n private _calculateSmartPageBreaks(canvasHeight: number, scaleFactor: number, pageHeight: number, breakPoints: ContentBreakPoint[]): number[] {\n const pageHeightPx = (pageHeight * 96) / 72 / scaleFactor;\n const pageBreaks: number[] = [];\n\n let currentPageStart = 0;\n pageBreaks.push(currentPageStart);\n\n while (currentPageStart < canvasHeight) {\n const idealPageEnd = currentPageStart + pageHeightPx;\n\n if (idealPageEnd >= canvasHeight) {\n // Last page\n break;\n }\n\n // Find the best break point near the ideal page end\n let bestBreakPoint = idealPageEnd;\n let bestPriority = 0;\n\n // Look for break points within a reasonable range of the ideal end\n const searchRange = pageHeightPx * 0.2; // 20% of page height\n const searchStart = Math.max(currentPageStart + pageHeightPx * 0.5, idealPageEnd - searchRange);\n const searchEnd = idealPageEnd + searchRange;\n\n for (const breakPoint of breakPoints) {\n if (breakPoint.y >= searchStart && breakPoint.y <= searchEnd && breakPoint.y > currentPageStart) {\n if (breakPoint.priority > bestPriority) {\n bestBreakPoint = breakPoint.y;\n bestPriority = breakPoint.priority;\n }\n }\n }\n\n // If no good break point found, use the ideal position\n if (bestPriority === 0) {\n bestBreakPoint = idealPageEnd;\n }\n\n currentPageStart = bestBreakPoint;\n pageBreaks.push(currentPageStart);\n }\n\n return pageBreaks;\n }\n\n /**\n * Create a canvas section for a specific page with smart boundaries\n */\n private _createSmartPageCanvas(\n sourceCanvas: HTMLCanvasElement,\n pageStartY: number,\n pageEndY: number | undefined,\n scaleFactor: number,\n pageDimensions: PageDimensions\n ): HTMLCanvasElement {\n const pageCanvas = document.createElement('canvas');\n const ctx = pageCanvas.getContext('2d')!;\n\n // Page dimensions in pixels (at 96 DPI)\n const pageWidthPx = (pageDimensions.width * 96) / 72;\n const pageHeightPx = (pageDimensions.height * 96) / 72;\n\n pageCanvas.width = pageWidthPx;\n pageCanvas.height = pageHeightPx;\n\n // Fill with white background\n ctx.fillStyle = 'white';\n ctx.fillRect(0, 0, pageCanvas.width, pageCanvas.height);\n\n // Calculate source height for this page\n const sourceHeight = pageEndY ? (pageEndY - pageStartY) : (sourceCanvas.height - pageStartY);\n\n if (sourceHeight > 0) {\n // Draw the source canvas section onto the page canvas with scaling\n ctx.drawImage(\n sourceCanvas,\n 0, pageStartY, sourceCanvas.width, sourceHeight, // source (x, y, width, height)\n 0, 0, pageWidthPx, sourceHeight * scaleFactor // destination (x, y, width, height)\n );\n }\n\n return pageCanvas;\n }\n\n /**\n * Create a canvas section for a specific page\n */\n private _createPageCanvas(sourceCanvas: HTMLCanvasElement, pageIndex: number, scaleFactor: number, pageDimensions: PageDimensions): HTMLCanvasElement {\n const pageCanvas = document.createElement('canvas');\n const ctx = pageCanvas.getContext('2d')!;\n\n // Page dimensions in pixels (at 96 DPI)\n const pageWidthPx = (pageDimensions.width * 96) / 72;\n const pageHeightPx = (pageDimensions.height * 96) / 72;\n\n pageCanvas.width = pageWidthPx;\n pageCanvas.height = pageHeightPx;\n\n // Fill with white background\n ctx.fillStyle = 'white';\n ctx.fillRect(0, 0, pageCanvas.width, pageCanvas.height);\n\n // Calculate the height of content that fits on one page in source canvas pixels\n const contentHeightPerPage = pageHeightPx / scaleFactor;\n\n // Calculate source coordinates for this page\n const sourceY = pageIndex * contentHeightPerPage;\n const sourceHeight = Math.min(contentHeightPerPage, sourceCanvas.height - sourceY);\n\n if (sourceHeight > 0) {\n // Draw the source canvas section onto the page canvas with scaling\n ctx.drawImage(\n sourceCanvas,\n 0, sourceY, sourceCanvas.width, sourceHeight, // source (x, y, width, height)\n 0, 0, pageWidthPx, sourceHeight * scaleFactor // destination (x, y, width, height)\n );\n }\n\n return pageCanvas;\n }\n}\n","// pdf-export.directive.ts\nimport {Directive, ElementRef, HostListener, Input} from '@angular/core';\nimport { PdfExportService } from '../services/pdf-export.service';\nimport {PdfExportConfig, PageSize, PageOrientation} from '../tokens/pdf-export-config.token';\n\n@Directive({\n selector: '[rmPdfExport]',\n standalone: true,\n})\n\nexport class PdfExportDirective {\n // Individual configuration inputs\n @Input() pageSize?: PageSize;\n @Input() orientation?: PageOrientation;\n @Input() filename?: string;\n @Input() openInNewTab?: boolean;\n\n // Full configuration object input (takes precedence)\n @Input() pdfConfig?: PdfExportConfig;\n\n constructor(private readonly el: ElementRef, private readonly svc: PdfExportService) {}\n\n @HostListener('click')\n async onClick(): Promise<void> {\n // Build configuration from individual inputs or use provided config\n const config: PdfExportConfig = this.pdfConfig || {\n pageSize: this.pageSize,\n orientation: this.orientation,\n filename: this.filename,\n openInNewTab: this.openInNewTab\n };\n\n await this.svc.exportHtml(this.el.nativeElement, config);\n }\n}\n","// pdf-export.component.ts\nimport { Component, ContentChild, ElementRef, Input } from '@angular/core';\nimport { PdfExportService } from '../services/pdf-export.service';\nimport { PdfExportConfig, PageSize, PageOrientation } from '../tokens/pdf-export-config.token';\n\n@Component({\n selector: 'rm-pdf-export',\n template: `<ng-content></ng-content><button (click)=\"export()\">Export PDF</button>`\n})\nexport class PdfExportComponent {\n @ContentChild('pdfContent', { read: ElementRef, static: true }) content!: ElementRef;\n\n // Individual configuration inputs\n @Input() pageSize?: PageSize;\n @Input() orientation?: PageOrientation;\n @Input() filename?: string;\n @Input() openInNewTab?: boolean;\n\n // Full configuration object input (takes precedence)\n @Input() pdfConfig?: PdfExportConfig;\n\n constructor(private readonly svc: PdfExportService) {}\n\n async export(): Promise<void> {\n // Build configuration from individual inputs or use provided config\n const config: PdfExportConfig = this.pdfConfig || {\n pageSize: this.pageSize,\n orientation: this.orientation,\n filename: this.filename,\n openInNewTab: this.openInNewTab\n };\n\n await this.svc.exportHtml(this.content.nativeElement, config);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.PdfExportService"],"mappings":"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"}