Board logo

标题: [文件操作] [已解决]批处理按照顺序合并PDF 文件 [打印本页]

作者: feiyan    时间: 2023-6-24 19:11     标题: [已解决]批处理按照顺序合并PDF 文件

1.在当前目录有多个文件夹,每个文件夹内有多个PDF 文件。
2.想把每个文件内的多个pdf 文件合并成一个pdf,存在在这个文件夹内,用这个文件夹名来命名这个合并PDF 文件。

举例,文件夹名称:S123     包含(1.pdf, 2.pdf, 3.pdf, 4.pdf,5.pdf)等多个pdf 文件,要求合并后文件名称是S123,
在当前目录下,这样类似的文件夹有多个。
作者: 77七    时间: 2023-6-24 21:19

  1. @echo off
  2. rem 站内下载pdftk,修改为实际路径
  3. set "pdftk=C:\PDFtk\PDFtk\pdftk.exe"
  4. for /d %%d in (*) do (
  5. pushd "%%d"
  6. setlocal enabledelayedexpansion
  7. for /f "delims=" %%a in ('dir /b /a-d *.pdf ^|findstr /vbc:"S" /vbc:"D C F" /vbc:"D C S" /vbc:"D P" /vbc:"D F"') do (
  8. set "str=!str! "%%a""
  9. )
  10. "%pdftk%" "S*.pdf" "D C F*.pdf" "D C S*.pdf" !str! "D P*.pdf" "D F*.pdf" cat output "%%~nxd.pdf"
  11. endlocal
  12. popd
  13. )
  14. pause
复制代码

作者: Batcher    时间: 2023-6-25 07:45

回复 2# 77七


    findstr的这些条件是为了满足顶楼的哪个需求?
作者: Batcher    时间: 2023-6-25 07:52

回复 1# feiyan


test-1.bat
  1. @echo off
  2. REM 1、下载命令行工具PDFtk
  3. REM http://bcn.bathome.net/s/tool/index.html?key=PDFtk
  4. REM 2、根据自己电脑实际安装路径设置以下临时环境变量
  5. set "path=C:\Program Files (x86)\PDFtk Server\bin;%path%"
  6. cd /d "%~dp0"
  7. for /d %%i in (*) do (
  8.     pushd "%%i"
  9.     echo 正在处理文件夹:%%i
  10.     pdftk.exe *.pdf cat output "%%~nxi.pdf"
  11.     popd
  12. )
  13. pause
复制代码

作者: Batcher    时间: 2023-6-25 07:54

回复 1# feiyan


test-2.bat
  1. @echo off
  2. REM 1、下载命令行工具PDFtk
  3. REM http://bcn.bathome.net/s/tool/index.html?key=PDFtk
  4. REM 2、根据自己电脑实际安装路径设置以下临时环境变量
  5. set "path=C:\Program Files (x86)\PDFtk Server\bin;%path%"
  6. cd /d "%~dp0"
  7. for /f "delims=" %%i in ('dir /b /ad') do (
  8.     pushd "%%i"
  9.     echo 正在处理文件夹:%%i
  10.     pdftk.exe *.pdf cat output "%%~nxi.pdf"
  11.     popd
  12. )
  13. pause
复制代码

作者: 77七    时间: 2023-6-25 11:51

回复 3# Batcher
站长,是这样的,楼主编辑了顶楼,把需求改简单了,之前是根据文件名开头指定了顺序合并,考虑楼主问题未解决,我就把原始需求的代码发上来了。
作者: feiyan    时间: 2023-6-25 12:13

