ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

前端实用技巧:纯浏览器实现 PDF 转 Word,全程本地零上传

2026/9/30 2:51:36 拓冰建站 浏览量
前端实用技巧:纯浏览器实现 PDF 转 Word,全程本地零上传 平时办公或者做开发PDF 转 Word 绝对是超级高频的需求。不管是改文档、复制文案、二次编辑内容PDF 都是只读的根本没法直接修改必须转成 Word 格式才方便操作。相信大家之前都用过各种转换工具不是要开会员、满屏广告就是必须把文件上传到云端隐私文件真的不敢随便传很容易出现资料泄漏的问题。很多人都不知道其实现在的浏览器完全可以本地完成 PDF 转 Word不用后端服务、不用装任何软件所有解析、转换、生成文件的操作全都在本地浏览器里运行。我自己做项目的时候经常用这套方案不仅安全省心还能直接集成到内部工具或者线上项目里实用性真的拉满了。这里先纠正一个很多新手的误区浏览器本身是不自带 PDF 转 Word 功能的。想要实现这个效果核心就是靠两大前端库搭配使用分别是用来解析 PDF 的pdf.js和用来生成 Word 文档的docx.js。目前市面上大部分免费网页转换工具底层基本都是这套逻辑只是很多人不知道底层原理而已。简单跟大家唠下核心原理。PDF 文件的结构其实很特殊它不是按段落、文字排版的而是一堆带坐标的零散文本、图片、图形数据。所以转换的第一步就是用pdf.js读取本地 PDF 文件逐页解析里面的文字内容、字体大小、换行位置、图片资源等信息把杂乱的数据规整出来。解析完成后再通过docx.js把这些零散数据重新组装成标准的 DOCX 文档结构。简单说就是把 PDF 里的坐标文本重新识别成正常的段落、换行和排版最后打包生成可以直接用 Word 打开的文件。整个过程完全靠前端 JS 运算不经过任何服务器所以完全不用担心文件泄露。整套实现流程其实特别简单我给大家拆解一下新手也能看懂。第一步就是通过浏览器 File API 读取用户上传的 PDF 文件做个简单的格式校验防止用户传错文件导致报错。第二步调用pdf.js逐页解析文档提取所有文本、图片和样式信息这也是整个转换最核心的一步。第三步就是重构排版生成 Word 文档。因为 PDF 没有段落概念解析出来的文字很容易错乱这里需要通过坐标间距判断段落、自动补全换行尽量还原原文件的排版样式。最后一步导出 DOCX 文件浏览器直接触发本地下载几秒就能拿到成品文件。下面直接上核心代码大家可以对照着理解整个流程。1. 引入依赖script srchttps://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/docx/7.8.2/docx.umd.js/script如果是工程化项目也可以直接走 npmnpm install pdfjs-dist docx file-saver2. 读取本地 PDF 并解析文本import * as pdfjsLib from pdfjs-dist; import { Document, Packer, Paragraph, TextRun } from docx; import { saveAs } from file-saver; // 设置 pdf.js 的 worker 路径 pdfjsLib.GlobalWorkerOptions.workerSrc https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js; async function parsePdf(file) { const arrayBuffer await file.arrayBuffer(); const pdf await pdfjsLib.getDocument({ data: arrayBuffer }).promise; const pages []; for (let i 1; i pdf.numPages; i) { const page await pdf.getPage(i); const content await page.getTextContent(); // 按 y 坐标聚合粗略还原行 const lines {}; content.items.forEach((item) { const y Math.round(item.transform[5]); if (!lines[y]) lines[y] []; lines[y].push(item.str); }); const sortedY Object.keys(lines).sort((a, b) b - a); const pageText sortedY.map((y) lines[y].join()).join(\n); pages.push(pageText); } return pages; }这里有个细节值得说一下item.transform[5]是文本的 y 坐标PDF 的坐标系原点在左下角所以 y 越大越靠上。按 y 值分组再排序就能把同一行的文字拼起来避免解析出来一团乱麻。3. 生成 DOCX 并触发下载async function pdfToWord(file) { const pages await parsePdf(file); const paragraphs []; pages.forEach((pageText, index) { pageText.split(\n).forEach((line) { paragraphs.push( new Paragraph({ children: [new TextRun({ text: line, size: 24 })], spacing: { after: 120 }, }) ); }); // 分页 if (index pages.length - 1) { paragraphs.push(new Paragraph({ text: , pageBreakBefore: true })); } }); const doc new Document({ sections: [{ children: paragraphs }], }); const blob await Packer.toBlob(doc); saveAs(blob, file.name.replace(/\.pdf$/i, .docx)); } // 绑定文件输入 document.getElementById(fileInput).addEventListener(change, (e) { const file e.target.files[0]; if (file file.type application/pdf) { pdfToWord(file); } else { alert(请上传 PDF 文件); } });整段代码不到 80 行核心逻辑就跑通了。实际项目中可以再叠加进度条、拖拽上传、批量转换这些体验优化代码量也不会增加太多。相比于传统的转换方式浏览器本地转换的优势真的太明显了。首先是安全性拉满全程无上传涉密文档、工作资料都能放心转换。其次是速度快不用等待网络传输本地运算秒级出结果。最关键的是零成本不用搭建后端接口前端代码直接复用部署维护几乎没有压力。不过实话实说这套方案也有小短板。纯前端转换对复杂排版适配一般比如多栏布局、复杂表格、特殊字体的 PDF转换后可能会有排版偏移。但如果是普通的文字文档、工作报表、通知文件完全够用日常办公场景基本不会翻车。如果只是偶尔应急用一次不想折腾代码也可以直接用一些成熟的在线工具比如freeconvetbox.com是一个免费的在线转化网站PDF、Word、图片等格式互转都支持免注册、无强制上传门槛临时处理一两个文件挺省事的。当然涉密文件还是建议走上面的本地方案自己掌控数据最踏实。总的来说纯浏览器 PDF 转 Word 是一个非常实用的前端技能。落地成本低、体验好、安全性高不管是做成个人工具还是集成到业务系统、后台管理项目中都很合适。彻底摆脱第三方收费工具和云端上传风险是前端赋能轻量化办公的绝佳实践非常值得大家学习和使用。