[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

VBS 利用pdftk 依关键字,合并多文件夹下PDF文件到一个PDF文件

感谢,感谢。

通过网盘分享的文件:pdftk合并多个PDF到1个PDF文件.rar
链接: https://pan.baidu.com/s/1ZAbSX9q2J3IVviQymdFf9g?pwd=gtt4 提取码: gtt4
--来自百度网盘超级会员v9的分享

上面是需要的示例文件
下面是想实现的操作
=====
求VBS代码
pdftk 所在目录下有 若干个文件夹 每个文件中有不同数量的PDF文件 想把文件名中包含相同关键字
如“张三,李四,王五,牛七”的文件合并成一个文件,
合并后的文件文件放在 月日四位日期编号+个人学习资料 文件夹内  如0104个人学习资料



“张三,李四,王五,牛七”
是把有上述关键的PDF文件合并到以关键字+的个人学习资料+日期  如,张三的个人学习资料1.4.pdf
日期格式用月.日,如1月4日就是1.4
另外 生成新文件的文件夹月份前面少了一个0



完成后,提示是否删除源文件。

下面是AI写的代码,没成功,不知道有没有借鉴意义。
  1. ' 创建文件系统对象
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. ' 定义要搜索的关键字
  4. Dim keywords
  5. keywords = Array("张三", "李四", "王五", "牛七")
  6. ' 获取当前目录
  7. Dim currentDir
  8. currentDir = fso.GetAbsolutePathName(".")
  9. ' 获取当前日期并修改格式为月日(两位)用于文件夹名称
  10. Dim folderDate
  11. folderDate = Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2)
  12. ' 获取当前日期并修改格式为月.日用于 PDF 文件名
  13. Dim pdfDate
  14. pdfDate = Month(Date) & "." & Day(Date)
  15. ' 存储要合并的文件列表
  16. Dim mergeList
  17. Set mergeList = CreateObject("System.Collections.ArrayList")
  18. ' 遍历当前目录下的所有文件夹
  19. Dim subFolder
  20. For Each subFolder In fso.GetFolder(currentDir).SubFolders
  21.     ' 遍历每个子文件夹中的文件
  22.     Dim file
  23.     For Each file In subFolder.Files
  24.         Dim fileName
  25.         fileName = file.Name
  26.         Dim i
  27.         For i = 0 To UBound(keywords)
  28.             If InStr(fileName, keywords(i)) > 0 Then
  29.                 ' 确保文件存在且可访问,并且是 PDF 文件
  30.                 If fso.FileExists(file.Path) And LCase(Right(file.Path, 4)) = ".pdf" Then
  31.                     ' 对文件路径进行更严谨的处理,去除可能的多余空格和特殊字符
  32.                     Dim cleanPath
  33.                     cleanPath = Trim(file.Path)
  34.                     mergeList.Add("""" & Replace(cleanPath, """", "\""") & """")
  35.                 End If
  36.                 Exit For
  37.             End If
  38.         Next
  39.     Next
  40. End For
  41. ' 遍历关键字并执行合并操作
  42. Dim keyword
  43. For Each keyword In keywords
  44.     ' 定义目标文件夹
  45.     Dim targetFolder
  46.     targetFolder = currentDir & "\" & folderDate & "个人学习资料" & "\" & keyword & "的个人学习资料"
  47.    
  48.     ' 检查并创建目标文件夹
  49.     If Not fso.FolderExists(targetFolder) Then
  50.         fso.CreateFolder(targetFolder)
  51.     End If
  52.    
  53.     ' 构建合并命令
  54.     Dim command
  55.     Dim pdftkPath
  56.     pdftkPath = fso.BuildPath(currentDir, "pdftk.exe")
  57.     command = """" & pdftkPath & """ "
  58.     Dim subMergeList
  59.     Set subMergeList = CreateObject("System.Collections.ArrayList")
  60.     For Each item In mergeList
  61.         If InStr(item, keyword) > 0 Then
  62.             subMergeList.Add(item)
  63.         End If
  64.     End If
  65.     Dim itemList
  66.     itemList = ""
  67.     For Each item In subMergeList
  68.         itemList = itemList & item & " "
  69.     Next
  70.     command = command & itemList & "cat output " & """" & targetFolder & "\" & keyword & "的个人学习资料" & pdfDate & ".pdf"""
  71.    
  72.     ' 执行合并命令
  73.     Dim shell
  74.     Set shell = CreateObject("WScript.Shell")
  75.     On Error Resume Next ' 开启错误处理
  76.     shell.Run command, 1, True ' 显示窗口,方便查看错误信息
  77.     If Err.Number <> 0 Then
  78.         WScript.Echo "执行命令时出错: " & Err.Description & " 命令: " & command
  79.         Err.Clear
  80.     End If
  81.     On Error GoTo 0 ' 关闭错误处理
  82.     Set shell = Nothing
  83.     Set subMergeList = Nothing
  84. Next
  85. ' 释放对象
  86. Set fso = Nothing
  87. Set mergeList = Nothing
复制代码
QQ1210362180

本帖最后由 flashercs 于 2025-1-6 11:31 编辑
  1. ' On Error Resume Next ' 开启错误处理
  2. ' 创建文件系统对象
  3. Set fso = CreateObject("Scripting.FileSystemObject")
  4. ' 定义要搜索的关键字
  5. Dim keywords
  6. keywords = Array("张三", "李四", "王五", "牛七")
  7. ' 获取当前目录
  8. Dim currentDir
  9. currentDir = fso.GetAbsolutePathName(".")
  10. ' 获取当前日期并修改格式为月日(两位)用于文件夹名称
  11. Dim folderDate
  12. folderDate = Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2)
  13. ' 获取当前日期并修改格式为月.日用于 PDF 文件名
  14. Dim pdfDate
  15. pdfDate = Month(Date) & "." & Day(Date)
  16. Dim command
  17. Dim pdftkPath
  18. pdftkPath = fso.BuildPath(currentDir, "pdftk.exe")
  19. Dim shell
  20. Set shell = CreateObject("WScript.Shell")
  21. ' WScript.Quit
  22. ' 遍历关键字并执行合并操作
  23. Dim keyword,targetFolderRoot
  24. targetFolderRoot = currentDir & "\" & folderDate & "个人学习资料"
  25. If Not fso.FolderExists(targetFolderRoot) Then
  26.    fso.CreateFolder targetFolderRoot
  27. End If
  28. For Each keyword In keywords
  29.     ' 定义目标文件夹
  30.     Dim targetFolder
  31.     targetFolder = targetFolderRoot & "\" & keyword & "的个人学习资料"
  32.    
  33.     ' 检查并创建目标文件夹
  34.     If Not fso.FolderExists(targetFolder) Then
  35.         fso.CreateFolder targetFolder
  36.     End If
  37.    
  38.     ' 构建合并命令
  39.     command = """" & pdftkPath & """ "
  40.     For Each subFolder In fso.GetFolder(currentDir).SubFolders
  41.         If subFolder.Path <> targetFolderRoot Then
  42.             For Each file In subFolder.Files
  43.                 If InStr(1,file.Name, keyword,vbTextCompare) > 0 And LCase(fso.GetExtensionName(file.Name)) = "pdf" Then
  44.                     command = command & """" & file.Path & """ "
  45.                 End If
  46.             Next
  47.         End If
  48.     Next
  49.     command = command & " cat output " & """" & targetFolder & "\" & keyword & "的个人学习资料" & pdfDate & ".pdf"""
  50.     ' 执行合并命令
  51.     shell.Run command, 0, True ' 显示窗口,方便查看错误信息
  52.     If Err.Number <> 0 Then
  53.         WScript.Echo "执行命令时出错: " & Err.Description & " 命令: " & command
  54.         Err.Clear
  55.     End If
  56.    
  57. Next
  58. Dim result
  59. result = MsgBox("PDF合并完成,是否删除原文件所在的文件夹?", vbQuestion Or vbYesNo Or vbSystemModal, "提示")
  60. If result = 6 Then
  61.     ' 删除原文件所在的文件夹
  62.     For Each subFolder In fso.GetFolder(currentDir).SubFolders
  63.         If subFolder.Path <> targetFolderRoot Then
  64.             subFolder.Delete True
  65.         End If
  66.     Next
  67. End If
复制代码
微信:flashercs
QQ:49908356

TOP

回复 2# flashercs


    感谢 测试成功
QQ1210362180

TOP

回复 2# flashercs


    你好,合并文件结束后,我想让代码直接删除源文件所在的文件夹,只保留合并后的文件平,帮我改一下,谢谢
QQ1210362180

TOP

回复 2# flashercs


    你好,合并文件结束后,我想让代码直接删除源文件所在的文件夹,只保留合并后的文件夹,帮我改一下,谢谢
QQ1210362180

TOP

上面修改了
微信:flashercs
QQ:49908356

TOP

回复 6# flashercs


    感谢
QQ1210362180

TOP

返回列表