Flutter Web中如何将pub.dev的pdf包生成的PDF转换为DOC文件?
在Flutter Web中将PDF转换为DOC文件的实现方案
由于Flutter Web运行在浏览器环境中,无法直接调用本地桌面级PDF转换工具,以下是两种可行的实现思路:
方案一:前端纯JS库实现(无需后端)
利用Flutter与JavaScript的互操作性,借助前端PDF解析和文档生成库完成转换,适合对格式要求较低的场景:
- 引入JS依赖
在web/index.html中添加所需的JS库:
<script src="https://unpkg.com/pdfjs-dist@3.4.120/build/pdf.min.js"></script> <script src="https://unpkg.com/docxtemplater@3.37.12/build/docxtemplater.js"></script> <script src="https://unpkg.com/pizzip@3.1.4/dist/pizzip.js"></script>
- Flutter端传递PDF数据
将pub.dev的pdf包生成的Uint8List类型PDF数据传递给JS函数:
import 'dart:js' as js; import 'dart:typed_data'; void convertPdfToDoc(Uint8List pdfBytes) { js.context.callMethod('convertPdfToDoc', [pdfBytes]); }
- JS端完成解析与生成
在web/index.html中添加转换逻辑:
async function convertPdfToDoc(pdfBytes) { // 解析PDF提取纯文本 const pdf = await pdfjsLib.getDocument({data: pdfBytes}).promise; let fullText = ''; for (let i = 1; i <= pdf.numPages; i++) { const page = await pdf.getPage(i); const textContent = await page.getTextContent(); const pageText = textContent.items.map(item => item.str).join('\n'); fullText += pageText + '\n\n'; } // 生成DOCX文件(兼容DOC格式) const zip = new PizZip(); zip.file('word/document.xml', `<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body><w:p><w:r><w:t>${fullText.replace(/\n/g, '</w:t></w:r></w:p><w:p><w:r><w:t>')}</w:t></w:r></w:p></w:body></w:document>`); const blob = new Blob([zip.generate({type: 'blob'})], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'}); // 触发浏览器下载 const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'converted.docx'; a.click(); URL.revokeObjectURL(url); }
注意:此方式仅能提取纯文本,PDF中的格式、图片等元素会丢失。
方案二:服务端转换(格式还原更完整)
如果需要保留PDF中的格式、图片等元素,建议通过后端服务完成转换,Flutter Web仅负责上传PDF和接收结果:
- Flutter端上传PDF并接收转换文件
import 'dart:js' as js; import 'dart:typed_data'; import 'package:http/http.dart' as http; Future<void> uploadAndConvert(Uint8List pdfBytes) async { var request = http.MultipartRequest('POST', Uri.parse('你的后端转换接口地址')); request.files.add(http.MultipartFile.fromBytes('pdf', pdfBytes, filename: 'input.pdf')); var response = await request.send(); if (response.statusCode == 200) { final bytes = await response.stream.toBytes(); // 触发浏览器下载转换后的文件 final blob = js.JsObject(js.context['Blob'], [bytes, {'type': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'}]); final url = js.context['URL'].callMethod('createObjectURL', [blob]); final a = js.context['document'].callMethod('createElement', ['a']); a['href'] = url; a['download'] = 'converted.docx'; a.callMethod('click'); js.context['URL'].callMethod('revokeObjectURL', [url]); } }
- 后端转换工具选型
后端可根据技术栈选择对应工具:
- Python:使用
pdf2docx直接完成PDF到DOCX的转换 - Node.js:借助
pdf-poppler调用Poppler工具进行格式转换 - Java:使用
Apache PDFBox解析PDF,搭配Apache POI生成DOCX文件
内容的提问来源于stack exchange,提问作者Harsh Bhalala
相关产品推荐
相关产品推荐

