Browser-based document tool

Word to PDF

Open a DOCX file, review the preview and save it as a PDF using your browser. No account or conversion API required.

No added watermark Local file processing DOCX files up to 10 MB

Choose your Word document

Supported: .docx. Older .doc files and password-protected documents are not supported.

One document at a time · Maximum 10 MB

Select a DOCX file to get started.

Before saving: Check the preview. Complex layouts, missing fonts, equations, tracked changes and page breaks can differ from Microsoft Word. This tool does not guarantee identical output.

How to convert DOCX to PDF

1

Select your file

Choose a DOCX document from your device.

2

Review the preview

Check text, images, tables and page breaks before saving.

3

Save your PDF

Click Save as PDF, select your browser’s PDF destination and save.

A simple way to prepare a PDF from DOCX

PDF is useful when you want to share a document in a fixed layout. This tool renders your DOCX file inside the browser and uses the browser’s print system to create the PDF.

It is intended for everyday documents such as letters, notes and straightforward reports. Always compare the preview with the original, especially for documents with multiple columns, floating images or detailed tables.

There is no conversion account to create and the tool does not add promotional text or watermarks. Existing content in the original document may remain in the result.

Privacy and conversion details

This tool’s code reads the selected file locally and does not send it to a conversion server. Its JavaScript libraries load from a CDN. Ads and other scripts installed by this website have their own data practices.

External resources referenced by a document are disabled in this implementation. Linked images may therefore be missing; images embedded in the DOCX are preferred.

For a better result

  • Use fonts available on the device doing the conversion.
  • Check the paper size and orientation in the print dialog.
  • Disable browser headers and footers to remove dates and URLs.
  • Enable background graphics if your document needs background colours.
  • Use the final print preview to check overflow and extra pages.

Frequently asked questions

Does this tool add a watermark?

No. The tool adds no watermark. A watermark already present in your original document may remain.

Will my PDF look exactly like the Word document?

Not always. Browser rendering differs from Microsoft Word. Fonts, pagination, headers, tables and advanced elements may change.

Why does a print window open?

The browser creates the PDF through its print system. Choose Save as PDF instead of a physical printer. Availability varies by browser and device.

Can I convert an older .doc file?

No. This version accepts DOCX only. Renaming a .doc file to .docx does not convert its format.

Are my files uploaded?

This tool’s conversion code does not upload the selected file. It processes it in browser memory. The page still loads external libraries and may contain ads or analytics.

Why is there a file-size limit?

Large documents can use substantial browser memory. This version accepts files up to 10 MB and also checks the expanded DOCX package size.

Can I use it on a phone?

Previewing may work, but PDF saving depends on the mobile browser’s print support. Use a desktop browser if the save option is unavailable.

