Word to PDF Converter
A4 exact layout • Bangla supported
Print / Direct Download
বাংলা / Bangla fully supported
Upload .docx, .txt — exact A4 layout with tables, images. Change any setting → auto re-convert.
Upload Document
.docx (best), .txt, .rtf, .doc (fallback)
Drop or tap to upload
Max 15MB
Browse files
Set all four margins to the same value
Top
Right
Bottom
Left
Converting...
0%
Settings change → auto re-convert
Live A4 Preview
Upload a document, then change any setting → auto convert
Pages fill preview area, settings applied instantly
Word to PDF Converter
` : '';
const langClassPrint = isBanglaMode ? 'bangla-font' : '';
const fontFamily = isBanglaMode ?
"'Noto Sans Bengali', 'Hind Siliguri', sans-serif" :
"'Inter', sans-serif";
let fullHtml = '';
for (let i = 0; i < convertedPagesHtml.length; i++) {
const tempDiv = document.createElement('div');
tempDiv.innerHTML = convertedPagesHtml[i];
const innerContentDiv = tempDiv.querySelector('.page-inner-content');
let innerHtml = innerContentDiv ? innerContentDiv.innerHTML : '';
if (!innerHtml) innerHtml = "Content";
const pageNumberSpan = pageNumbersCheck.checked ?
`${i + 1} / ${convertedPagesHtml.length}
` :
'';
fullHtml += `
${watermarkHtml}
`;
}
tempContainer.innerHTML = `
${fullHtml}
`;
await new Promise(r => setTimeout(r, 150));
const pages = tempContainer.querySelectorAll('.pdf-page');
const pdf = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });
let firstPageAdded = false;
for (let idx = 0; idx < pages.length; idx++) {
const page = pages[idx];
try {
const canvas = await html2canvas(page, {
scale: 3,
backgroundColor: '#ffffff',
useCORS: true,
logging: false,
windowWidth: 210 * 3.78,
windowHeight: 297 * 3.78,
});
const imgData = canvas.toDataURL('image/jpeg', 0.95);
if (!firstPageAdded) {
pdf.addImage(imgData, 'JPEG', 0, 0, 210, 297, undefined, 'FAST');
firstPageAdded = true;
} else {
pdf.addPage();
pdf.addImage(imgData, 'JPEG', 0, 0, 210, 297, undefined, 'FAST');
}
} catch (e) {
console.error("Page render error:", e);
if (!firstPageAdded) {
pdf.text(`Page ${idx + 1} - rendering error`, 20, 30);
firstPageAdded = true;
} else {
pdf.addPage();
pdf.text(`Page ${idx + 1} - rendering error`, 20, 30);
}
}
}
document.body.removeChild(tempContainer);
const fileName = (currentFile?.name.replace(/\.[^/.]+$/, '') || 'document') + '.pdf';
pdf.save(fileName);
}
function resetAllControls() {
fontSizeSelect.value = '12pt';
paraSpacingSelect.value = '8';
justifyCheck.checked = true;
pageNumbersCheck.checked = true;
watermarkCheck.checked = false;
languageSelect.value = 'auto';
marginTop.value = '20';
marginRight.value = '20';
marginBottom.value = '20';
marginLeft.value = '20';
uniformMargin.value = '20';
clearFile();
updateUniformMargin();
previewScale = 1;
applyPreviewScale();
}
// Event listeners
fileInput.addEventListener('change', (e) => {
if (e.target.files[0]) processSelectedFile(e.target.files[0]);
});
// FIX: Always open file dialog when drop area is clicked (no guard clause)
dropArea.addEventListener('click', () => {
fileInput.click();
});
dropArea.addEventListener('dragover', (e) => {
e.preventDefault();
dropArea.classList.add('dragover');
});
dropArea.addEventListener('dragleave', () => {
dropArea.classList.remove('dragover');
});
dropArea.addEventListener('drop', (e) => {
e.preventDefault();
dropArea.classList.remove('dragover');
const file = e.dataTransfer.files[0];
if (file && isValidFile(file)) {
processSelectedFile(file);
} else if (file) {
const ext = getFileExtension(file);
alert(`Unsupported format: .${ext}\nPlease use .docx, .txt, .rtf, or .doc files.`);
}
});
dropArea.addEventListener('keydown', (e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
fileInput.click();
}
});
removeBtn.addEventListener('click', clearFile);
convertBtn.addEventListener('click', convertToPDF);
printBtn.addEventListener('click', generatePrint);
downloadDirectBtn.addEventListener('click', downloadDirectPDF);
resetBtn.addEventListener('click', resetAllControls);
fontSizeSelect.addEventListener('change', handleSettingChange);
justifyCheck.addEventListener('change', handleSettingChange);
pageNumbersCheck.addEventListener('change', handleSettingChange);
watermarkCheck.addEventListener('change', handleSettingChange);
paraSpacingSelect.addEventListener('change', handleSettingChange);
languageSelect.addEventListener('change', handleSettingChange);
marginTop.addEventListener('change', () => { updateUniformMargin(); handleSettingChange(); });
marginRight.addEventListener('change', () => { updateUniformMargin(); handleSettingChange(); });
marginBottom.addEventListener('change', () => { updateUniformMargin(); handleSettingChange(); });
marginLeft.addEventListener('change', () => { updateUniformMargin(); handleSettingChange(); });
uniformMargin.addEventListener('change', setUniformMargins);
uniformMargin.addEventListener('input', () => {
if (uniformMargin.value && !isNaN(parseInt(uniformMargin.value))) {
setUniformMargins();
}
});
let resizeDebounce = null;
window.addEventListener('resize', () => {
if (resizeDebounce) clearTimeout(resizeDebounce);
resizeDebounce = setTimeout(() => {
if (convertedPagesHtml.length > 0) {
applyPreviewScale();
}
}, 200);
});
if (window.ResizeObserver) {
const resizeObserver = new ResizeObserver(() => {
if (convertedPagesHtml.length > 0 && !resizeDebounce) {
resizeDebounce = setTimeout(() => {
applyPreviewScale();
resizeDebounce = null;
}, 150);
}
});
resizeObserver.observe(previewContainer);
}
updateUniformMargin();
applyPreviewScale();
window.addEventListener('load', () => {
if (typeof mammoth === 'undefined') {
console.warn("Mammoth.js not loaded. Word document conversion may not work.");
}
if (convertedPagesHtml.length > 0) {
applyPreviewScale();
}
});
console.log("Word to PDF Converter initialized successfully.");
console.log("Supported formats: .docx, .txt, .rtf, .doc");
console.log("Mobile-optimized layout active.");
})();
${innerHtml}
${pageNumberSpan}