Board logo

标题: [文件操作] 批处理怎样实现奇数页的pdf最后一页插入空白页? [打印本页]

作者: 暴雪英雄    时间: 2024-3-15 13:05     标题: 批处理怎样实现奇数页的pdf最后一页插入空白页?

工作中,需要将多个pdf文件,合并成一个pdf文件,原pdf的首页均要放在合并后pdf的奇数页,希望实现以下功能,原来偶数页的pdf保持不变,奇数页的pdf则在合并前,在最后一页插入一张空白页,再与其他的pdf一起合并,请问该如何实现?
作者: 77七    时间: 2024-3-15 14:34

本帖最后由 77七 于 2024-3-15 15:16 编辑

执行代码前 手动创建一个空白页的pdf文件,命名为 空白页.pdf

  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. rem 下载pdftk http://bcn.bathome.net/tool/PDFtk.rar
  4. cd /d "%~dp0"
  5. setlocal enabledelayedexpansion
  6. for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v /i "空白页.pdf"') do (
  7. pdftk "%%i" dump_data |findstr /rbec:"NumberOfPages:.*[13579]" 1>nul && (
  8. set str=!str! "%%i" 空白页.pdf
  9. ) || (
  10. set str=!str! "%%i"
  11. )
  12. )
  13. set str=!str!$$
  14. set "str=!str:空白页.pdf$$=!"
  15. set "str=!str:$$=!"
  16. for %%i in (.) do (
  17. echo 合并 !str!
  18. pdftk !str! cat output "%%~nxi.pdf"
  19. )
  20. endlocal
  21. pause
复制代码

作者: 暴雪英雄    时间: 2024-3-17 11:05

回复 2# 77七


    感谢大神,代码中间漏了一个声明PDFtk路径的语句,我自己加上,题目需求能够完全实现,再请教个问题,空白页pdf能不能固定放在某个路径下面,比如D盘的空白页文件夹底下,请问代码要怎么完善?
作者: 暴雪英雄    时间: 2024-3-17 11:29

回复 2# 77七


    如果可以把空白页pdf固定放在局域网某个路径下就更好了,这样的话,就不用每次在要处理的文件夹底下临时放空白页pdf了
作者: 77七    时间: 2024-3-17 11:58

回复 4# 暴雪英雄


  
  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. rem 下载pdftk http://bcn.bathome.net/tool/PDFtk.rar
  4. set "file=d:\空白页文件夹\空白页.pdf"
  5. set "_pdftk=d:\pdftk\pdftk.exe"
  6. cd /d "%~dp0"
  7. setlocal enabledelayedexpansion
  8. for %%a in (*.pdf) do (
  9. set /a n+=1
  10. )
  11. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  12. set /a m+=1
  13. if !m! neq !n! (
  14. "%_pdftk%" "%%i" dump_data |findstr /rbec:"NumberOfPages:.*[13579]" 1>nul && (
  15. set str=!str! "%%i" "%file%"
  16. ) || (
  17. set str=!str! "%%i"
  18. )
  19. ) else (
  20. set str=!str! "%%i"
  21. )
  22. )
  23. for %%i in (.) do (
  24. echo 合并 !str!
  25. "%_pdftk%" !str! cat output "%%~nxi.pdf"
  26. )
  27. endlocal
  28. pause
复制代码

作者: 暴雪英雄    时间: 2024-3-17 13:53

回复 5# 77七


    所有功能均已完全实现,大神,请收下我的膝盖
作者: 暴雪英雄    时间: 2024-3-26 17:29

回复 5# 77七


    大神,不好意思,又有新的需求,就是合并生成pdf文件后,需要把未合并前的原始pdf文件删除,仅保留合并后的pdf文档,请问代码应该如何完善?
作者: 77七    时间: 2024-3-26 20:08

回复 7# 暴雪英雄


   第25-28行,修改为:
  1. for %%i in (.) do (
  2. echo 合并 !str!
  3. "%_pdftk%" !str! cat output "%%~nxi.pdf"
  4. if exist "%%~nxi.pdf" (
  5. for %%a in (*.pdf) do (
  6. if "%%a" neq "%%~nxi.pdf" (
  7. del "%%a"
  8. )
  9. )
  10. )
  11. )
复制代码

作者: 暴雪英雄    时间: 2024-3-26 21:42

回复 8# 77七


    感谢大神的耐心解答,新的需求已实现
作者: 暴雪英雄    时间: 2024-3-27 17:41

回复 8# 77七


    不好意思,再次请教,合并pdf文件之前,希望给每个pdf文件添加文件名标签,文件名格式为“01办公会(财务室202XXXXX)”,最好只添加括号中的中文,即“财务室”作为标签,看了大神的另一回答,使用到了以下方法(见链接),但是该方法使用的是utf-8编码格式,如果在此代码中,直接插入添加标签的代码,最后可以正常合并,就是后续窗口输出的中文会乱码,请问如何在同一个bat中使用两种编码?http://www.bathome.net/viewthrea ... mp;page=3#pid274718
作者: 暴雪英雄    时间: 2024-3-27 17:44

回复 8# 77七


    那个帖子的代码如下
  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
复制代码

作者: 77七    时间: 2024-3-27 18:14

回复 11# 暴雪英雄


   当时这个代码,使用utf-8方便些,所以采用了utf-8编码。试着将5楼代码第16行 修改为
  1. "%_pdftk%" "%%i" dump_data_utf8 output |findstr /rbec:"NumberOfPages:.*[13579]" 1>nul && (
复制代码


并在批处理文件开头添加
  1. chcp 65001 >nul
复制代码


批处理保存为utf-8编码格式
作者: 77七    时间: 2024-3-27 18:22

回复 10# 暴雪英雄


  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. for /f "tokens=2 delims=(" %%x in ("%%~ni") do (
  10. for /f "tokens=1 delims=2" %%y in ("%%x") do (
  11. echo BookmarkTitle: %%y
  12. )
  13. )
  14. echo BookmarkLevel: 1
  15. echo BookmarkPageNumber: 1
  16. )
  17. pdftk "%%i" update_info_utf8 report.txt output $.pdf
  18. move $.pdf "%%i"
  19. )
  20. )
  21. del report.txt
复制代码

作者: 暴雪英雄    时间: 2024-3-27 21:50

回复 13# 77七


    除了pdf合并的代码,bat文件里还有批量修改word文档文件名、批量生成pdf的代码,都是ansi编码,请问有没有办法把添加标签的代码也弄成ansi编码,就完美统一了
作者: 77七    时间: 2024-3-27 22:40

本帖最后由 77七 于 2024-3-27 22:41 编辑

回复 14# 暴雪英雄


  添加标签的代码,生成的报告
  1. ansi
  2. BookmarkTitle: &去掉#31532;&去掉#19968;&去掉#31456;
  3. utf-8
  4. BookmarkTitle: 第一章
复制代码


添加标签就是修改这个报告,改为ansi有点麻烦(其实我不会,可能需要其它脚本转换),可以参考12楼,把其它代码向 utf-8靠拢。
作者: 暴雪英雄    时间: 2024-3-27 23:33

回复 15# 77七


    还是要感谢您的耐心解答,后面想到一个办法,在ansi编码的脚本中,调用utf-8编码的脚本,所幸问题可以完美解决。




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