/** * CyberCore Signer - PdfStampPicker * Componente visual para pré-visualização de PDF, posicionamento interativo de selos * e geração do payload de assinatura em tempo real. */ export class PdfStampPicker { /** * @param {Object} options Configurações do componente. * @param {HTMLElement|string} options.container Elemento DOM ou seletor onde renderizar o picker. * @param {File|Blob|ArrayBuffer|string} [options.pdf] Arquivo ou Base64 inicial do PDF. * @param {Object} [options.sealTheme] Configurações visuais do selo a estampar. * @param {number} [options.initialScale=1.0] Escala inicial do selo (ex: 1.0 = 100%). * @param {Function} [options.onPositionChange] Callback chamado a cada alteração de página ou coordenadas: fn(info). * @param {Function} [options.onSignRequest] Callback acionado ao clicar em "Assinar": fn(payload). */ constructor(options = {}) { this.container = typeof options.container === 'string' ? document.querySelector(options.container) : options.container; if (!this.container) { throw new Error('Container DOM obrigatório para instanciar PdfStampPicker.'); } this.onPositionChange = options.onPositionChange || null; this.onSignRequest = options.onSignRequest || null; this.sealTheme = options.sealTheme || null; // Estado interno this.pdfDocument = null; this.pdfBytes = null; this.pdfBase64 = null; this.documentName = 'documento.pdf'; this.totalPages = 1; this.currentPageNumber = 1; this.zoom = 1.0; // Dimensões do PDF na página ativa (em pontos tipográficos 72 DPI) this.pagePdfWidth = 595.28; this.pagePdfHeight = 841.89; // Estado do selo this.sealScale = options.initialScale || 1.0; this.baseSealWidth = 230; // pixels base no visualizador this.baseSealHeight = 60; this.sealPosX = null; // pixel relativo ao container da folha this.sealPosY = null; this.isDragging = false; this.dragStartX = 0; this.dragStartY = 0; // Coordenadas finais em pontos do PDF this.calculatedPdfX = 0; this.calculatedPdfY = 0; this.selectedPositionEnum = 'BOTTOM_RIGHT'; this._initDom(); this._attachEvents(); if (options.pdf) { this.loadPdf(options.pdf); } } _initDom() { this.container.innerHTML = `