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

[文本处理] 想VBA和PDFtk结合给指定的PDF加标签,中途报错,求方案。

开始的时候,我想用VBS +PDFtk来解决
执行VBS时,提示选择PDF文件,
与VBS同级目录下有 标签.txt 一行一个内容,按行数对应该PDF的页数,一行一页,一个标签
但是没有实现

后改VBA  中间有报错 没结果


链接:https://pan.baidu.com/s/1IPWaUsmx1IV-LpkBNUZRoQ?pwd=0jfb
提取码:0jfb
--来自百度网盘超级会员V10的分享

与EXECL文件同级文件平 PDFtk 下有 PDFtk.exe文件
运行VBA时提示选择文件,选择目录开始在当前目录
利用VBA为所选PDF文件添加标签,
A1对应PDF第1页
A2对应PDF第2页
A3对应PDF第3页
A4对应PDF第4页
A5对应PDF第5页
A6对应PDF第6页
……
以此类推


所有需要的临时文件都在 \TEMP 中

本帖最后由 ppll2030 于 2024-7-6 15:10 编辑

VBA不熟。就不搀和了。习惯了用批处理,看看合不合用吧。
注意:
代码一定一定要保存为UTF-8格式的bat文件。
bat文件跟pdftk.exe文件放一块。
书签明细可在脚本后修改。
PDF文件支持拖放,也可打开后手动输入。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 注意::一定要保存为UTF-8格式的bat文件
  4. chcp 65001 >nul
  5. :start
  6. set f=%1
  7. if not defined f echo. &set /p f=输入要添加书签的PDF文件:
  8. if not defined f echo.&pause&cls&goto :start
  9. for %%i in ("%f%") do set _nf=%%~ni&set _xf=%%~xi
  10. set /a n=1
  11. rem skip数值以 "以下为书签名单" 所在行为准
  12. (for /f "skip=24 tokens=* delims=" %%a in ('type "%~f0"') do (
  13.         set str=%%a
  14.         echo BookmarkBegin
  15.         echo BookmarkTitle: !str!
  16.         echo BookmarkLevel: 1
  17.         echo BookmarkPageNumber: !n!
  18.         set /a n+=1
  19. ))>bookmark.txt
  20. pdftk "%f%" update_info_utf8 bookmark.txt output "%_nf%_bookmark%_xf%"
  21. del /q bookmark.txt
  22. pause&exit
  23. 以下为书签名单:
  24. 红旗小学1
  25. 红旗小学2
  26. 红旗小学3
  27. 红旗小学4
  28. 红旗小学5
  29. 红旗小学6
  30. 红旗小学7
  31. 红旗小学8
  32. 红旗小学9
  33. 红旗小学10
  34. 红旗小学11
  35. 红旗小学12
  36. 红旗小学13
  37. 红旗小学14
  38. 红旗小学15
  39. 红旗小学16
  40. 红旗小学17
  41. 红旗小学18
  42. 红旗小学19
  43. 红旗小学20
  44. 红旗小学21
  45. 红旗小学22
  46. 红旗小学23
  47. 红旗小学24
  48. 红旗小学25
  49. 红旗小学26
  50. 红旗小学27
  51. 红旗小学28
  52. 红旗小学29
  53. 红旗小学30
复制代码

TOP

回复 2# ppll2030


    辛苦了 谢谢

   因为要经常更换标签     能不能在 bat  同级下 放一下 标签.txt  把标签 内容放在这里 感谢

     bat   pdftk.exe  标签.txt

TOP

回复 3# qd2024


    把12行的内容改一下就可以了。
