怎么批量将多个Word文档转换为PDF

拾光
拾光
发布时间:2026-11-06 | 9人浏览过
原创

本文介绍在 Windows 环境下,利用 PowerShell 调用桌面版 Word 的 COM 接口,实现 .doc/.docx 文件批量导出为 PDF。通过自动化脚本依次处理文件夹内的文档,生成独立的 PDF 文件及转换记录日志,避免手动逐个另存为的繁琐操作,同时保留原始文档以便后续修改。

批量转换后,每份 Word 文档都会生成一份独立的 PDF,原始文档依然保留,方便随时修改。这种方法利用 Windows 桌面版 Word 配合 PowerShell 脚本,自动读取指定文件夹中的文档并依次导出,同时记录成功、失败和跳过的文件状态,省去了逐份打开文档再手动另存为的重复劳动。

怎么批量将多个Word文档转换为PDF

批量转换后的PDF文件列表与原始Word文档对比

1. 整理待转换文档,先确认能正常导出

本方法依赖电脑已安装并能正常启动的 Windows 桌面版 Microsoft Word,仅拥有网页版 Word 无法运行此自动化脚本。首先在本地建立一个专用文件夹,例如 C:\Word待转换,将需要处理的 .doc 或 .docx 文件副本放入其中。脚本默认只处理该文件夹第一层的文件,不扫描子文件夹,也不处理 .docm 等包含宏的特殊格式。

在开始批量操作前,先打开其中一份文档,检查字体、分页和图片显示是否正常。接着从【文件】菜单进入【另存为】,选择本地位置,将保存类型设为 PDF 并保存。打开生成的 PDF 文件,核对页数与主要版式是否与 Word 中一致。这个简单的预检查有助于区分是文档本身的问题还是后续脚本运行的问题。

确认无误后,关闭这份 PDF,并保存、关闭所有正在编辑的 Word 文档。初次尝试时,建议只在文件夹中放置两份副本进行试运行,成功后再加入其余文件。需要注意的是,如果文档设有打开密码、权限限制、受保护视图提示或文件损坏,应先单独处理,不要将它们混入批量转换的普通文档中。

2. 打开 Windows PowerShell,粘贴完整转换脚本

在 Windows 开始菜单中搜索并打开【Windows PowerShell】,通常无需以管理员身份运行。请确保脚本第一行指定的路径与你准备好的文件夹一致,然后将下方的完整代码块一次性粘贴到 PowerShell 窗口中。如果系统询问是否粘贴多行命令,核对内容后确认即可,必要时在代码末尾按 Enter 键执行。

