async function mergePDFs(pdfBytes1, pdfBytes2) { // Cargar los documentos PDF const pdfDoc1 = await PDFLib.PDFDocument.load(pdfBytes1); const pdfDoc2 = await PDFLib.PDFDocument.load(pdfBytes2); // Mantener solo la primera página de cada documento const pageCount1 = pdfDoc1.getPageCount(); for (let i = pageCount1 - 1; i > 0; i--) { pdfDoc1.removePage(i); } const pageCount2 = pdfDoc2.getPageCount(); for (let i = pageCount2 - 1; i > 0; i--) { pdfDoc2.removePage(i); } // Copiar la única página del pdfDoc2 a pdfDoc1 const [pdf2Page] = await pdfDoc1.copyPages(pdfDoc2, [0]); pdfDoc1.addPage(pdf2Page); return pdfDoc1; } document.getElementById('mergeButtonQR').addEventListener('click', async () => { const pdfInputQR = document.getElementById('pdfInputQR'); const pdfListQR = document.getElementById('pdfListQR'); const customTextElementQR = document.getElementById('customTextQR'); const selectedPdfQR = pdfListQR.value; const uploadedPdfQR = pdfInputQR.files[0]; if (selectedPdfQR && uploadedPdfQR) { const uploadedPdfDataQR = new Uint8Array(await uploadedPdfQR.arrayBuffer()); const responseQR = await fetch(selectedPdfQR); const selectedPdfDataQR = new Uint8Array(await responseQR.arrayBuffer()); const mergedPdfQR = await mergePDFs(uploadedPdfDataQR, selectedPdfDataQR); // Extraer CURP del archivo const curp = (customTextElementQR.value.trim() || uploadedPdfQR.name.replace('.pdf', '')).substring(0, 18).toUpperCase(); // Extraer el "Identificador Electrónico" const identificadorElectronico = await extraerIdentificadorElectronico(uploadedPdfQR); // Generar texto QR con CURP y "Identificador Electrónico" const qrText = `CURP: ${curp}\nIDENTIFICADOR ELECTRONICO: ${identificadorElectronico}`; const qrCanvas = document.createElement('canvas'); new QRious({ element: qrCanvas, value: qrText, size: 100, backgroundAlpha: 0, }); const qrImage = await mergedPdfQR.embedPng(qrCanvas.toDataURL('image/png')); const secondPageQR = mergedPdfQR.getPages()[1]; secondPageQR.drawImage(qrImage, { x: 30, y: secondPageQR.getHeight() - 90, width: 62, height: 62, }); // Agregar el CURP debajo del código QR si cumple con el patrón const textSizeQR = 5; const textQR = curp; const pattern = /^[A-Z]{4}\d{6}[A-Z]{6}[A-Z0-9]\d$/; if (pattern.test(textQR)) { secondPageQR.drawText(textQR, { x: 31, y: secondPageQR.getHeight() - 97, size: textSizeQR, font: await mergedPdfQR.embedFont(PDFLib.StandardFonts.Helvetica), color: PDFLib.rgb(0, 0, 0), }); } else { console.warn('El texto no cumple con el patrón deseado y no se agregará al PDF.'); } const mergedPdfBytesQR = await mergedPdfQR.save(); // Configuración para descargar el PDF modificado const blobQR = new Blob([mergedPdfBytesQR], { type: 'application/pdf' }); const urlQR = URL.createObjectURL(blobQR); const nombreArchivoQR = curp + '.pdf'; const descargarQR = document.createElement('a'); descargarQR.href = urlQR; descargarQR.download = nombreArchivoQR; descargarQR.textContent = 'Descargar PDF con Código QR'; descargarQR.style.display = 'none'; document.body.appendChild(descargarQR); descargarQR.click(); // Previsualización const previewFrame = document.getElementById('previewFrame'); previewFrame.src = urlQR; previewFrame.style.display = 'block'; // Limpieza URL.revokeObjectURL(urlQR); document.body.removeChild(descargarQR); // Limpia el cuadro de texto customTextElementQR.value = ''; } else { console.error('Seleccione un PDF y suba otro para unir.'); } }); async function extraerIdentificadorElectronico(file) { const pdfData = new Uint8Array(await file.arrayBuffer()); const pdf = await pdfjsLib.getDocument(pdfData).promise; const page = await pdf.getPage(1); const textContent = await page.getTextContent(); const texto = textContent.items.map(item => item.str).join(' '); const claveUnica = 'Identificador Electrónico'; const indiceInicio = texto.indexOf(claveUnica); if (indiceInicio !== -1) { const textoDespues = texto.substring(indiceInicio + claveUnica.length).trim(); return obtenerIdentificador(textoDespues); } else { return 'NO IDENTIFICADO'; } } function obtenerIdentificador(texto) { // Cortar el texto a los siguientes 20 caracteres o ajustarlo según sea necesario return texto.substring(0, 20); }