回复 2# 77七
感谢77,当时我发现我描述的有点复杂,怕难以实现,后来就重新编辑了下,把要求变的简单点了,
其实我发现只要在  pdftk *.pdf  cat   (这个地方,使用首字母加通配符也可以达到我的要求,和你的思路有点类似,但是我的三角猫技术,不会把合并后的文件名称变成和文件夹名称一致。也不会把所有的文件夹都这样操作
你这个我跑了下,无法成功。
作者: feiyan    时间: 2023-6-25 12:30

回复 5# Batcher
感谢管理员batcher, 我拷贝试了下,无法成功,我还怕我的路径和你的不一样,特地在 bin 添加\pdftk.exe, 添加这个和不添加这个,我都试了下,还是无法成功
但是我使用最小白的方式,是可以合并的,证明我的软件是可以起作用的。(pdftk.exe *.pdf cat output 11.pdf)
作者: 77七    时间: 2023-6-25 13:07

回复 7# feiyan

提示什么?
   把批处理保存为ansi编码格式,试试。
作者: Batcher    时间: 2023-6-25 14:29

回复 8# feiyan


请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
作者: feiyan    时间: 2023-6-25 19:09

回复 10# Batcher
感谢,是我失误了,我把这个批处理放在这个文件夹里面,难怪一直不成功,放在外面就OK了
作者: feiyan    时间: 2023-6-25 19:12

回复 9# 77七
是我失误了,我把这个批处理放在文件夹里面了,所以一直不成功,放在外面就OK 了,感谢
作者: feiyan    时间: 2023-7-3 20:10

回复 2# 77七


    @77七  77你好,是这样的,这个我用这个代码尝试下,发现最后会多合并几个文件进去,就是之前已经被定义顺序的这几个文件,也就是在( !str! )之前的几个文件名,最后还是会被重复合并到整个文件中。
作者: 77七    时间: 2023-7-4 18:58

回复 13# feiyan


  
  1. @echo off
  2. rem 站内下载pdftk,修改为实际路径
  3. set "pdftk=C:\PDFtk\PDFtk\pdftk.exe"
  4. for /d %%d in (*) do (
  5. pushd "%%d"
  6. setlocal enabledelayedexpansion
  7. for /f "delims=" %%a in ('dir /b /a-d *.pdf ^|findstr /vbc:"S" /vbc:"D C F" /vbc:"D C S" /vbc:"D P" /vbc:"D F"') do (
  8. set "str=!str! "%%a""
  9. )
  10. "%pdftk%" "S*.pdf" "D C F*.pdf" "D C S*.pdf" !str! "D P*.pdf" "D F*.pdf" cat output "%~dp0%%~nxd.pdf"
  11. endlocal
  12. popd
  13. if exist "%%~nxd.pdf" (
  14. move "%%~nxd.pdf" "%%d"
  15. )
  16. )
  17. pause
复制代码

作者: feiyan    时间: 2023-7-4 20:13

回复 14# 77七
感谢77.
作者: feiyan    时间: 2023-7-4 20:51

回复 14# 77七

77,能不能麻烦你在添加一个小功能呢,就是我给排序这些文件名,如果有一两个是实际上是不存在的,就是空有文件名,而实际没有这个文件,也可以 忽视掉,直接合并。现在是如果文件夹少一个文件的话,就会提示无法合并。
作者: 77七    时间: 2023-7-5 07:13

本帖最后由 77七 于 2023-7-6 14:32 编辑

回复 16# feiyan


  1. @echo off
  2. rem 站内下载pdftk,修改为实际路径
  3. set "pdftk=C:\PDFtk\PDFtk\pdftk.exe"
  4. for /d %%d in (*) do (
  5. pushd "%%d"
  6. setlocal enabledelayedexpansion
  7. for %%a in (S*.pdf) do set "str=!str! "%%a""
  8. for %%a in ("D C F*.pdf") do set "str=!str! "%%a""
  9. for %%a in ("D C S*.pdf") do set "str=!str! "%%a""
  10. for /f "delims=" %%a in ('dir /b /a-d *.pdf ^|findstr /rvb /c:"S" /c:"D C F" /c:"D C S" /c:"D P" /c:"D F"') do (
  11. set "str=!str! "%%a""
  12. )
  13. for %%a in ("D P*.pdf") do set "str=!str! "%%a""
  14. for %%a in ("D F*.pdf") do set "str=!str! "%%a""
  15. "%pdftk%" !str! cat output "%%~nxd.pdf"
  16. move /y "%%~nxd.pdf" ..
  17. endlocal
  18. popd
  19. )
  20. pause
复制代码

作者: feiyan    时间: 2023-7-5 15:17

回复 17# 77七
感谢77,想请你喝杯水,不知怎么操作
作者: 77七    时间: 2023-7-5 17:38

回复 18# feiyan

你的好意我心领了,谢谢。
作者: feiyan    时间: 2023-7-6 11:04

回复 19# 77七
77, 能麻烦修改下参数,把合并后文件输出到当前目录下,不用放到文件夹内,而且,如果当前目录已经存在相同的文件名的话,直接覆盖掉。
作者: 77七    时间: 2023-7-6 11:41

回复 20# feiyan


   已在17楼修改。
作者: feiyan    时间: 2023-7-6 13:49

回复 21# 77七

提示框显示移动了一个文件,实际上没有移动,合并后的文件还是在文件夹内部,没有到和这个文件夹相同的这个目录下,也就是到文件夹外面来
作者: 77七    时间: 2023-7-6 14:03

回复 22# feiyan


   16行末尾少写一个 .加上就行了。
作者: qixiaobin0715    时间: 2023-7-6 14:15

好像不行。因为第5行pushd后,在popd前,点代表pushd后的路径。
16行的.换成"%~dp0"试试。包括引号额。
作者: feiyan    时间: 2023-7-6 14:24

回复 24# qixiaobin0715

好像不行,提示系统找不到指定的文件
作者: feiyan    时间: 2023-7-6 14:29

回复 23# 77七
试了下,提示:遇到错误,系统未能创建输出,
作者: 77七    时间: 2023-7-6 14:32

本帖最后由 77七 于 2023-7-6 14:33 编辑

回复 26# feiyan


   已编辑,现在直接复制17楼代码,试试
作者: feiyan    时间: 2023-7-6 15:07

回复 27# 77七 [/b
非常感谢,我测试了一下,成功了,高手啊 :) :)
作者: feiyan    时间: 2023-10-2 14:07