& {
    $sourceFolder = 'C:\Word待转换'
    if (-not (Test-Path -LiteralPath $sourceFolder -PathType Container)) {
        throw "文件夹不存在:$sourceFolder"
    }
    $sourceFolder = (Resolve-Path -LiteralPath $sourceFolder).Path
    $files = @(Get-ChildItem -LiteralPath $sourceFolder -File -ErrorAction Stop |
        Where-Object {
            $_.Extension.ToLowerInvariant() -in @('.doc', '.docx') -and
            -not $_.Name.StartsWith('~$')
        } | Sort-Object Name)
    if ($files.Count -eq 0) {
        throw '当前文件夹没有可处理的 .doc 或 .docx 文件。'
    }

    $outputFolder = Join-Path $sourceFolder 'PDF'
    [void][IO.Directory]::CreateDirectory($outputFolder)
    $logPath = Join-Path $outputFolder (
        '转换记录-' + [guid]::NewGuid().ToString('N') + '.csv')
    $word = $null
    $documents = $null
    $oldSecurity = $null
    $records = @()

    try {
        $word = New-Object -ComObject Word.Application -ErrorAction Stop
        $word.Visible = $true
        $oldSecurity = $word.AutomationSecurity
        $word.AutomationSecurity = 3
        $documents = $word.Documents

        foreach ($file in $files) {
            $target = Join-Path $outputFolder ($file.Name + '.pdf')
            if (Test-Path -LiteralPath $target) {
                $records += [pscustomobject]@{
                    Source = $file.FullName; PDF = $target
                    Status = 'SkippedExisting'; Detail = '已存在,未转换'
                }
                continue
            }
            $tempPDF = Join-Path $outputFolder (
                '.转换中-' + [guid]::NewGuid().ToString('N') + '.pdf')
            $doc = $null
            try {
                Write-Host ("正在转换:{0}" -f $file.Name)
                $doc = $documents.Open($file.FullName, $false, $true, $false)
                $doc.ExportAsFixedFormat($tempPDF, 17)
                $made = Get-Item -LiteralPath $tempPDF -ErrorAction Stop
                if ($made.Length -eq 0) { throw '导出文件为空。' }
                Move-Item -LiteralPath $tempPDF -Destination $target -ErrorAction Stop
                $records += [pscustomobject]@{
                    Source = $file.FullName; PDF = $target
                    Status = 'Exported'; Detail = '已导出,待检查版式'
                }
            }
            catch {
                $records += [pscustomobject]@{
                    Source = $file.FullName; PDF = $target
                    Status = 'Failed'; Detail = $_.Exception.Message
                }
                Remove-Item -LiteralPath $tempPDF -ErrorAction SilentlyContinue
            }
            finally {
                if ($null -ne $doc) {
                    try { $doc.Close(0) }
                    catch { Write-Warning $_.Exception.Message }
                    [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($doc)
                    $doc = $null
                }
            }
        }
    }
    finally {
        if ($records.Count -gt 0) {
            try {
                $records | Export-Csv -LiteralPath $logPath -NoTypeInformation -Encoding UTF8 -NoClobber -ErrorAction Stop
                Write-Host ("记录文件:{0}" -f $logPath)
            }
            catch { Write-Warning ("记录保存失败:{0}" -f $_.Exception.Message) }
        }
        if ($null -ne $word) {
            try {
                if ($null -ne $oldSecurity) {
                    $word.AutomationSecurity = $oldSecurity
                }
            }
            finally {
                try { $word.Quit(0) }
                finally {
                    if ($null -ne $documents) {
                        [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($documents)
                    }
                    [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($word)
                }
            }
        }
    }
    $records | Format-Table Status, Source, PDF -AutoSize
}

怎么批量将多个Word文档转换为PDF

PowerShell窗口中运行批量转换脚本的过程

这段代码会启动一个可见的 Word 自动化窗口,按顺序以只读方式打开文档,并调用 Word 自带的 PDF 导出接口。运行期间请勿在该 Word 窗口中编辑或打开其他文件,让脚本完成后自行关闭它。其中,ExportAsFixedFormat 的参数 17 代表 PDF 格式;Documents.Open 的第三个参数为 true,表示只读打开;关闭文档时使用参数 0,表示不保存对原文件的任何潜在变动。脚本还会临时禁用宏运行以确保安全,并在结束时恢复 Word 原有的设置。

3. 查看 PDF 文件夹和逐份转换记录

脚本运行结束后,会在源文件夹中创建一个名为 PDF 的子文件夹。为了避免“报告.doc”和“报告.docx”因文件名相似而争用同一个输出名称,脚本会保留完整的原文件名并追加 .pdf 后缀。因此,示例中的“会议纪要.docx”会转换为“会议纪要.docx.pdf”。在 Windows 默认隐藏已知文件扩展名的设置下,显示名称可能会简化,但文件本质仍是 PDF。

每次运行还会在 PDF 文件夹中生成一个名称以“转换记录-”开头的 CSV 文件。你可以使用 Excel 或记事本打开它,通过 Source 列对照源文件,通过 Status 列查看处理结果:

  1. Exported:表示导出接口已成功返回并生成了非空文件,但仍需人工检查内容和版式。
  2. SkippedExisting:表示目标位置已存在同名文件,本次未进行转换,这不计入新导出的成功数量。
  3. Failed:表示该文件在处理过程中发生错误,具体错误信息保存在 Detail 列中,其他文件仍会继续处理。

脚本采用先导出到临时文件(名称以“.转换中-”开头),确认文件非空后再移动到目标名称的策略。普通的导出错误会被记录并尝试清理临时文件;但如果中途强制关闭 PowerShell 或 Word,可能会残留临时文件,需后续核对清理。如果运行伊始就报 Word.Application 创建失败,请确认桌面版 Word 能在当前 Windows 账号下正常启动。若脚本停在某个文档并弹出密码、权限或修复对话框,需在 Word 窗口中人工处理,脚本不会自动回答这些弹窗。

4. 对照原稿检查 PDF,再保留转换方案

打开每一份正式生成的 PDF,核对文件能否正常读取、页数是否符合预期,并重点查看表格跨页、页眉页脚、图片位置及特殊字体的渲染情况。“文件非空”和“记录为 Exported”仅代表技术上的导出完成,不能替代排版验收。对于重要文件,建议逐页确认。如果发现差异,应回到对应的 Word 副本进行调整,然后重新导出。

如果修改了原文档并需要更新 PDF,请先将旧 PDF 移走或备份,因为直接重跑脚本会跳过已存在的同名目标文件,导致无法通过文件数量判断内容是否刷新。对于之前失败的文件,在排除原因后可以单独放入一个文件夹,修改脚本中的路径后再次处理。

确认各份 PDF 内容无误后,建议保留原始 Word 文档、正式 PDF 文件以及本次生成的 CSV 记录。如果需要经常执行此类转换,可以将代码保存为 UTF-8 带 BOM 编码的 .ps1 文件,以便 Windows PowerShell 5.1 正确读取中文路径和注释。下次使用时,只需核对源路径和已有输出,即可按组织允许的方式快速运行。

怎么批量将多个Word文档转换为PDF

4. 对照原稿检查 PDF,再保留转换方案

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表