{"version":3,"file":"ngx-word-viewer.mjs","sources":["../../../projects/ngx-word-viewer/src/lib/word-viewer/word-viewer.component.ts","../../../projects/ngx-word-viewer/src/lib/ngx-word-viewer.module.ts","../../../projects/ngx-word-viewer/src/public-api.ts","../../../projects/ngx-word-viewer/src/ngx-word-viewer.ts"],"sourcesContent":["import { Component, Input, OnChanges, SimpleChanges, ViewChild, ElementRef, Output, EventEmitter, ViewEncapsulation, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n// Mammoth ko any type se import karo\r\nlet mammothConverter: any;\r\n\r\n@Component({\r\n  selector: 'ngx-word-viewer',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  template: `\r\n    <div class=\"word-viewer-container\">\r\n      <!-- Toolbar -->\r\n      <div class=\"word-viewer-toolbar\" *ngIf=\"showToolbar\">\r\n        <button (click)=\"previousPage()\" [disabled]=\"currentPage === 1\" class=\"toolbar-btn\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n            <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\r\n          </svg>\r\n          Previous\r\n        </button>\r\n        \r\n        <div class=\"page-navigation\">\r\n          <input \r\n            type=\"number\" \r\n            [value]=\"currentPage\" \r\n            (change)=\"goToPage($event)\"\r\n            [min]=\"1\" \r\n            [max]=\"totalPages\"\r\n            class=\"page-input\"\r\n          >\r\n          <span class=\"page-info\">/ {{ totalPages }}</span>\r\n        </div>\r\n        \r\n        <button (click)=\"nextPage()\" [disabled]=\"currentPage === totalPages\" class=\"toolbar-btn\">\r\n          Next\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n            <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>\r\n          </svg>\r\n        </button>\r\n\r\n        <div class=\"separator\"></div>\r\n\r\n        <button (click)=\"zoomOut()\" class=\"toolbar-btn zoom-btn\" title=\"Zoom Out\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n            <path d=\"M19 13H5v-2h14v2z\"/>\r\n          </svg>\r\n        </button>\r\n        \r\n        <select [(ngModel)]=\"zoom\" (change)=\"onZoomChange()\" class=\"zoom-select\">\r\n          <option [value]=\"0.5\">50%</option>\r\n          <option [value]=\"0.75\">75%</option>\r\n          <option [value]=\"1\">100%</option>\r\n          <option [value]=\"1.25\">125%</option>\r\n          <option [value]=\"1.5\">150%</option>\r\n          <option [value]=\"2\">200%</option>\r\n        </select>\r\n        \r\n        <button (click)=\"zoomIn()\" class=\"toolbar-btn zoom-btn\" title=\"Zoom In\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n            <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\r\n          </svg>\r\n        </button>\r\n\r\n        <button (click)=\"fitToWidth()\" class=\"toolbar-btn\" title=\"Fit to Width\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n            <path d=\"M4 5v14h16V5H4zm14 12H6V7h12v10z\"/>\r\n          </svg>\r\n          Fit Width\r\n        </button>\r\n\r\n       \r\n\r\n       \r\n      </div>\r\n\r\n      <!-- Loading Spinner -->\r\n      <div *ngIf=\"isLoading\" class=\"loading-container\">\r\n        <div class=\"loading-spinner\">\r\n          <div class=\"spinner\"></div>\r\n          <p>Loading document...</p>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Error Message -->\r\n      <div *ngIf=\"errorMessage && !isLoading\" class=\"error-container\">\r\n        <div class=\"error-message\">\r\n          <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"#dc3545\">\r\n            <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>\r\n          </svg>\r\n          <h3>Error Loading Document</h3>\r\n          <p>{{ errorMessage }}</p>\r\n          <button *ngIf=\"errorMessage.includes('Mammoth')\" (click)=\"loadMammothAndRetry()\" class=\"retry-btn\">\r\n            Load from CDN and Retry\r\n          </button>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Document Viewer Area -->\r\n      <div class=\"document-viewer-area\" *ngIf=\"!isLoading && !errorMessage\">\r\n        <div class=\"pages-container\" [style.transform]=\"'scale(' + zoom + ')'\">\r\n          <!-- A4 Page -->\r\n          <div class=\"a4-page\" *ngIf=\"currentPageContent\">\r\n            <div class=\"page-header\" *ngIf=\"showPageHeader\">\r\n              <span>{{ fileName }}</span>\r\n              <span>Page {{ currentPage }} of {{ totalPages }}</span>\r\n            </div>\r\n            \r\n            <div \r\n              class=\"page-content\" \r\n              [innerHTML]=\"currentPageContent\">\r\n            </div>\r\n            \r\n            <div class=\"page-footer\" *ngIf=\"showPageFooter\">\r\n              <span>{{ currentPage }}</span>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  `,\r\n  styles: [`\r\n    * {\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    .word-viewer-container {\r\n      width: 100%;\r\n      height: 100%;\r\n      display: flex;\r\n      flex-direction: column;\r\n      background: #e5e5e5;\r\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n      position: relative;\r\n    }\r\n\r\n    .word-viewer-toolbar {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 8px 16px;\r\n      background: #2c3e50;\r\n      border-bottom: 1px solid #1a252f;\r\n      box-shadow: 0 2px 4px rgba(0,0,0,0.1);\r\n      z-index: 100;\r\n    }\r\n\r\n    .toolbar-btn {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 4px;\r\n      padding: 6px 12px;\r\n      background: transparent;\r\n      color: white;\r\n      border: 1px solid rgba(255,255,255,0.2);\r\n      border-radius: 4px;\r\n      cursor: pointer;\r\n      transition: all 0.2s;\r\n      font-size: 13px;\r\n      font-weight: 500;\r\n    }\r\n\r\n    .toolbar-btn:hover:not(:disabled) {\r\n      background: rgba(255,255,255,0.1);\r\n      border-color: rgba(255,255,255,0.3);\r\n    }\r\n\r\n    .toolbar-btn:disabled {\r\n      opacity: 0.5;\r\n      cursor: not-allowed;\r\n    }\r\n\r\n    .zoom-btn {\r\n      padding: 6px 8px;\r\n    }\r\n\r\n    .page-navigation {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 0 12px;\r\n    }\r\n\r\n    .page-input {\r\n      width: 50px;\r\n      padding: 4px 8px;\r\n      border: 1px solid rgba(255,255,255,0.2);\r\n      border-radius: 4px;\r\n      background: rgba(255,255,255,0.1);\r\n      color: white;\r\n      text-align: center;\r\n      font-size: 13px;\r\n    }\r\n\r\n    .page-info {\r\n      color: rgba(255,255,255,0.8);\r\n      font-size: 13px;\r\n    }\r\n\r\n    .zoom-select {\r\n      padding: 4px 8px;\r\n      border: 1px solid rgba(255,255,255,0.2);\r\n      border-radius: 4px;\r\n      background: rgba(255,255,255,0.1);\r\n      color: white;\r\n      font-size: 13px;\r\n      cursor: pointer;\r\n    }\r\n\r\n    .zoom-select option {\r\n      background: #2c3e50;\r\n    }\r\n\r\n    .separator {\r\n      width: 1px;\r\n      height: 24px;\r\n      background: rgba(255,255,255,0.2);\r\n      margin: 0 8px;\r\n    }\r\n\r\n    .loading-container {\r\n      flex: 1;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n    }\r\n\r\n    .loading-spinner {\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      gap: 16px;\r\n    }\r\n\r\n    .spinner {\r\n      border: 3px solid #f3f3f3;\r\n      border-top: 3px solid #2c3e50;\r\n      border-radius: 50%;\r\n      width: 40px;\r\n      height: 40px;\r\n      animation: spin 1s linear infinite;\r\n    }\r\n\r\n    @keyframes spin {\r\n      0% { transform: rotate(0deg); }\r\n      100% { transform: rotate(360deg); }\r\n    }\r\n\r\n    .error-container {\r\n      flex: 1;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      padding: 20px;\r\n    }\r\n\r\n    .error-message {\r\n      text-align: center;\r\n      padding: 40px;\r\n      background: white;\r\n      border-radius: 8px;\r\n      box-shadow: 0 2px 10px rgba(0,0,0,0.1);\r\n      max-width: 400px;\r\n    }\r\n\r\n    .error-message h3 {\r\n      color: #dc3545;\r\n      margin: 16px 0 8px;\r\n    }\r\n\r\n    .retry-btn {\r\n      margin-top: 20px;\r\n      padding: 10px 20px;\r\n      background: #007bff;\r\n      color: white;\r\n      border: none;\r\n      border-radius: 4px;\r\n      cursor: pointer;\r\n    }\r\n\r\n    .retry-btn:hover {\r\n      background: #0056b3;\r\n    }\r\n\r\n    .document-viewer-area {\r\n      flex: 1;\r\n      overflow: auto;\r\n      display: flex;\r\n      justify-content: center;\r\n      padding: 20px;\r\n      background: #e5e5e5;\r\n    }\r\n\r\n    .pages-container {\r\n      transform-origin: top center;\r\n      transition: transform 0.2s ease;\r\n    }\r\n\r\n    .a4-page {\r\n      width: 794px;\r\n      min-height: 1123px;\r\n      background: white;\r\n      box-shadow: 0 0 20px rgba(0,0,0,0.1);\r\n      margin: 0 auto;\r\n      position: relative;\r\n      display: flex;\r\n      flex-direction: column;\r\n    }\r\n\r\n    .page-header {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      padding: 20px 40px 10px;\r\n      font-size: 11px;\r\n      color: #666;\r\n      border-bottom: 1px solid #e0e0e0;\r\n    }\r\n\r\n    .page-content {\r\n      flex: 1;\r\n      padding: 40px 60px;\r\n      font-size: 12pt;\r\n      line-height: 1.6;\r\n      color: #333;\r\n      overflow: hidden;\r\n      word-wrap: break-word;\r\n      overflow-wrap: break-word;\r\n    }\r\n\r\n    .page-footer {\r\n      padding: 10px 40px 20px;\r\n      text-align: center;\r\n      font-size: 11px;\r\n      color: #666;\r\n      border-top: 1px solid #e0e0e0;\r\n    }\r\n\r\n    /* Content Styles with Fixed Image Handling */\r\n    .page-content h1 { \r\n      font-size: 24pt; \r\n      margin: 0 0 12pt 0;\r\n      color: #2c3e50;\r\n      font-weight: bold;\r\n      page-break-after: avoid;\r\n    }\r\n    \r\n    .page-content h2 { \r\n      font-size: 18pt; \r\n      margin: 12pt 0 10pt 0;\r\n      color: #34495e;\r\n      font-weight: bold;\r\n      page-break-after: avoid;\r\n    }\r\n\r\n    .page-content h3 { \r\n      font-size: 14pt; \r\n      margin: 10pt 0 8pt 0;\r\n      color: #34495e;\r\n      font-weight: bold;\r\n      page-break-after: avoid;\r\n    }\r\n\r\n    .page-content p { \r\n      margin: 0 0 10pt 0; \r\n      text-align: justify;\r\n      page-break-inside: avoid;\r\n    }\r\n\r\n    .page-content ul, .page-content ol { \r\n      margin: 10pt 0; \r\n      padding-left: 30pt;\r\n      page-break-inside: avoid;\r\n    }\r\n\r\n    .page-content li {\r\n      margin: 5pt 0;\r\n    }\r\n\r\n    .page-content table { \r\n      border-collapse: collapse; \r\n      width: 100%; \r\n      margin: 12pt 0;\r\n      page-break-inside: avoid;\r\n    }\r\n\r\n    .page-content th, .page-content td { \r\n      border: 1px solid #ddd; \r\n      padding: 8pt; \r\n      text-align: left; \r\n    }\r\n\r\n    .page-content th { \r\n      background-color: #f8f9fa;\r\n      font-weight: bold;\r\n    }\r\n\r\n    /* IMPORTANT: Image handling styles */\r\n    .page-content img { \r\n      max-width: 100% !important;\r\n      width: auto !important;\r\n      height: auto !important;\r\n      max-height: 600px !important;\r\n      display: block;\r\n      margin: 12pt auto;\r\n      object-fit: contain;\r\n      page-break-inside: avoid;\r\n      box-shadow: 0 2px 8px rgba(0,0,0,0.1);\r\n      border-radius: 4px;\r\n    }\r\n\r\n    /* Handle inline images */\r\n    .page-content p img {\r\n      display: inline-block;\r\n      vertical-align: middle;\r\n      margin: 4pt;\r\n      max-height: 400px !important;\r\n    }\r\n\r\n    /* Prevent image overflow */\r\n    .page-content > * {\r\n      max-width: 100%;\r\n      overflow: hidden;\r\n    }\r\n\r\n    .page-content blockquote {\r\n      border-left: 4px solid #ddd;\r\n      padding-left: 16pt;\r\n      margin: 12pt 0;\r\n      color: #666;\r\n      font-style: italic;\r\n      page-break-inside: avoid;\r\n    }\r\n\r\n    @media (max-width: 900px) {\r\n      .a4-page {\r\n        width: 100%;\r\n        min-height: auto;\r\n      }\r\n\r\n      .page-content {\r\n        padding: 20px;\r\n      }\r\n      \r\n      .page-content img {\r\n        max-width: 100% !important;\r\n        max-height: 400px !important;\r\n      }\r\n    }\r\n\r\n    @media print {\r\n      .word-viewer-toolbar {\r\n        display: none !important;\r\n      }\r\n\r\n      .document-viewer-area {\r\n        padding: 0;\r\n        background: white;\r\n      }\r\n\r\n      .a4-page {\r\n        box-shadow: none;\r\n        page-break-after: always;\r\n        margin: 0;\r\n      }\r\n\r\n      .page-header, .page-footer {\r\n        display: none;\r\n      }\r\n      \r\n      .page-content img {\r\n        max-width: 100% !important;\r\n        page-break-inside: avoid !important;\r\n      }\r\n    }\r\n  `],\r\n  encapsulation: ViewEncapsulation.None\r\n})\r\nexport class WordViewerComponent implements OnChanges {\r\n  @ViewChild('documentContainer') documentContainer!: ElementRef;\r\n  \r\n  @Input() src: string | ArrayBuffer | File | null = null;\r\n  @Input() showToolbar: boolean = true;\r\n  @Input() showPageHeader: boolean = false;\r\n  @Input() showPageFooter: boolean = true;\r\n  @Input() fileName: string = 'Document';\r\n  @Input() initialZoom: number = 1;\r\n  @Input() pageHeight: number = 1000;\r\n  \r\n  @Output() onDocumentLoad = new EventEmitter<any>();\r\n  @Output() onError = new EventEmitter<string>();\r\n  @Output() pageChange = new EventEmitter<number>();\r\n\r\n  fullContent: string = '';\r\n  pages: string[] = [];\r\n  currentPage: number = 1;\r\n  totalPages: number = 0;\r\n  currentPageContent: string = '';\r\n  zoom: number = 1;\r\n  isLoading: boolean = false;\r\n  errorMessage: string = '';\r\n  private pendingSrc: any = null;\r\n\r\n  private readonly A4_WIDTH_PX = 794;\r\n  private readonly A4_HEIGHT_PX = 1123;\r\n  private readonly MAX_IMAGE_WIDTH = 650; // Page content width minus padding\r\n\r\n  constructor(@Inject(PLATFORM_ID) private platformId: Object) {\r\n    if (isPlatformBrowser(this.platformId)) {\r\n      this.initializeMammoth();\r\n    }\r\n  }\r\n\r\n  private async initializeMammoth() {\r\n    if ((window as any).mammoth) {\r\n      mammothConverter = (window as any).mammoth;\r\n      return;\r\n    }\r\n\r\n    try {\r\n      const mammothModule = await import('mammoth' as any);\r\n      mammothConverter = mammothModule.default || mammothModule;\r\n    } catch (e) {\r\n      console.log('Mammoth not found in node_modules, will load from CDN when needed');\r\n    }\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['src'] && this.src) {\r\n      this.loadDocument();\r\n    }\r\n    if (changes['initialZoom']) {\r\n      this.zoom = this.initialZoom;\r\n    }\r\n  }\r\n\r\n  async loadMammothAndRetry(): Promise<void> {\r\n    this.errorMessage = '';\r\n    this.isLoading = true;\r\n    \r\n    try {\r\n      await this.loadMammothFromCDN();\r\n      if (this.pendingSrc || this.src) {\r\n        await this.loadDocument();\r\n      }\r\n    } catch (error) {\r\n      this.errorMessage = 'Failed to load converter library from CDN';\r\n      this.isLoading = false;\r\n    }\r\n  }\r\n\r\n  private loadMammothFromCDN(): Promise<void> {\r\n    return new Promise((resolve, reject) => {\r\n      if ((window as any).mammoth) {\r\n        mammothConverter = (window as any).mammoth;\r\n        resolve();\r\n        return;\r\n      }\r\n\r\n      const script = document.createElement('script');\r\n      script.src = 'https://cdn.jsdelivr.net/npm/mammoth@1.6.0/mammoth.browser.min.js';\r\n      script.onload = () => {\r\n        mammothConverter = (window as any).mammoth;\r\n        resolve();\r\n      };\r\n      script.onerror = () => reject(new Error('Failed to load mammoth from CDN'));\r\n      document.head.appendChild(script);\r\n    });\r\n  }\r\n\r\n  async loadDocument(): Promise<void> {\r\n    if (!isPlatformBrowser(this.platformId)) {\r\n      return;\r\n    }\r\n\r\n    this.isLoading = true;\r\n    this.errorMessage = '';\r\n    this.pages = [];\r\n    this.currentPageContent = '';\r\n    this.pendingSrc = this.src;\r\n    \r\n    try {\r\n      if (!mammothConverter) {\r\n        await this.loadMammothFromCDN();\r\n      }\r\n\r\n      if (!mammothConverter) {\r\n        throw new Error('Mammoth library could not be loaded. Click retry to load from CDN.');\r\n      }\r\n\r\n      let arrayBuffer: ArrayBuffer;\r\n      \r\n      if (this.src instanceof File) {\r\n        this.fileName = this.src.name.replace('.docx', '');\r\n        arrayBuffer = await this.fileToArrayBuffer(this.src);\r\n      } else if (this.src instanceof ArrayBuffer) {\r\n        arrayBuffer = this.src;\r\n      } else if (typeof this.src === 'string') {\r\n        if (this.src.startsWith('data:')) {\r\n          arrayBuffer = this.base64ToArrayBuffer(this.src);\r\n        } else {\r\n          const urlParts = this.src.split('/');\r\n          this.fileName = urlParts[urlParts.length - 1].replace('.docx', '');\r\n          arrayBuffer = await this.fetchDocument(this.src);\r\n        }\r\n      } else {\r\n        throw new Error('Invalid source type');\r\n      }\r\n\r\n      const options: any = { \r\n        arrayBuffer: arrayBuffer,\r\n        // Add custom style map for better formatting\r\n        styleMap: [\r\n          \"p[style-name='Title'] => h1:fresh\",\r\n          \"p[style-name='Heading 1'] => h1:fresh\",\r\n          \"p[style-name='Heading 2'] => h2:fresh\",\r\n          \"p[style-name='Heading 3'] => h3:fresh\"\r\n        ],\r\n        includeDefaultStyleMap: true\r\n      };\r\n\r\n      // Handle images with better conversion\r\n      if (mammothConverter.images && mammothConverter.images.imgElement) {\r\n        options.convertImage = mammothConverter.images.imgElement((image: any) => {\r\n          return image.read(\"base64\").then((imageBuffer: string) => {\r\n            // Get image dimensions if available\r\n            const width = image.width || 'auto';\r\n            const height = image.height || 'auto';\r\n            \r\n            return {\r\n              src: \"data:\" + image.contentType + \";base64,\" + imageBuffer,\r\n              style: `max-width: 100%; width: ${width}px; height: auto;`\r\n            };\r\n          });\r\n        });\r\n      }\r\n\r\n      const result = await mammothConverter.convertToHtml(options);\r\n      \r\n      // Process and fix images in the HTML\r\n      this.fullContent = this.processImages(this.enhanceHtmlContent(result.value));\r\n      this.processContentIntoPages();\r\n      this.onDocumentLoad.emit({ \r\n        content: this.fullContent, \r\n        messages: result.messages,\r\n        totalPages: this.totalPages \r\n      });\r\n      \r\n      this.pendingSrc = null;\r\n      \r\n    } catch (error: any) {\r\n      this.errorMessage = error.message || 'Failed to load document';\r\n      this.onError.emit(this.errorMessage);\r\n    } finally {\r\n      this.isLoading = false;\r\n    }\r\n  }\r\n\r\n  private processImages(html: string): string {\r\n    // Process images to ensure they fit within page bounds\r\n    const tempDiv = document.createElement('div');\r\n    tempDiv.innerHTML = html;\r\n    \r\n    // Find all images and set max dimensions\r\n    const images = tempDiv.querySelectorAll('img');\r\n    images.forEach((img: HTMLImageElement) => {\r\n      // Remove any width/height attributes that might cause overflow\r\n      img.removeAttribute('width');\r\n      img.removeAttribute('height');\r\n      \r\n      // Add style to ensure image fits\r\n      const currentStyle = img.getAttribute('style') || '';\r\n      img.setAttribute('style', `${currentStyle}; max-width: 100% !important; height: auto !important; display: block; margin: 10px auto;`);\r\n      \r\n      // Add a wrapper div for better control\r\n      const wrapper = document.createElement('div');\r\n      wrapper.style.cssText = 'text-align: center; margin: 15px 0; page-break-inside: avoid;';\r\n      img.parentNode?.insertBefore(wrapper, img);\r\n      wrapper.appendChild(img);\r\n    });\r\n    \r\n    return tempDiv.innerHTML;\r\n  }\r\n\r\n  private enhanceHtmlContent(html: string): string {\r\n    let enhancedHtml = html;\r\n    \r\n    // Convert strong paragraphs to headings\r\n    enhancedHtml = enhancedHtml.replace(\r\n      /<p><strong>([^<]{1,100})<\\/strong><\\/p>/gi,\r\n      (match, p1) => {\r\n        if (p1.length < 100 && (p1 === p1.toUpperCase() || /^[A-Z]/.test(p1))) {\r\n          return `<h2>${p1}</h2>`;\r\n        }\r\n        return match;\r\n      }\r\n    );\r\n\r\n    // Fix table formatting\r\n    enhancedHtml = enhancedHtml.replace(/<table>/g, '<table style=\"width: 100%; margin: 15px 0;\">');\r\n    \r\n    return enhancedHtml;\r\n  }\r\n\r\n  private processContentIntoPages(): void {\r\n    const tempContainer = document.createElement('div');\r\n    tempContainer.style.position = 'absolute';\r\n    tempContainer.style.visibility = 'hidden';\r\n    tempContainer.style.width = `${this.A4_WIDTH_PX - 120}px`;\r\n    tempContainer.style.padding = '40px 60px';\r\n    tempContainer.style.fontSize = '12pt';\r\n    tempContainer.style.lineHeight = '1.6';\r\n    tempContainer.innerHTML = this.fullContent;\r\n    document.body.appendChild(tempContainer);\r\n\r\n    const elements = Array.from(tempContainer.children);\r\n    this.pages = [];\r\n    let currentPageHtml = '';\r\n    let currentHeight = 0;\r\n    const effectivePageHeight = this.pageHeight - 100; // Leave some margin\r\n\r\n    elements.forEach((element: any) => {\r\n      const elementHeight = element.getBoundingClientRect().height;\r\n      \r\n      // Special handling for images\r\n      if (element.tagName === 'IMG' || element.querySelector('img')) {\r\n        const img = element.tagName === 'IMG' ? element : element.querySelector('img');\r\n        if (img) {\r\n          // If image is too tall for remaining space, start new page\r\n          if (currentHeight + elementHeight > effectivePageHeight && currentPageHtml) {\r\n            this.pages.push(currentPageHtml);\r\n            currentPageHtml = element.outerHTML;\r\n            currentHeight = elementHeight;\r\n          } else {\r\n            currentPageHtml += element.outerHTML;\r\n            currentHeight += elementHeight;\r\n          }\r\n        }\r\n      } else {\r\n        // Regular content\r\n        if (currentHeight + elementHeight > effectivePageHeight && currentPageHtml) {\r\n          this.pages.push(currentPageHtml);\r\n          currentPageHtml = element.outerHTML;\r\n          currentHeight = elementHeight;\r\n        } else {\r\n          currentPageHtml += element.outerHTML;\r\n          currentHeight += elementHeight;\r\n        }\r\n      }\r\n    });\r\n\r\n    if (currentPageHtml) {\r\n      this.pages.push(currentPageHtml);\r\n    }\r\n\r\n    document.body.removeChild(tempContainer);\r\n\r\n    if (this.pages.length === 0) {\r\n      this.pages = [this.fullContent || '<p>Empty document</p>'];\r\n    }\r\n\r\n    this.totalPages = this.pages.length;\r\n    this.currentPage = 1;\r\n    this.displayPage(1);\r\n  }\r\n\r\n  private displayPage(pageNumber: number): void {\r\n    if (pageNumber >= 1 && pageNumber <= this.totalPages) {\r\n      this.currentPage = pageNumber;\r\n      this.currentPageContent = this.pages[pageNumber - 1];\r\n      this.pageChange.emit(this.currentPage);\r\n    }\r\n  }\r\n\r\n  goToPage(event: any): void {\r\n    const pageNumber = parseInt(event.target.value, 10);\r\n    if (!isNaN(pageNumber) && pageNumber >= 1 && pageNumber <= this.totalPages) {\r\n      this.displayPage(pageNumber);\r\n    }\r\n  }\r\n\r\n  nextPage(): void {\r\n    if (this.currentPage < this.totalPages) {\r\n      this.displayPage(this.currentPage + 1);\r\n    }\r\n  }\r\n\r\n  previousPage(): void {\r\n    if (this.currentPage > 1) {\r\n      this.displayPage(this.currentPage - 1);\r\n    }\r\n  }\r\n\r\n  onZoomChange(): void {}\r\n\r\n  zoomIn(): void {\r\n    this.zoom = Math.min(this.zoom + 0.25, 3);\r\n  }\r\n\r\n  zoomOut(): void {\r\n    this.zoom = Math.max(this.zoom - 0.25, 0.5);\r\n  }\r\n\r\n  fitToWidth(): void {\r\n    const viewerArea = document.querySelector('.document-viewer-area');\r\n    if (viewerArea) {\r\n      const viewerWidth = viewerArea.clientWidth - 40;\r\n      this.zoom = viewerWidth / this.A4_WIDTH_PX;\r\n      this.zoom = Math.min(Math.max(this.zoom, 0.5), 2);\r\n    }\r\n  }\r\n\r\n  print(): void {\r\n    const printWindow = window.open('', '_blank');\r\n    if (printWindow) {\r\n      printWindow.document.write(`\r\n        <!DOCTYPE html>\r\n        <html>\r\n          <head>\r\n            <title>${this.fileName}</title>\r\n            <style>\r\n              @page { size: A4; margin: 20mm; }\r\n              body { font-family: Arial, sans-serif; font-size: 12pt; line-height: 1.6; }\r\n              img { max-width: 100% !important; height: auto !important; page-break-inside: avoid; }\r\n              .page { page-break-after: always; }\r\n            </style>\r\n          </head>\r\n          <body>\r\n            ${this.pages.map(page => `<div class=\"page\">${page}</div>`).join('')}\r\n          </body>\r\n        </html>\r\n      `);\r\n      printWindow.document.close();\r\n      setTimeout(() => printWindow.print(), 250);\r\n    }\r\n  }\r\n\r\n  download(): void {\r\n    const htmlContent = `\r\n      <!DOCTYPE html>\r\n      <html>\r\n        <head>\r\n          <meta charset=\"UTF-8\">\r\n          <title>${this.fileName}</title>\r\n          <style>\r\n            body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }\r\n            img { max-width: 100%; height: auto; display: block; margin: 15px auto; }\r\n            table { width: 100%; border-collapse: collapse; margin: 15px 0; }\r\n            th, td { border: 1px solid #ddd; padding: 8px; }\r\n          </style>\r\n        </head>\r\n        <body>${this.fullContent}</body>\r\n      </html>\r\n    `;\r\n    \r\n    const blob = new Blob([htmlContent], { type: 'text/html' });\r\n    const url = window.URL.createObjectURL(blob);\r\n    const link = document.createElement('a');\r\n    link.href = url;\r\n    link.download = `${this.fileName}.html`;\r\n    link.click();\r\n    window.URL.revokeObjectURL(url);\r\n  }\r\n\r\n  private fileToArrayBuffer(file: File): Promise<ArrayBuffer> {\r\n    return new Promise((resolve, reject) => {\r\n      const reader = new FileReader();\r\n      reader.onload = (e) => resolve(e.target?.result as ArrayBuffer);\r\n      reader.onerror = reject;\r\n      reader.readAsArrayBuffer(file);\r\n    });\r\n  }\r\n\r\n  private base64ToArrayBuffer(base64: string): ArrayBuffer {\r\n    const base64Content = base64.split(',')[1];\r\n    const binaryString = window.atob(base64Content);\r\n    const bytes = new Uint8Array(binaryString.length);\r\n    for (let i = 0; i < binaryString.length; i++) {\r\n      bytes[i] = binaryString.charCodeAt(i);\r\n    }\r\n    return bytes.buffer;\r\n  }\r\n\r\n  private async fetchDocument(url: string): Promise<ArrayBuffer> {\r\n    const response = await fetch(url);\r\n    if (!response.ok) {\r\n      throw new Error(`Failed to fetch document: ${response.statusText}`);\r\n    }\r\n    return await response.arrayBuffer();\r\n  }\r\n}","import { NgModule } from '@angular/core';\r\nimport { WordViewerComponent } from './word-viewer/word-viewer.component';\r\n\r\n@NgModule({\r\n  imports: [WordViewerComponent],\r\n  exports: [WordViewerComponent]\r\n})\r\nexport class NgxWordViewerModule { }","/*\r\n * Public API Surface of ngx-word-viewer\r\n */\r\n\r\nexport * from './lib/word-viewer/word-viewer.component';\r\nexport * from './lib/ngx-word-viewer.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}