Malaji71 commited on
Commit
cf02a17
·
verified ·
1 Parent(s): 4c0c572

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +88 -33
index.html CHANGED
@@ -344,6 +344,32 @@
344
  .nav button { padding: 8px 12px; font-size: 0.7rem; }
345
  .slide-counter { bottom: 10px; left: 10px; font-size: 0.7rem; }
346
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
347
  </style>
348
  </head>
349
  <body>
@@ -593,7 +619,7 @@
593
  if (e.key === 'ArrowLeft') changeSlide(-1);
594
  });
595
 
596
- // ===================== GENERADOR DE PDF ROBUSTO =====================
597
  async function generatePDF() {
598
  const loadingOverlay = document.getElementById('pdf-loading');
599
  const btnPdf = document.getElementById('btn-pdf');
@@ -603,62 +629,91 @@
603
 
604
  try {
605
  const { jsPDF } = window.jspdf;
606
- // Orientación horizontal 16:9
607
- const pdf = new jsPDF({ orientation: 'landscape', unit: 'px', format: [1920, 1080] });
 
 
 
 
608
 
609
  const slides = document.querySelectorAll('.slide');
610
- const currentIdx = currentSlide - 1;
611
 
612
  for (let i = 0; i < slides.length; i++) {
613
- // 1. Mostrar solo esta slide
614
- slides.forEach((s, idx) => s.style.display = idx === i ? 'flex' : 'none');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
615
 
616
- // 2. TRUCO MÁGICO: Convertir imagen de fondo a Base64 para evitar error CORS/Taint en HF
617
- const bgStyle = window.getComputedStyle(slides[i]).backgroundImage;
 
 
 
618
  const urlMatch = bgStyle.match(/url\(["']?(.*?)["']?\)/);
619
 
620
  if (urlMatch && urlMatch[1]) {
621
- const cleanUrl = urlMatch[1];
622
  try {
623
- // Fetch la imagen y convertirla a Blob
624
  const res = await fetch(cleanUrl);
625
  const blob = await res.blob();
626
- // Convertir Blob a Base64
627
  const b64 = await new Promise(r => {
628
  const rd = new FileReader();
629
  rd.onloadend = () => r(rd.result);
630
  rd.readAsDataURL(blob);
631
  });
632
- // Inyectar imagen inline
633
- slides[i].style.backgroundImage = `url(${b64})`;
634
  } catch (e) {
635
- console.warn("No se pudo convertir imagen:", e);
636
  }
637
  }
638
-
639
- // Esperar renderizado
640
- await new Promise(r => setTimeout(r, 800));
641
-
642
- // 3. Capturar SIN CORS (porque ya es interna/base64)
643
- const canvas = await html2canvas(slides[i], {
644
- scale: 2,
645
- useCORS: false, // <--- Importante: false
646
- allowTaint: false,
647
- backgroundColor: '#050505',
648
- logging: false,
649
- width: 1920,
650
- height: 1080
 
 
 
 
 
651
  });
652
-
653
- // 4. Añadir al PDF
654
  if (i > 0) pdf.addPage();
655
- pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 0, 0, 1920, 1080);
 
656
  }
657
 
658
- // 5. Restaurar estado original (mostrar slide actual)
659
- slides.forEach((s, idx) => s.style.display = idx === currentIdx ? 'flex' : 'none');
 
 
 
 
 
 
660
 
661
- // Guardar
662
  pdf.save('MIGUEL_PitchDeck.pdf');
663
 
664
  } catch (err) {
 
344
  .nav button { padding: 8px 12px; font-size: 0.7rem; }
345
  .slide-counter { bottom: 10px; left: 10px; font-size: 0.7rem; }
346
  }
347
+
348
+ /* ===================== MODO CAPTURA PDF ===================== */
349
+ .slide.capture-mode {
350
+ display: flex !important;
351
+ opacity: 1 !important;
352
+ position: fixed !important;
353
+ top: 0 !important;
354
+ left: 0 !important;
355
+ z-index: 9999 !important;
356
+ width: 1920px !important;
357
+ height: 1080px !important;
358
+ transform: none !important;
359
+ }
360
+ .slide.capture-mode [class*="animate-"] {
361
+ animation: none !important;
362
+ opacity: 1 !important;
363
+ transform: none !important;
364
+ transition: none !important;
365
+ }
366
+ .slide.capture-mode .overlay,
367
+ .slide.capture-mode .overlay-slide2,
368
+ .slide.capture-mode .overlay-slide4,
369
+ .slide.capture-mode .overlay-slide5,
370
+ .slide.capture-mode .overlay-slide6 {
371
+ opacity: 1 !important;
372
+ }
373
  </style>
374
  </head>
375
  <body>
 
619
  if (e.key === 'ArrowLeft') changeSlide(-1);
620
  });
621
 
622
+ // ===================== GENERADOR DE PDF - VERSIÓN CORREGIDA =====================
623
  async function generatePDF() {
624
  const loadingOverlay = document.getElementById('pdf-loading');
625
  const btnPdf = document.getElementById('btn-pdf');
 
629
 
630
  try {
631
  const { jsPDF } = window.jspdf;
632
+ const pdf = new jsPDF({
633
+ orientation: 'landscape',
634
+ unit: 'px',
635
+ format: [1920, 1080],
636
+ compress: true
637
+ });
638
 
639
  const slides = document.querySelectorAll('.slide');
640
+ const originalSlide = currentSlide - 1;
641
 
642
  for (let i = 0; i < slides.length; i++) {
643
+ const slide = slides[i];
644
+
645
+ // 1. Activar modo captura: mostrar SOLO esta slide con estilos forzados
646
+ slides.forEach((s, idx) => {
647
+ s.classList.toggle('capture-mode', idx === i);
648
+ s.style.display = idx === i ? 'flex' : 'none';
649
+ });
650
+
651
+ // 2. Forzar estado final de animaciones
652
+ const animatedElements = slide.querySelectorAll('[class*="animate-"]');
653
+ animatedElements.forEach(el => {
654
+ el.style.animation = 'none';
655
+ el.style.opacity = '1';
656
+ el.style.transform = 'none';
657
+ void el.offsetWidth; // Forzar reflow
658
+ });
659
 
660
+ // 3. Esperar renderizado completo
661
+ await new Promise(resolve => setTimeout(resolve, 1500));
662
+
663
+ // 4. Convertir imagen de fondo a base64 para evitar CORS
664
+ const bgStyle = window.getComputedStyle(slide).backgroundImage;
665
  const urlMatch = bgStyle.match(/url\(["']?(.*?)["']?\)/);
666
 
667
  if (urlMatch && urlMatch[1]) {
 
668
  try {
669
+ const cleanUrl = urlMatch[1];
670
  const res = await fetch(cleanUrl);
671
  const blob = await res.blob();
 
672
  const b64 = await new Promise(r => {
673
  const rd = new FileReader();
674
  rd.onloadend = () => r(rd.result);
675
  rd.readAsDataURL(blob);
676
  });
677
+ slide.style.backgroundImage = `url(${b64})`;
 
678
  } catch (e) {
679
+ console.warn("No se pudo convertir imagen de fondo:", e);
680
  }
681
  }
682
+
683
+ // 5. Capturar con html2canvas - configuración optimizada
684
+ const canvas = await html2canvas(slide, {
685
+ scale: 1,
686
+ useCORS: false,
687
+ allowTaint: false,
688
+ backgroundColor: '#050505',
689
+ logging: false,
690
+ width: 1920,
691
+ height: 1080,
692
+ windowWidth: 1920,
693
+ windowHeight: 1080,
694
+ scrollX: 0,
695
+ scrollY: 0,
696
+ x: 0,
697
+ y: 0,
698
+ foreignObjectRendering: true,
699
+ removeContainer: true
700
  });
701
+
702
+ // 6. Añadir al PDF
703
  if (i > 0) pdf.addPage();
704
+ const imgData = canvas.toDataURL('image/jpeg', 0.95);
705
+ pdf.addImage(imgData, 'JPEG', 0, 0, 1920, 1080, undefined, 'FAST');
706
  }
707
 
708
+ // 7. Restaurar estado original
709
+ slides.forEach((s, idx) => {
710
+ s.classList.remove('capture-mode');
711
+ s.style.display = idx === originalSlide ? 'flex' : 'none';
712
+ });
713
+
714
+ // Recargar para restaurar animaciones originales
715
+ setTimeout(() => location.reload(), 1000);
716
 
 
717
  pdf.save('MIGUEL_PitchDeck.pdf');
718
 
719
  } catch (err) {