回复 27# 77七 hi 77,我发现合并后的pdf 文件没有书签,但是我手动合并的PDF 文件是有书签的,能否在程序中加上书签功能,就是合并后的pdf 文件自动带书签的。
作者: 77七    时间: 2023-10-2 16:09

回复 29# feiyan

我测试合并后是带书签的,先用以下代码把pdf文件处理一遍,再合并试试
  
  1. @echo off
  2. for %%a in (*.pdf) do (
  3. pdftk "%%a" cat output $.pdf
  4. pdftk "%%a" dump_data output report.txt
  5. pdftk $.pdf update_info report.txt output $1.pdf
  6. move $1.pdf "%%a"
  7. del $.pdf;report.txt
  8. )
  9. pause
复制代码

作者: feiyan    时间: 2023-10-2 18:40

回复 30# 77七 我试了下,不成功,还是没有书签,,77 你可以这样测试下看看,用excel 新建表格随便编辑下,另存为PDF 文件,命名1.pdf , 然后再用excel 编辑下另存为PDF,命名2.pdf, 把这两个合并后,你查看下是否有书签。
作者: 77七    时间: 2023-10-2 20:02

回复 31# feiyan



http://bcn.bathome.net/s/tool/index.html?key=pdfunite

  1. pdfunite 1.pdf 2.pdf out.pdf
复制代码




试试其它工具吧
作者: feiyan    时间: 2023-10-3 11:14

回复 32# 77七 下载了,不会安装,自己捣鼓了几下,弄不明白,感觉是适合linux 系统吧
作者: Batcher    时间: 2023-10-3 17:38

回复 33# feiyan


32楼代码保存为 test.bat 和待处理的pdf文件放在同一个目录下
下载 pdfunite 之后解压缩,把exe、dll文件和待处理的pdf文件放在同一个目录下
执行 test.bat 脚本
作者: feiyan    时间: 2023-10-3 17:50

回复 34# Batcher 版主,你看合并PDF 文件后,怎么能让合并后的pdf文件带上书签,我试了很多办法都不成功,你有好办法吗?
作者: Batcher    时间: 2023-10-4 08:16

回复 35# feiyan


    请向32楼回复测试结果
作者: feiyan    时间: 2023-10-4 11:12

回复 32# 77七 这个实验下来,还是没有书签
作者: 77七    时间: 2023-10-4 13:00

回复 37# feiyan


   你把保留书签失败的文件,和成功的文件,每样传两个到网盘发上来,看看他们有什么区别
作者: feiyan    时间: 2023-10-4 17:37

回复 38# 77七 hi 77,是这样的,我没有找到你说的网盘,没法上传文件,我把这个事情描述下,我使用excel ,随便输入几个数字,另存为PDF 文件,这样创建的几个PDF 文件,使用批处理合并,合并后就是没有书签,我就没有成功的案例来上传。后来,经过我的测试,我需要在合并前,为每一个PDF 文件手动添加书签,这样运行批处理合并后才能保留书签。但是我使用pdf 软件来手动来合并 ,就会自动生成书签。
作者: 77七    时间: 2023-10-4 18:20