自己新建一个标签.txt,一行开始直接放标签明细即可。
  1. (for /f "delims=" %%a in ('type "标签.txt"') do (
复制代码

TOP

回复 4# ppll2030
链接:https://pan.baidu.com/s/1GduyUNl_tyKOVOb9ONT6FQ?pwd=mek3
提取码:mek3
--来自百度网盘超级会员V10的分享

我尝试了 没有成功  PDFtk  我在同级和目录里都放了  不行

我的PDF文件里有  _    基本都是  0098_XXXXXX    把_删除 也不行

   

辛苦再帮我看看 谢谢

TOP

本帖最后由 aloha20200628 于 2024-7-8 23:23 编辑

回复 5# qd2024

本帖的关键是pdftk.exe要求加入 ‘包含中文标签’ 的设置文件须为utf-8编码(无BOM头标),其文件名似乎还须是单字节ascii字符
以下代码存为test.bat,放在 *.pdf,标签.txt,pdftk.exe 等文件同在的目录下运行,先用 "标签.txt" 生成 "BMu8.txt" ,再将其转码为无头标utf-8,最后调用pdftk生成 "*.new.pdf" 即为楼主所要...

  1. <# ::
  2. @echo off &if not exist "*.pdf" (exit/b) else if not exist "标签.txt" exit/b
  3. powershell "iex(${%~f0}|out-string)" &if not exist "BMu8.txt" exit/b
  4. for %%F in (*.pdf) do (set "pF=%%F"&set "_pF=%%~nF.new.pdf")
  5. pdftk.exe "%pF%" update_info_utf8 "BMu8.txt" output "%_pF%"
  6. del "BMu8.txt"&pause&exit/b
  7. #>
  8. $n=1; $s=foreach($l in gc "标签.txt") {
  9. echo("BookmarkBegin`nBookmarkTitle: "+$l+"`nBookmarkLevel: 1`nBookmarkPageNumber: "+($n++))
  10. }; [io.file]::writeAlllines("BMu8.txt", $s); exit
复制代码

TOP

回复 6# aloha20200628


    谢谢了。但是我每次处理时试卷不同,PDF文件名不同,这样每次改BAT里的关键字,有点麻烦,
                看看有没有其他方法,我保证 与bat 标签.txt pdttk.exe 同级目录只有一个*.pdf  让代码直接修改这个PDF文件 达成目标

万分感谢。

TOP

本帖最后由 aloha20200628 于 2024-7-7 11:15 编辑

回复 7# qd2024

6楼代码已订正,再试试吧
确保运行时,当前目录中存在 ‘唯一’ 的目标文件 *.pdf 及其 "标签.txt" 和 pdftk.exe+libiconv2.dll 文件...
订正后的代码先检查 *.pdf 及其 “标签.txt” 是否存在,缺一者即退出...

TOP

回复 5# qd2024


    你把标签.txt也要保存为UTF-8的格式就可以了。

TOP

本帖最后由 ppll2030 于 2024-7-7 13:13 编辑

回复 5# qd2024


    再次修改了一下脚本,这样你就不需要把PDF文件跟脚本放一块了。这样应该更方便一些。
注意:
代码一定要保存为UTF-8编码格式的bat文件,跟pdftk放置一块
标签.txt一定一定要保存为UTF-8编码格式的txt文件
标签.txt和PDF放在一起即可,不需要把他俩复制粘到pdftk的同一个文件夹内。
直接拖拽PDF到bat上面即可,也可先打开bat,再拖拽过去,或复制PDF完整路径进来。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 注意::一定要保存为UTF-8格式的bat文件
  4. chcp 65001 >nul
  5. :start
  6. set f=%1
  7. if not defined f echo. &set /p f=输入要添加书签的PDF文件:
  8. if not defined f echo.&pause&cls&goto :start
  9. for /f "delims=" %%i in ("%f%") do set _nf=%%~dpni&set _xf=%%~xi&set _pf=%%~dpi
  10. set /a n=1
  11. rem 标签.txt一定一定要保存为UTF-8编码格式的txt文件
  12. (for /f "delims=" %%a in ('type "!_pf!标签.txt"') do (
  13.         set str=%%a
  14.         echo BookmarkBegin
  15.         echo BookmarkTitle: !str!
  16.         echo BookmarkLevel: 1
  17.         echo BookmarkPageNumber: !n!
  18.         set /a n+=1
  19. ))>!_pf!bookmark.txt
  20. %~dp0pdftk "!f!" update_info_utf8 "!_pf!bookmark.txt" output "!_nf!_bookmark!_xf!"
  21. del /q !_pf!bookmark.txt
  22. echo.&echo.书签添加完毕!&timeout /t 3 &exit
复制代码

TOP

回复 10# ppll2030

不放在桌面  移动到D盘下 测试成功
有没有可能 直接在我的PDF文件上添加标签   或者用方法做中介 最后只保留与我源文件同名的添加好标签的文件即可

辛苦了 谢谢


TOP

本帖最后由 ppll2030 于 2024-7-7 16:04 编辑

回复 11# qd2024


    直接改动源文件比较危险哦。切记做好备份
关于桌面失败,可能是路径带空格的问题,现已修复,你可以再试试。
在代码第20行后面添加了两行,直接改动源文件,默认无备份,需要备份就去掉21行的两个::冒号。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 注意::一定要保存为UTF-8格式的bat文件
  4. chcp 65001 >nul
  5. :start
  6. set f=%1
  7. if not defined f echo. &set /p f=输入要添加书签的PDF文件:
  8. if not defined f echo.&pause&cls&goto :start
  9. for /f "delims=" %%i in ("%f%") do set _nf=%%~ni&set _xf=%%~xi&set _pf=%%~dpi
  10. set /a n=1
  11. (for /f "delims=" %%a in ('type "!_pf!标签.txt"') do (
  12.         set str=%%a
  13.         echo BookmarkBegin
  14.         echo BookmarkTitle: !str!
  15.         echo BookmarkLevel: 1
  16.         echo BookmarkPageNumber: !n!
  17.         set /a n+=1
  18. ))>bookmark.txt
  19. "%~dp0pdftk" !f! update_info_utf8 "!_pf!bookmark.txt" output "!_pf!!_nf!_bookmark!_xf!"
  20. rem 备份源文件,需要去掉前面两个 :: 冒号
  21. ::ren "!f!" "!_nf!_bak!_xf!"
  22. move /y "!_nf!_bookmark!_xf!" !f! >nul
  23. del /q "!_pf!bookmark.txt"
  24. echo.&echo.书签添加完毕!&timeout /t 3&exit
复制代码

TOP

批处理调用pdftk.exe给pdf文件逐页添加书签
  1. @echo off
  2. rem "批处理调用pdftk给无书签的pdf文件按照 书签文本每一行对应pdf每一页 添加书签(如果某页不需要书签,则书签文本对应行留空)"
  3. rem "批处理和书签文本全部保存为utf-8编码,pdftk添加到环境变量,书签文本格式txt,与pdf文件同名"
  4. chcp 65001 >nul
  5. cd /d "%~dp0"
  6. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  7. if exist "%%~ni.txt" (
  8. pdftk "%%i" dump_data_utf8 output |find "BookmarkTitle:" 1>nul
  9. if errorlevel 1 (
  10. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%~ni.txt"') do (
  11. if "%%b" neq "" (
  12. echo BookmarkBegin
  13. echo BookmarkTitle: %%b
  14. echo BookmarkLevel: 1
  15. echo BookmarkPageNumber: %%a
  16. )
  17. ))>report.txt
  18. pdftk "%%i" update_info_utf8 report.txt output "%%~ni_new.pdf"
  19. )
  20. ) else (
  21. echo 未找到文本 [%%~ni.txt]
  22. )
  23. )
  24. del report.txt 2>nul
  25. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 12# ppll2030


    感谢 D盘测试成功  完美      桌面还是闪过,可以忽略  不是一定要放在桌面的

再次感谢

TOP

回复 13# 77七


    辛苦了  感谢

TOP

返回列表