Voyn Software
← Back to Tools

DOCX → PDF (Word-like size)

Click or drop a .docx file here
No file selected.
Voyn Software
← Back to Tools
${html}
`); idoc.close(); // Wait for layout/assets await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))); if (idoc.fonts && idoc.fonts.ready) { try { await idoc.fonts.ready; } catch(_){} } await waitForImages(idoc); // Map mm → px reliably in this iframe const pxPerMm = measurePxPerMm(idoc); // Content dimensions in px (inside margins area) const root = idoc.getElementById('pdf-root'); const totalWpx = root.scrollWidth; const totalHpx = root.scrollHeight; const contentWmm = pageMm.w - pageMm.marLeft - pageMm.marRight; const contentHmm = pageMm.h - pageMm.marTop - pageMm.marBottom; const contentWpx = Math.round(contentWmm * pxPerMm); const contentHpx = Math.round(contentHmm * pxPerMm); // Left/top offsets (in px) where actual content starts inside #pdf-root const offsetLeftPx = Math.round(pageMm.marLeft * pxPerMm); const offsetTopPx = Math.round(pageMm.marTop * pxPerMm); // Prepare PDF with exact page size (in mm) const { jsPDF } = window.jspdf; const isLandscape = pageMm.w > pageMm.h; const pdf = new jsPDF({ unit: 'mm', format: [pageMm.w, pageMm.h], orientation: isLandscape ? 'l' : 'p' }); // Number of vertical slices (pages) const pages = Math.ceil((totalHpx - offsetTopPx) / contentHpx); setStatus(`Rendering ${pages} page(s)…`); for (let i = 0; i < pages; i++) { const yPx = offsetTopPx + i * contentHpx; const heightPx = Math.min(contentHpx, totalHpx - yPx); // Render this slice only const canvas = await renderSlice(root, offsetLeftPx, yPx, contentWpx, heightPx, 2); // Place into PDF exactly inside margins const imgData = canvas.toDataURL('image/jpeg', 0.95); const imgWmm = contentWmm; const imgHmm = (heightPx / contentHpx) * contentHmm; if (i > 0) pdf.addPage(); pdf.addImage(imgData, 'JPEG', pageMm.marLeft, pageMm.marTop, // position (mm) imgWmm, imgHmm // size (mm) ); setStatus(`Rendering page ${i+1}/${pages}…`); await new Promise(r => setTimeout(r)); // yield } pdf.save('document.pdf'); setStatus('Done ✓ Saved as document.pdf'); }catch(err){ console.error(err); setStatus('Error: ' + (err && err.message ? err.message : String(err))); } });