回复 39# feiyan


   那就手动合并吧。大概理解 :  你说的书签可能和pdf文件的书签,是两回事,只不过你用其它软件,其它软件将它视为书签。
作者: feiyan    时间: 2023-10-4 21:19

回复 40# 77七 我说的书签,指的是pdf 软件上的书签按钮显示的数据,点击书签就可以直接跳转到对应的页面上,书签名称一般和文件名称相同。
作者: feiyan    时间: 2023-10-4 21:40

回复 40# 77七 [img]示意图  [/img]
作者: 77七    时间: 2023-10-4 22:16

回复 42# feiyan


   合并前,pdf文件有书签吗?
作者: feiyan    时间: 2023-10-5 11:09

回复 43# 77七 没有,合并前,pdf 文件没有书签
作者: 77七    时间: 2023-10-5 12:34

本帖最后由 77七 于 2024-1-13 13:25 编辑

回复 44# feiyan


  批处理调用pdftk 给无书签的pdf文件添加一个 文件名书签
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  5.         pdftk "%%i" dump_data_utf8 output |find "BookmarkTitle:" 1>nul
  6.         if errorlevel 1 (
  7.                 >report.txt (
  8.                         echo BookmarkBegin
  9.                         echo BookmarkTitle: %%~ni
  10.                         echo BookmarkLevel: 1
  11.                         echo BookmarkPageNumber: 1
  12.                 )
  13.                 pdftk "%%i" update_info_utf8 report.txt output $.pdf
  14.                 move $.pdf "%%i"
  15.         )
  16. )
  17. del report.txt
复制代码

2024年1月13号更新

  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. rem 仅给无书签的pdf文件添加文件名作为书签(part) ,所有文件添加(all)
  5. set "c=all"
  6. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  7. pdftk "%%i" dump_data_utf8 output >$
  8. setlocal
  9. if /i "%c%" equ "all" (
  10. call :1 "%%i"
  11. ) else if /i "%c%" equ "part" (
  12. find "BookmarkTitle:" <$ 1>nul || call :1 "%%i"
  13. )
  14. endlocal
  15. )
  16. del $;report.txt 2>nul
  17. pause & exit
  18. :1
  19. for /f "tokens=1* delims=[]" %%a in ('find /n "NumberOfPages: " ^<$') do (
  20. set #%%a=1
  21. )
  22. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<$') do (
  23. echo=%%b
  24. if defined #%%a (
  25. echo BookmarkBegin
  26. echo BookmarkTitle: %~n1
  27. echo BookmarkLevel: 1
  28. echo BookmarkPageNumber: 1
  29. )
  30. ))>report.txt
  31. pdftk "%~1" update_info_utf8 report.txt output $.pdf
  32. move $.pdf "%~1"
  33. exit /b
复制代码

作者: feiyan    时间: 2023-10-5 19:19

回复 45# 77七 感谢,程序测试OK
作者: yilianqiumeng    时间: 2023-10-29 17:23

我试了一下,不行啊?只是把pdftk软件运行打开了,它不会自动合并pdf文件呀?请大神看看是什么原因?
作者: yilianqiumeng    时间: 2023-10-29 17:37

回复 21# 77七


    大神,我用批处理合并pdf文件,合并不了啊,只是运行了pdftk软件,不能自动合并啊?
作者: 77七    时间: 2023-10-29 17:44

回复 48# yilianqiumeng


   你用的哪一楼的代码?我写的只是满足了楼主的按顺序要求,你试一下4、5楼站长的代码
作者: yilianqiumeng    时间: 2023-10-29 17:57

回复 49# 77七


    不行,我用了5楼的代码也只是运行pdftk软件,不会自动合并的。请大神看看有没有别的方法吧?给指导一下!谢谢
作者: 77七    时间: 2023-10-29 18:14

回复 50# yilianqiumeng


   请完整描述一下需求吧,不知道你具体需要怎么合并
作者: yilianqiumeng    时间: 2023-10-29 18:58

回复 51# 77七


   我的问题和他的一样的:就是一键把每个文件夹内的pdf文件合并起来,手动合并太慢了!请大神指教!谢谢

