如何在MS Access中自动合并PDF?Access2010适配64位Win10的替代方案
免费替代方案解决Access 2010在64位Win10下合并PDF的问题
我之前也踩过64位Windows系统下Access调用32位第三方DLL的坑,给你几个不用掏钱包的可行方案:
方案1:使用开源免费的Ghostscript命令行工具
Ghostscript是完全免费的开源工具,原生支持PDF合并,步骤很简单:
- 下载匹配你64位Win10的Ghostscript版本安装(如果你的Access是32位,就选32位Ghostscript,避免位数不兼容)
- 在Access VBA里用
Shell函数调用其命令行命令完成合并,示例代码:
Sub MergePDFsWithGhostscript() Dim gsPath As String Dim inputFiles As String Dim outputFile As String ' 替换为你的Ghostscript实际安装路径 gsPath = "C:\Program Files\gs\gs10.02.0\bin\gswin64c.exe" ' 要合并的PDF列表,路径带空格的话用双引号包裹 inputFiles = """C:\我的PDF\文件1.pdf"" ""C:\我的PDF\文件2.pdf""" ' 合并后的输出文件路径 outputFile = """C:\我的PDF\合并完成.pdf""" ' 构建Ghostscript命令参数:-dBATCH -dNOPAUSE 执行后自动退出,-sDEVICE=pdfwrite 指定输出为PDF Dim cmd As String cmd = gsPath & " -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=" & outputFile & " " & inputFiles ' 后台执行命令,不显示命令行窗口 Shell cmd, vbHide End Sub
方案2:利用Office自身的Word对象模型(无需额外软件)
如果你电脑装了Word 2010或更高版本,可以直接通过VBA调用Word来合并PDF,不用额外装工具:
- 思路是让Word逐个打开PDF文件,把内容复制到一个新文档,最后导出成PDF
- 示例代码:
Sub MergePDFsWithWord() Dim wordApp As Object Dim newDoc As Object Dim file As Variant Dim filesToMerge As Variant ' 要合并的PDF文件数组,可根据自己需求修改 filesToMerge = Array("C:\我的PDF\文件1.pdf", "C:\我的PDF\文件2.pdf") Set wordApp = CreateObject("Word.Application") wordApp.Visible = False ' 后台运行,不弹出Word窗口 Set newDoc = wordApp.Documents.Add For Each file In filesToMerge ' 打开PDF文件(Word 2010及以后支持直接打开PDF) Dim tempDoc As Object Set tempDoc = wordApp.Documents.Open(file, ReadOnly:=True) ' 复制当前PDF的所有内容到新文档 tempDoc.Content.Copy newDoc.Content.Paste tempDoc.Close SaveChanges:=False Set tempDoc = Nothing Next file ' 导出合并后的文档为PDF(17对应Word的wdExportFormatPDF常量) newDoc.ExportAsFixedFormat OutputFileName:="C:\我的PDF\合并完成.pdf", _ ExportFormat:=17 newDoc.Close SaveChanges:=False wordApp.Quit Set newDoc = Nothing Set wordApp = Nothing MsgBox "PDF合并完成!" End Sub
注:这个方法对复杂格式的PDF(比如带大量矢量图、特殊字体)可能有轻微格式偏差,但常规文档完全够用。
方案3:适配64位环境的DynaPDF.dll调用
如果你还是想用Leban的原思路,问题大概率是原DynaPDF.dll是32位,和64位系统/64位Access不兼容:
- 找64位版本的DynaPDF.dll(注意确认许可,部分非商用版本是免费的)
- 调整VBA代码中的API声明,适配64位环境:在
Declare语句前加PtrSafe,用LongPtr替代原来的Long类型,示例:
#If VBA7 Then Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr #Else Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long #End If
这样修改后就能兼容32位和64位Access环境了。
这些方案都是免费可用的,不用付费就能解决问题,你可以根据自己的需求选最合适的一种。
内容的提问来源于stack exchange,提问作者user525966
相关产品推荐
相关产品推荐

