{"version":3,"file":"codewithrajat-rm-ng-structure-pdf.mjs","sources":["../../../projects/rm-ng-structure-pdf/src/lib/pdf-service.ts","../../../projects/rm-ng-structure-pdf/src/public-api.ts","../../../projects/rm-ng-structure-pdf/src/codewithrajat-rm-ng-structure-pdf.ts"],"sourcesContent":["\r\nimport { Injectable } from '@angular/core';\r\nimport { jsPDF } from 'jspdf';\r\nimport html2canvas from 'html2canvas';\r\nimport { PdfOptions } from './pdf-options.types';\r\n\r\nconst PAGE_SIZES: Record<string, { width: number, height: number }> = {\r\n  a4: { width: 595.28, height: 841.89 },\r\n  letter: { width: 612, height: 792 },\r\n  legal: { width: 612, height: 1008 },\r\n};\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class PdfService {\r\n\r\n  async generatePaginatedPdf(element: HTMLElement, options: PdfOptions): Promise<void> {\r\n    // Ensure fonts are loaded before generating the PDF\r\n    await document.fonts.ready;\r\n\r\n    const { pageSize, orientation, fileName, author, title } = options;\r\n\r\n    // 1. CLONE THE ELEMENT AND EMBED STYLES\r\n    const clonedElement = this.cloneAndStyleElement(element);\r\n    document.body.appendChild(clonedElement);\r\n\r\n    try {\r\n      const pageDimensions = PAGE_SIZES[pageSize];\r\n      const pdf = new jsPDF({\r\n        orientation,\r\n        unit: 'pt',\r\n        format: pageSize,\r\n      });\r\n      const pdfWidth = orientation === 'landscape' ? pageDimensions.height : pageDimensions.width;\r\n      const pdfHeight = orientation === 'landscape' ? pageDimensions.width : pageDimensions.height;\r\n\r\n      // 2. RENDER THE CLONED, FULLY-STYLED ELEMENT\r\n      const canvas = await html2canvas(clonedElement, {\r\n        scale: 2,\r\n        useCORS: true,\r\n        logging: false,\r\n        width: clonedElement.scrollWidth,\r\n        height: clonedElement.scrollHeight,\r\n        windowWidth: clonedElement.scrollWidth,\r\n        windowHeight: clonedElement.scrollHeight,\r\n      });\r\n\r\n      const imgData = canvas.toDataURL('image/png');\r\n      const imgWidth = pdfWidth;\r\n      const imgHeight = (canvas.height * imgWidth) / canvas.width;\r\n\r\n      let position = 0;\r\n      let pageCount = 0;\r\n\r\n      // 3. PAGINATE THE RESULTING IMAGE\r\n      while (position < imgHeight) {\r\n        pageCount++;\r\n        if (pageCount > 1) {\r\n          pdf.addPage();\r\n        }\r\n\r\n        const sliceHeight = Math.min(pdfHeight, imgHeight - position);\r\n        pdf.addImage(imgData, 'PNG', 0, -position, imgWidth, imgHeight);\r\n        position += sliceHeight;\r\n      }\r\n\r\n      pdf.setProperties({ title, author });\r\n      pdf.save(fileName);\r\n\r\n    } catch (error) {\r\n      console.error(\"Error generating the paginated PDF:\", error);\r\n    } finally {\r\n      // 4. CLEANUP: Remove the cloned element from the DOM\r\n      document.body.removeChild(clonedElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Clones the target element and embeds all document stylesheets into it.\r\n   * This ensures html2canvas renders with all styles applied.\r\n   */\r\n  private cloneAndStyleElement(element: HTMLElement): HTMLElement {\r\n    const clonedElement = element.cloneNode(true) as HTMLElement;\r\n\r\n    // Create a style element\r\n    const style = document.createElement('style');\r\n    let css = '';\r\n\r\n    // Iterate through all stylesheets in the document\r\n    for (const sheet of Array.from(document.styleSheets)) {\r\n      try {\r\n        if (sheet.cssRules) {\r\n          for (const rule of Array.from(sheet.cssRules)) {\r\n            css += rule.cssText;\r\n          }\r\n        }\r\n      } catch (e) {\r\n        console.warn('Could not read stylesheet rules:', e);\r\n      }\r\n    }\r\n\r\n    style.textContent = css;\r\n    clonedElement.appendChild(style);\r\n\r\n    // Apply inline styles to the clone for absolute positioning off-screen\r\n    clonedElement.style.position = 'absolute';\r\n    clonedElement.style.left = '-9999px';\r\n    clonedElement.style.top = '0px';\r\n    clonedElement.style.width = `${element.offsetWidth}px`;\r\n\r\n    return clonedElement;\r\n  }\r\n}\r\n","/*\r\n * Public API Surface of rm-ng-structure-pdf\r\n */\r\n\r\nexport * from './lib/pdf-service';\r\nexport * from './lib/pdf-options.types';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}