Jobs

Filter by
Category
'); iframeDoc.close();const iframeSummary = summary.cloneNode(true); iframeSummary.style.display = 'block'; iframeDoc.body.appendChild(iframeSummary); if (!iframeSummary) { throw new Error('No PDF summary found in isolated iframe.'); }const pageElements = Array.from(iframeSummary.querySelectorAll('.pdf-page')); if (!pageElements.length) { throw new Error('No PDF pages were found in isolated summary.'); } const images = Array.from(iframeSummary.querySelectorAll('img'));await Promise.all(images.map((img) => { if (img.complete) return Promise.resolve(); return new Promise((resolve) => { img.addEventListener('load', resolve, { once: true }); img.addEventListener('error', resolve, { once: true }); }); }));const pdf = new JsPdfCtor({ orientation: 'portrait', unit: 'px', format: [794, 1123], putOnlyUsedFonts: true, hotfixes: ['px_scaling'] });for (let i = 0; i < pageElements.length; i++) { const pageEl = pageElements[i]; const renderPageCanvas = async (el, useCors, removeBg) => { let target = el; if (removeBg) { target = el.cloneNode(true); target.style.position = 'fixed'; target.style.left = '-99999px'; target.style.top = '0'; const bgImage = target.querySelector('img'); if (bgImage) bgImage.remove(); target.style.background = '#ffffff'; document.body.appendChild(target); }try { return await html2canvasLib(target, { scale: 2, useCORS: useCors, allowTaint: false, backgroundColor: '#ffffff', scrollX: 0, scrollY: 0, width: 794, height: 1123, windowWidth: 794, windowHeight: 1123 }); } finally { if (removeBg && target && target.parentNode) { target.parentNode.removeChild(target); } } };let canvas; try { canvas = await renderPageCanvas(pageEl, true, false); // Throws if canvas is tainted canvas.toDataURL('image/jpeg', 0.98); } catch (pageErr) { canvas = await renderPageCanvas(pageEl, false, true); console.warn('PDF page fallback used (background not exported):', pageErr); }const imgData = canvas.toDataURL('image/jpeg', 0.98); if (i > 0) pdf.addPage(); pdf.addImage(imgData, 'JPEG', 0, 0, 794, 1123);const ctaLink = pageEl.querySelector('a[href="https://partnerinpublishing.com/contact-us/"]'); if (ctaLink && typeof pdf.link === 'function') { const pageRect = pageEl.getBoundingClientRect(); const linkRect = ctaLink.getBoundingClientRect(); const linkX = Math.max(0, linkRect.left - pageRect.left); const linkY = Math.max(0, linkRect.top - pageRect.top); const linkW = Math.max(1, linkRect.width); const linkH = Math.max(1, linkRect.height); pdf.link(linkX, linkY, linkW, linkH, { url: 'https://partnerinpublishing.com/contact-us/' }); } }const pdfBlob = pdf.output('blob'); const blobUrl = URL.createObjectURL(pdfBlob); const link = document.createElement('a'); link.href = blobUrl; link.download = 'EdTech-Growth-Checklist.pdf'; link.style.display = 'none'; document.body.appendChild(link); link.click(); setTimeout(() => { URL.revokeObjectURL(blobUrl); link.remove(); }, 1500); } catch (err) { console.error('Error al generar PDF:', err); const msg = (err && err.message) ? err.message : 'Unknown error generating PDF.'; alert('No se pudo descargar el PDF. Revisa consola para detalle técnico.\n' + msg); } finally { if (pdfIframe && pdfIframe.parentNode) { pdfIframe.parentNode.removeChild(pdfIframe); } summary.style.display = 'none'; btn.textContent = 'Download Full Report'; } });}btnNext.addEventListener('click', () => { if (currentStep < categories.length - 1) { currentStep++; renderStep(); } else { calculateResult(); } });btnBack.addEventListener('click', () => { if (currentStep > 0) { currentStep--; renderStep(); } });renderStep(); });

Social Media Strategy

From CEO thought leadership to brand engagement, this guide shows how to turn scrolls into sales.

Website Content & SEO

Your site is your handshake—learn how to structure messaging that drives conversions.

Video Marketing

Boost trust, engagement, and leads with video content that converts.

Strategic Copywriting

Great copy converts. Download this guide to see how messaging impacts every touchpoint—from email to website.