`; holder.replaceChildren(iframe); }); return iframe; }async function preparePackage(file) { const zip = await window.JSZip.loadAsync(await file.arrayBuffer()); if (!zip.file("word/document.xml") || !zip.file("[Content_Types].xml")) { throw new Error("This file is not a supported DOCX document."); }const entries = Object.values(zip.files); if (entries.length > 2500) { throw new Error("This document contains too many package entries."); }// JSZip's package metadata gives an early size check before expansion. const expanded = entries.reduce((sum, item) => sum + (item._data?.uncompressedSize || 0), 0);if (expanded > 60 * 1024 * 1024) { throw new Error("This document is too large after decompression."); }// Disable external relationships, including linked images. for (const entry of entries) { if (entry.dir || !entry.name.endsWith(".rels")) continue; const xml = await entry.async("string"); const parsed = new DOMParser().parseFromString(xml, "application/xml"); if (parsed.querySelector("parsererror")) { throw new Error("The DOCX contains invalid relationship data."); } let changed = false; for (const rel of Array.from( parsed.getElementsByTagNameNS("*", "Relationship") )) { if ((rel.getAttribute("TargetMode") || "").toLowerCase() === "external") { rel.remove(); changed = true; } } if (changed) { zip.file(entry.name, new XMLSerializer().serializeToString(parsed)); } } return zip.generateAsync({ type: "arraybuffer", compression: "STORE" }); }input.addEventListener("change", () => choose(input.files[0]));for (const event of ["dragenter", "dragover"]) { drop.addEventListener(event, e => { e.preventDefault(); if (!busy) drop.classList.add("w2p-over"); }); } for (const event of ["dragleave", "drop"]) { drop.addEventListener(event, e => { e.preventDefault(); drop.classList.remove("w2p-over"); }); } drop.addEventListener("drop", e => { if (busy) return; if (e.dataTransfer.files.length !== 1) { say("Please drop exactly one DOCX file.", true); return; } input.value = ""; choose(e.dataTransfer.files[0]); });reset.addEventListener("click", () => { if (busy) return; input.value = ""; choose(null); });prepare.addEventListener("click", async () => { if (!selected || busy) return;busy = true; input.disabled = true; prepare.disabled = true; reset.disabled = true; clearPreview(); root.setAttribute("aria-busy", "true"); say("Preparing your document. Large files may take a little longer…");try { await loadLibraries(); const data = await preparePackage(selected);area.hidden = false; frame = await createFrame(); const doc = frame.contentDocument;doc.title = selected.name.replace(/\.docx$/i, "") || "Document";await window.docx.renderAsync( data, doc.getElementById("pages"), doc.getElementById("document-styles"), { className: "docx", inWrapper: true, hideWrapperOnPrint: true, ignoreWidth: false, ignoreHeight: false, ignoreFonts: false, breakPages: true, ignoreLastRenderedPageBreak: false, renderHeaders: true, renderFooters: true, renderFootnotes: true, renderEndnotes: true, renderComments: false, renderChanges: false, renderAltChunks: false, useBase64URL: true, experimental: false } );// Keep rendered content inert. doc.querySelectorAll("script,object,embed,iframe,form").forEach(n => n.remove()); doc.querySelectorAll("*").forEach(node => { for (const attribute of Array.from(node.attributes)) { if (/^on/i.test(attribute.name)) node.removeAttribute(attribute.name); } }); doc.querySelectorAll("a").forEach(a => { a.removeAttribute("href"); a.removeAttribute("target"); });await doc.fonts.ready; await Promise.all(Array.from(doc.images, image => { if (image.complete) return Promise.resolve(); return new Promise(resolve => { image.addEventListener("load", resolve, { once: true }); image.addEventListener("error", resolve, { once: true }); setTimeout(resolve, 8000); }); }));// Use each rendered section's page dimensions when available. const pageStyle = doc.createElement("style"); let css = "@media print{"; doc.querySelectorAll("section.docx").forEach((section, index) => { const computed = frame.contentWindow.getComputedStyle(section); const width = parseFloat(computed.width); const height = parseFloat(computed.minHeight); if (width > 0 && height > 0) { const name = "documentPage" + index; section.style.page = name; css += `@page ${name}{size:${width}px ${height}px;margin:0}`; } }); pageStyle.textContent = css + "}"; doc.head.appendChild(pageStyle);if (!doc.querySelector("section.docx")) { throw new Error("No printable pages could be generated."); }print.disabled = false; say("Preview ready. Review it, then click Save as PDF."); } catch (error) { clearPreview(); say(error.message || "Unable to open this DOCX file. Try another document.", true); } finally { busy = false; input.disabled = false; prepare.disabled = !selected; reset.disabled = false; root.removeAttribute("aria-busy"); } });print.addEventListener("click", () => { if (!frame || busy) return; try { frame.contentWindow.focus(); frame.contentWindow.print(); say("Choose Save as PDF in the print dialog. Saving or cancellation is handled by your browser."); } catch { say("Printing is unavailable in this browser. Try a desktop browser.", true); } }); })();