Board logo

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

作者: qd2024    时间: 2024-7-6 10:03     标题: 想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:08

本帖最后由 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
复制代码

作者: qd2024    时间: 2024-7-6 17:21

回复 2# ppll2030


    辛苦了 谢谢

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

     bat   pdftk.exe  标签.txt
作者: ppll2030    时间: 2024-7-6 18:05

回复 3# qd2024


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

作者: qd2024    时间: 2024-7-7 07:54

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

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

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

   

辛苦再帮我看看 谢谢
作者: aloha20200628    时间: 2024-7-7 10:05

本帖最后由 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
复制代码

作者: qd2024    时间: 2024-7-7 10:25

回复 6# aloha20200628


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

万分感谢。
作者: aloha20200628    时间: 2024-7-7 10:43

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

回复 7# qd2024

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

作者: ppll2030    时间: 2024-7-7 11:04

回复 5# qd2024


    你把标签.txt也要保存为UTF-8的格式就可以了。
作者: ppll2030    时间: 2024-7-7 13:06

本帖最后由 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
复制代码

作者: qd2024    时间: 2024-7-7 13:52

回复 10# ppll2030

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

辛苦了 谢谢



作者: ppll2030    时间: 2024-7-7 15:09

本帖最后由 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
复制代码

作者: 77七    时间: 2024-7-7 16:40

批处理调用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
复制代码

作者: qd2024    时间: 2024-7-7 17:16

回复 12# ppll2030


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

再次感谢
作者: qd2024    时间: 2024-7-7 17:17

回复 13# 77七


    辛苦了  感谢
作者: qd2024    时间: 2024-7-8 07:30

本帖最后由 qd2024 于 2024-7-8 07:43 编辑

回复 12# ppll2030


    测试新问题
当PDF文件名为  

  【张梅化学】高一衔接班讲义
   扫描全能王 2024-04-25 08.14

添加标签失败 代码无效,拜托帮忙调整一下 谢谢
作者: ppll2030    时间: 2024-7-8 14:00

本帖最后由 ppll2030 于 2024-7-8 17:25 编辑

回复 16# qd2024


经过77大佬的提醒和指导,目前拖拽和粘贴复制的方式都没有问题了。
  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. set f=%f:"=%
  10. for /f "delims=" %%i in ("%f%") do set _nf=%%~ni&set _xf=%%~xi&set _pf=%%~dpi
  11. set /a n=1
  12. cd /d %_pf%
  13. (for /f "delims=" %%a in ('type "标签.txt"') do (
  14.         set str=%%a
  15.         echo BookmarkBegin
  16.         echo BookmarkTitle: !str!
  17.         echo BookmarkLevel: 1
  18.         echo BookmarkPageNumber: !n!
  19.         set /a n+=1
  20. ))>bookmark.txt
  21. "%~dp0pdftk" "!f!" update_info_utf8 bookmark.txt output "!_nf!_bookmark!_xf!"
  22. rem 备份源文件,需要去掉前面两个 :: 冒号
  23. ::ren "!f!" "!_nf!_bak!_xf!"
  24. move /y "!_nf!_bookmark!_xf!" "!f!" >nul
  25. del /q bookmark.txt
  26. echo.&echo.书签添加完毕!&timeout /t 3&exit
复制代码

作者: 77七    时间: 2024-7-8 15:13

回复 17# ppll2030


   6、7行的两种方式,%1会改变工作路径,而set /p却不会,%1含有空格加引号,而set /p不知道情况如何,而后面又使用 %~dp0pdftk,感觉空格、引号与路径有点混乱,可提供给楼主一种方式就好。如:第7行输入一个含有空格的路径,而没有引号,后续会出错。
作者: ppll2030    时间: 2024-7-8 15:31

回复  ppll2030


   6、7行的两种方式,%1会改变工作路径,而set /p却不会,%1含有空格加引号,而set  ...
77七 发表于 2024-7-8 15:13



    唉,学艺不精,这也是改了又改的原因了。一会儿拖拽成功,但粘贴路径有莫名bug
%1是为了拖拽功能,set /p 是为了粘贴复制,
我周围的人习惯不同,为了方便就都统一这么写了。
上面我也只是测试了拖拽的功能对空格文件名和路径没问题。回头再看看粘贴复制的情况吧。
至于%~dp0pdftk,也是无奈之举,不是同一目录的pdf文件,会提示:
'pdftk' is not recognized as an internal or external command,
operable program or batch file.
The system cannot find the file specified.
这也是之前我补齐所有文件的完整路径的原因。越搞越麻烦。哈哈
最后,感谢大佬的指点。让我对%1和set /p又有了一些新的认知。
作者: qd2024    时间: 2024-7-8 19:45

回复 17# ppll2030


    太感谢了
作者: aloha20200628    时间: 2024-7-8 19:54

回复 7# qd2024

按照7楼中的楼主约定方法,直接用6楼的代码处理其他的 *.pdf 及其 ‘标签.txt’,有何问题吗?

作者: ppll2030    时间: 2024-7-8 20:53

回复 21# aloha20200628


    哈哈,老大的代码看不懂。就直接代楼主上自己的测试结果吧
1、脚本bat和标签.txt必须是ANSI,任意一个是utf-8结果就会乱码。都是ANSI下,结果正确。
2、多个pdf只会操作一个。
作者: 77七    时间: 2024-7-8 21:03

回复 6# aloha20200628


   
大佬,代码第2行判断是否存在pdf文件会失败吧
作者: aloha20200628    时间: 2024-7-8 21:17

回复 23# 77七

直接在命令行上试试看结果 》if not exist "*.txt" (@echo,0) else @echo,1

作者: aloha20200628    时间: 2024-7-8 21:33

回复 22# ppll2030

所谓7楼的楼主约定是 ‘我保证 与bat 标签.txt pdttk.exe 同级目录只有一个*.pdf’,此乃6楼代码被订正的依据...
utf-8编码的标签设置文件 ‘BMu8.txt’ 是6楼代码调用powershell功能从 ‘标签.txt’ 转码生成的,无须批处运行要求的 chcp 65001 和批处存为utf-8编码等操作...
所以还是希望楼主自己给21楼的问题一个回复...

作者: 77七    时间: 2024-7-8 21:36

回复 24# aloha20200628


   *.pdf 通配结果为空,就不执行do了
作者: aloha20200628    时间: 2024-7-8 22:21

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

回复 26# 77七

谢了
哇塞 本想 if not exist "*.pdf" exit/b 和 if not exist "标签.txt" exit/b 两行并一行,反倒是给 *.pdf 轮空时钻了漏洞
须给6楼代码一个修复,已完成...

作者: aloha20200628    时间: 2024-7-8 22:39

回复 7# qd2024

回复 22# ppll2030

所谓7楼的楼主约定是 ‘我保证 与bat 标签.txt pdttk.exe 同级目录只有一个*.pdf’,此乃6楼代码被订正的依据...
utf-8编码的标签设置文件 ‘BMu8.txt’ 是6楼代码调用powershell功能从 ‘标签.txt’ 转码生成的,无须批处运行要求的 chcp 65001 和批处存为utf-8编码等操作...
所以还是希望楼主自己给21楼的问题一个回复...





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