Word 转 PDF
技术方案 + 推荐工具 · 复杂版式转换需服务端 LibreOffice 引擎
doc/docx→PDF
技术方案 + 推荐工具 · 复杂版式转换需服务端 LibreOffice 引擎
PDF 是固定布局格式(页面坐标 + 字体 + 矢量绘图),Word/docx 是流式文档(段落 + 表格 + 样式继承)。两者数据模型本质不同,纯前端 JS 无法保证 100% 还原版式,特别是:
表格识别 / 多栏排版 / 嵌入字体 / 复杂列表层级 / 图文混排 / 公式
本工具提供本地命令行 / Docker / API 三种生产级备选方案。
安装 LibreOffice 后用命令行批量转换,质量好,无服务器开销:
# macOS / Linux 安装 brew install --cask libreoffice # mac sudo apt install libreoffice # ubuntu # 转换 libreoffice --headless \ --convert-to pdf \ --outdir output/ \ input.docx
学术党推荐,支持公式 / 引用:
# 安装 brew install pandoc # mac sudo apt install pandoc # 转换(需先有文本可选 PDF) pandoc input.docx -o output.pdf
企业用户免费配额:
curl --request POST \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "file=@input.docx" \ -F "outputformat=docx" \ "https://api.cloudconvert.com/v2/convert"
Adobe 官方付费,OCR + 排版还原最优秀。年订阅 ~ ¥1,800。文件 → 导出 PDF → Microsoft Word。
扫描 PDF 用 PDF OCR 工具 识别为文本,然后在 Word 中重新排版。
下载 LibreOffice 官网(免费,类似 MS Office),约 350MB。
方法 A:打开 PDF → 文件 → 导出 → Microsoft Word(.docx)
方法 B:命令行 libreoffice --headless --convert-to pdf input.docx
所有 Word→PDF 工具都需要人工微调,特别是表格 / 多栏 / 图文混排部分。
了解工具定位 · 使用场景 · 对比优势
把 doc、docx 文件拖进来,几秒后得到一份排版一致的 PDF。适合需要固定文档格式的职场人:发简历给 HR、交标书给甲方、传合同给客户,避免对方打开后排版错乱。文件在浏览器端处理,不上传服务器。
求职者用 Word 排版好简历后,不同 HR 的电脑打开可能字体错位、页边距跑偏。将 docx 转为 PDF 后,格式完全锁定——无论对方用 Windows、Mac 还是手机预览,排版、字体、行距都和设计时一模一样,避免因格式问题被筛掉。
投标人员按招标方要求用 Word 编写标书,但最终提交必须为 PDF 格式——因为 PDF 不可随意编辑,保证投标文件完整性。本工具一键转换,无需安装 Adobe Acrobat,尤其适合临时发现格式不符、需要在截止前快速补救的场景。
研究生完成毕业论文后,导师和学校通常要求提交 PDF 版本存档。Word 文件在不同版本 Office 中打开可能产生分页差异、图表偏移,转为 PDF 后页面布局固定,确保盲审和归档时看到的版本和提交时完全一致。
商务人员在 Word 中拟定合同条款,双方确认后需转为 PDF 再盖章或电子签名。Word 文件容易被误改,转为 PDF 后内容不可直接编辑,避免签署前被篡改条款。本工具转换速度快,适合合同定稿后立即生成签署版本。
设计师或行政人员用 Word 排好宣传单页、手册后,打印店常要求提供 PDF 文件。Word 转 PDF 后嵌入字体、保留图片分辨率,打印效果和屏幕预览一致,避免因字体缺失导致打印文字变成乱码或替换字体。
| 维度 | 本工具 | 竞品 A (iLovePDF) | 传统方法 (LibreOffice Desktop) |
|---|---|---|---|
| 数据隐私 | 纯浏览器转换,文件不上传服务器 | 文件上传至云端处理 | 完全本地,文件不离开电脑 |
| 处理速度 | 约 1-3 秒(取决于文件大小) | 约 10-30 秒(含上传下载时间) | 约 3-10 秒(取决于本地性能) |
| 离线可用 | 不支持,需联网加载 WASM 引擎 | 不支持,完全依赖云端 API | 支持,安装后完全离线使用 |
| 文件大小限制 | 受浏览器内存限制,通常 50MB 以内 | 免费版 10MB,付费版 200MB | 无限制,取决于本地硬件 |
| 收费模式 | 完全免费 | 免费版有功能/次数限制,Pro 版约 $7/月 | 免费开源 |
| 注册要求 | 无需注册 | 免费版需注册或使用受限 | 无需注册 |
| 平台依赖 | 任何现代浏览器(Chrome/Edge/Firefox/Safari) | 任何现代浏览器 | 需安装特定桌面软件(Windows/Mac/Linux) |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 一份包含表格和图表的项目报告.docx | 一份包含表格和图表的项目报告.pdf | 典型场景:带复杂排版的文档,验证布局保留 |
| 纯文本无格式的简历.doc | 纯文本无格式的简历.pdf | 典型场景:简单文档,验证基础转换速度 |
| 含有嵌入字体的宣传册.docx | 含有嵌入字体的宣传册.pdf | 典型场景:字体依赖文档,验证字体嵌入 |
| 超过 100 页的学术论文.docx | 超过 100 页的学术论文.pdf | 边界 case:大文件,验证处理稳定性 |
| 仅包含一张图片的空白页.doc | 仅包含一张图片的空白页.pdf | 边界 case:内容极简,验证空页处理 |
| 文件名包含中文和特殊符号(如:合同_2024%v1).docx | 文件名包含中文和特殊符号(如:合同_2024%v1).pdf | 易错 case:文件名含特殊字符,避免乱码或失败 |
| 损坏或加密的.docx 文件 | 错误:文件无法读取,请检查文件完整性 | 易错 case:用户上传损坏文件,提示明确错误 |
把已有的 .pdf 文件拖入或上传到工具界面只上传 .doc 或 .docx 格式的 Word 文档该工具是 Word→PDF 单向转换,不支持 PDF→PDF 或 PDF→其他格式。上传 PDF 文件会导致服务器端 LibreOffice 无法解析,返回空文件或报错。
上传一个设置了“打开密码”或“修改密码”的 .docx 文件上传前先在 Word 中取消密码保护(文件 → 信息 → 保护文档 → 用密码进行加密 → 删除密码)LibreOffice 命令行转换器无法自动处理加密文档。上传加密文件会导致转换失败,返回“文件无法读取”或生成空白 PDF。
上传包含 VBA 宏、ActiveX 按钮或 OLE 嵌入对象的 .docm 或 .docx 文件上传前删除宏(开发工具 → Visual Basic → 删除模块),或另存为不含宏的 .docxLibreOffice 对 VBA 宏和 ActiveX 控件的兼容性有限。这些元素在转换时可能被丢弃、导致布局错乱,或触发 LibreOffice 崩溃。
上传一个包含大量高清图片、嵌入视频或几百页的 .docx 文件(如 200MB)上传前压缩图片(Word:选中图片 → 图片格式 → 压缩图片 → 电子邮件分辨率),或拆分文档为多个小文件服务端转换有内存和超时限制。超大文档可能导致 Go 后端处理超时(通常 30-60 秒),或耗尽服务器内存导致进程被 OOM Killer 终止。
用 WPS Office 创建的 .doc 文件,其中使用了 WPS 特有的“公文模板”或“云字体”在 WPS 中另存为“Word 97-2003 文档 (.doc)”时,选择“兼容模式”,或改用 .docx 格式上传LibreOffice 对 WPS 专有扩展(如 .wps 模板特性)的支持很差。这些非标准特性在 .doc 容器中会被忽略,导致排版移位或字体缺失。
文档中使用了“思源黑体 CN”、“HarmonyOS Sans”等非系统字体,且未嵌入在 Word 中勾选“将字体嵌入文件”(文件 → 选项 → 保存 → 将字体嵌入文件),或使用 Arial/宋体等通用字体服务端 Linux 环境默认只安装基本字体(Noto Sans CJK、DejaVu 等)。未嵌入的专有字体在转换时会被 fallback 字体替代,导致文字间距、换行发生变化。
上传一个 50MB 的 .docx,期望输出 PDF 只有 1MB如果 PDF 体积过大,先压缩 Word 中的图片(降低分辨率到 150 DPI),再转换PDF 不是压缩格式。LibreOffice 默认不重新编码图片,原图分辨率直接保留。一个包含 300 DPI 图片的 Word 文档,转出的 PDF 体积可能比原 .docx 更大。
上传一个包含大量修订标记(Track Changes)和批注的文档,期望 PDF 中也显示这些标记转换前在 Word 中“接受所有修订”并“删除所有批注”(审阅 → 接受 → 接受所有修订)LibreOffice 命令行转换默认输出“最终状态”PDF,不会渲染修订标记和批注气泡。这些内容在 PDF 中完全消失,不可恢复。
公式推导 · 流程图解 · 依据出处
PDF = f(docx, layout, fonts, images)
docx — 输入的 Word 文档(.doc/.docx)layout — 页面布局(A4/Letter/边距等)fonts — 文档中使用的字体集合images — 文档内嵌图片(矢量/位图)PDF — 输出的 PDF 文件用户上传一份 10 页的 .docx 文档,包含正文(宋体 12pt)、表格、3 张 JPEG 图片。工具通过 LibreOffice 引擎将文档解析为内部页面模型,保留原始字体映射、表格边框、图片位置,最终输出一份 10 页的 PDF,页面尺寸为 A4(210×297mm),所有元素与 Word 中一致。
适用于标准 .doc/.docx 文档(Office 2007+ 格式)。不适用于受 DRM 保护、密码加密、或包含 ActiveX 控件的文档。基于 LibreOffice 7.x 渲染引擎,与 Microsoft Word 渲染结果在复杂排版(如文本框嵌套、艺术字)上可能存在细微差异。
3 种主流语言 · 复制即用
import subprocess
import pathlib
def docx_to_pdf(input_path: str, output_path: str | None = None) -> str:
"""
使用 LibreOffice 命令行将 docx 转为 pdf。
需安装 LibreOffice 并确保 soffice 在 PATH 中。
"""
input_file = pathlib.Path(input_path)
if not input_file.exists():
raise FileNotFoundError(f"输入文件不存在: {input_path}")
output_file = output_path or str(input_file.with_suffix('.pdf'))
# --headless 无界面模式,--convert-to 指定输出格式
cmd = [
'soffice',
'--headless',
'--convert-to', 'pdf',
'--outdir', str(input_file.parent),
str(input_file)
]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
if result.returncode != 0:
raise RuntimeError(f"转换失败: {result.stderr}")
return output_file
# 示例
# docx_to_pdf('report.docx') # 生成 report.pdfpackage main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
)
// DocxToPdf 使用 LibreOffice 将 docx 转为 pdf
func DocxToPdf(inputPath string) (string, error) {
// 检查输入文件是否存在
if _, err := os.Stat(inputPath); os.IsNotExist(err) {
return "", fmt.Errorf("输入文件不存在: %s", inputPath)
}
// 获取输出路径(与输入同目录,扩展名改为 .pdf)
ext := filepath.Ext(inputPath)
outputPath := inputPath[0:len(inputPath)-len(ext)] + ".pdf"
// 构造 LibreOffice 命令
cmd := exec.Command("soffice",
"--headless",
"--convert-to", "pdf",
"--outdir", filepath.Dir(inputPath),
inputPath,
)
// 执行并捕获错误
output, err := cmd.CombinedOutput()
if err != nil {
return "", fmt.Errorf("转换失败: %s, %v", string(output), err)
}
return outputPath, nil
}
func main() {
// 示例
path, err := DocxToPdf("report.docx")
if err != nil {
fmt.Println("错误:", err)
return
}
fmt.Println("生成文件:", path)
}const { execSync } = require('child_process');
const path = require('path');
const fs = require('fs');
/**
* 使用 LibreOffice 命令行将 docx 转为 pdf
* 需要系统已安装 LibreOffice 并配置 PATH
*/
function docxToPdf(inputPath) {
// 验证输入文件存在
if (!fs.existsSync(inputPath)) {
throw new Error(`输入文件不存在: ${inputPath}`);
}
const inputFile = path.resolve(inputPath);
const outputDir = path.dirname(inputFile);
// 构造命令
const cmd = [
'soffice',
'--headless',
'--convert-to', 'pdf',
'--outdir', outputDir,
inputFile
].join(' ');
try {
// 同步执行,超时 60 秒
execSync(cmd, { timeout: 60000, stdio: 'pipe' });
// 输出文件路径:同目录,改扩展名
const ext = path.extname(inputFile);
const outputPath = inputFile.slice(0, -ext.length) + '.pdf';
return outputPath;
} catch (err) {
throw new Error(`转换失败: ${err.stderr || err.message}`);
}
}
// 示例
// console.log(docxToPdf('report.docx'));8 个高频疑问
「Office 转换」下的其他工具