1.在当前目录有多个文件夹,每个文件夹内有多个PDF 文件。
2.想把每个文件内的多个pdf 文件合并成一个pdf,存在在这个文件夹内,用这个文件夹名来命名这个合并PDF 文件。
举例,文件夹名称:S123     包含(1.pdf, 2.pdf, 3.pdf, 4.pdf,5.pdf)等多个pdf 文件,要求合并后文件名称是S123,
在当前目录下,这样类似的文件夹有多个。
作者: 77七    时间: 2023-10-29 19:10

本帖最后由 77七 于 2023-10-29 19:11 编辑

回复 52# yilianqiumeng


  
  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. cd /d "%~dp0"
  4. for /f "delims=" %%i in ('dir /b /ad') do (
  5.     pushd "%%i"
  6.     echo 正在处理文件夹:%%i
  7.     "d:\新建文件夹\pdftk.exe" *.pdf cat output "%%~nxi.pdf"
  8.     popd
  9. )
  10. pause
复制代码
可能你的path的路径没设置对吧,修改了下5楼代码,在代码中直接写pdftk路径,自行修改为实际路径,批处理文件放在 “当前目录”下
作者: 佛笑崖    时间: 2024-7-30 15:40

回复 53# 77七


    大佬实在太牛了,解决了痛点
作者: ailier532    时间: 2024-9-27 10:14

回复 45# 77七


    第二段代码是给PDF文件以文件名添加书签用的,但是还是要每一个文件夹去复制粘贴并运行一次,能不能将两段代码合并成一个,实现自动添加标签自动合并?
请大佬帮帮我,万分感谢!!
作者: 77七    时间: 2024-9-27 13:32

回复 55# ailier532

遍历批处理文件所在目录下所有文件夹,添加书签后合并,删除源文件、及添加书签后的文件、空文件夹。使用前先备份。
  1. @echo off
  2. chcp 65001 >nul
  3. rem 批处理保存为utf-8编码格式
  4. cd /d "%~dp0"
  5. rem 仅给无书签的pdf文件添加文件名作为书签(part) ,所有文件添加(all)
  6. set "c=all"
  7. for /d %%d in (*) do (
  8. if exist "%%d\*.pdf" (
  9. pushd "%%d"
  10. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  11. pdftk "%%i" dump_data_utf8 output >$
  12. setlocal
  13. if /i "%c%" equ "all" (
  14. call :1 "%%i"
  15. ) else if /i "%c%" equ "part" (
  16. find "BookmarkTitle:" <$ 1>nul || call :1 "%%i"
  17. )
  18. endlocal
  19. )
  20. pdftk *.pdf cat output "%~dp0%%~nxd.pdf"
  21. rem 删除pdf
  22. del *.pdf 2>nul
  23. del $;report.txt 2>nul
  24. popd
  25. rd "%%d" 2>nul
  26. )
  27. )
  28. pause & exit
  29. :1
  30. for /f "tokens=1* delims=[]" %%a in ('find /n "NumberOfPages: " ^<$') do (
  31. set #%%a=1
  32. )
  33. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<$') do (
  34. echo=%%b
  35. if defined #%%a (
  36. echo BookmarkBegin
  37. echo BookmarkTitle: %~n1
  38. echo BookmarkLevel: 1
  39. echo BookmarkPageNumber: 1
  40. )
  41. ))>report.txt
  42. pdftk "%~1" update_info_utf8 report.txt output $.pdf
  43. move $.pdf "%~1"
  44. exit /b
复制代码

作者: ailier532    时间: 2024-9-27 14:57

回复 56# 77七


    pdftk'is not recognized as an
internal or external command,
operable program or batch file.
我把PDFTK放在BAT一个目录下的啊
作者: 77七    时间: 2024-9-27 15:05

回复 57# ailier532




参考 https://jingyan.baidu.com/article/b907e627b5b4b707e7891cc1.html 添加到环境变量

或者写明 pdftk.exe 的路径,多处pdftk都要修改,
  1. "d:\pdftk\pdftk.exe" *.pdf cat output "%~dp0%%~nxd.pdf"
复制代码

作者: ailier532    时间: 2024-9-27 15:33

回复 58# 77七


    通过改环境变量搞定,测试成功!膜拜大佬!非常感谢!!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2