标题: [文本处理] 想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文件支持拖放,也可打开后手动输入。- @echo off
- setlocal enabledelayedexpansion
- rem 注意::一定要保存为UTF-8格式的bat文件
- chcp 65001 >nul
- :start
- set f=%1
- if not defined f echo. &set /p f=输入要添加书签的PDF文件:
- if not defined f echo.&pause&cls&goto :start
- for %%i in ("%f%") do set _nf=%%~ni&set _xf=%%~xi
- set /a n=1
- rem skip数值以 "以下为书签名单" 所在行为准
- (for /f "skip=24 tokens=* delims=" %%a in ('type "%~f0"') do (
- set str=%%a
- echo BookmarkBegin
- echo BookmarkTitle: !str!
- echo BookmarkLevel: 1
- echo BookmarkPageNumber: !n!
- set /a n+=1
- ))>bookmark.txt
- pdftk "%f%" update_info_utf8 bookmark.txt output "%_nf%_bookmark%_xf%"
- del /q bookmark.txt
- pause&exit
-
- 以下为书签名单:
- 红旗小学1
- 红旗小学2
- 红旗小学3
- 红旗小学4
- 红旗小学5
- 红旗小学6
- 红旗小学7
- 红旗小学8
- 红旗小学9
- 红旗小学10
- 红旗小学11
- 红旗小学12
- 红旗小学13
- 红旗小学14
- 红旗小学15
- 红旗小学16
- 红旗小学17
- 红旗小学18
- 红旗小学19
- 红旗小学20
- 红旗小学21
- 红旗小学22
- 红旗小学23
- 红旗小学24
- 红旗小学25
- 红旗小学26
- 红旗小学27
- 红旗小学28
- 红旗小学29
- 红旗小学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,一行开始直接放标签明细即可。- (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" 即为楼主所要...
- <# ::
- @echo off &if not exist "*.pdf" (exit/b) else if not exist "标签.txt" exit/b
- powershell "iex(${%~f0}|out-string)" &if not exist "BMu8.txt" exit/b
- for %%F in (*.pdf) do (set "pF=%%F"&set "_pF=%%~nF.new.pdf")
- pdftk.exe "%pF%" update_info_utf8 "BMu8.txt" output "%_pF%"
- del "BMu8.txt"&pause&exit/b
- #>
- $n=1; $s=foreach($l in gc "标签.txt") {
- echo("BookmarkBegin`nBookmarkTitle: "+$l+"`nBookmarkLevel: 1`nBookmarkPageNumber: "+($n++))
- }; [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完整路径进来。- @echo off
- setlocal enabledelayedexpansion
- rem 注意::一定要保存为UTF-8格式的bat文件
- chcp 65001 >nul
- :start
- set f=%1
- if not defined f echo. &set /p f=输入要添加书签的PDF文件:
- if not defined f echo.&pause&cls&goto :start
- for /f "delims=" %%i in ("%f%") do set _nf=%%~dpni&set _xf=%%~xi&set _pf=%%~dpi
- set /a n=1
- rem 标签.txt一定一定要保存为UTF-8编码格式的txt文件
- (for /f "delims=" %%a in ('type "!_pf!标签.txt"') do (
- set str=%%a
- echo BookmarkBegin
- echo BookmarkTitle: !str!
- echo BookmarkLevel: 1
- echo BookmarkPageNumber: !n!
- set /a n+=1
- ))>!_pf!bookmark.txt
- %~dp0pdftk "!f!" update_info_utf8 "!_pf!bookmark.txt" output "!_nf!_bookmark!_xf!"
- del /q !_pf!bookmark.txt
- 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行的两个::冒号。- @echo off
- setlocal enabledelayedexpansion
- rem 注意::一定要保存为UTF-8格式的bat文件
- chcp 65001 >nul
- :start
- set f=%1
- if not defined f echo. &set /p f=输入要添加书签的PDF文件:
- if not defined f echo.&pause&cls&goto :start
- for /f "delims=" %%i in ("%f%") do set _nf=%%~ni&set _xf=%%~xi&set _pf=%%~dpi
- set /a n=1
- (for /f "delims=" %%a in ('type "!_pf!标签.txt"') do (
- set str=%%a
- echo BookmarkBegin
- echo BookmarkTitle: !str!
- echo BookmarkLevel: 1
- echo BookmarkPageNumber: !n!
- set /a n+=1
- ))>bookmark.txt
- "%~dp0pdftk" !f! update_info_utf8 "!_pf!bookmark.txt" output "!_pf!!_nf!_bookmark!_xf!"
- rem 备份源文件,需要去掉前面两个 :: 冒号
- ::ren "!f!" "!_nf!_bak!_xf!"
- move /y "!_nf!_bookmark!_xf!" !f! >nul
- del /q "!_pf!bookmark.txt"
- echo.&echo.书签添加完毕!&timeout /t 3&exit
复制代码
作者: 77七 时间: 2024-7-7 16:40
批处理调用pdftk.exe给pdf文件逐页添加书签- @echo off
- rem "批处理调用pdftk给无书签的pdf文件按照 书签文本每一行对应pdf每一页 添加书签(如果某页不需要书签,则书签文本对应行留空)"
- rem "批处理和书签文本全部保存为utf-8编码,pdftk添加到环境变量,书签文本格式txt,与pdf文件同名"
- chcp 65001 >nul
- cd /d "%~dp0"
- for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
- if exist "%%~ni.txt" (
- pdftk "%%i" dump_data_utf8 output |find "BookmarkTitle:" 1>nul
- if errorlevel 1 (
- (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%~ni.txt"') do (
- if "%%b" neq "" (
- echo BookmarkBegin
- echo BookmarkTitle: %%b
- echo BookmarkLevel: 1
- echo BookmarkPageNumber: %%a
- )
- ))>report.txt
- pdftk "%%i" update_info_utf8 report.txt output "%%~ni_new.pdf"
- )
- ) else (
- echo 未找到文本 [%%~ni.txt]
- )
- )
- del report.txt 2>nul
- 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大佬的提醒和指导,目前拖拽和粘贴复制的方式都没有问题了。- @echo off
- setlocal enabledelayedexpansion
- rem 注意::一定要保存为UTF-8格式的bat文件
- chcp 65001 >nul
- :start
- set f=%1
- if not defined f echo. &set /p f=添加PDF文件(拖拽文件或者填写文件的完整路径):
- if not defined f echo.&pause&cls&goto :start
- set f=%f:"=%
- for /f "delims=" %%i in ("%f%") do set _nf=%%~ni&set _xf=%%~xi&set _pf=%%~dpi
- set /a n=1
- cd /d %_pf%
- (for /f "delims=" %%a in ('type "标签.txt"') do (
- set str=%%a
- echo BookmarkBegin
- echo BookmarkTitle: !str!
- echo BookmarkLevel: 1
- echo BookmarkPageNumber: !n!
- set /a n+=1
- ))>bookmark.txt
- "%~dp0pdftk" "!f!" update_info_utf8 bookmark.txt output "!_nf!_bookmark!_xf!"
- rem 备份源文件,需要去掉前面两个 :: 冒号
- ::ren "!f!" "!_nf!_bak!_xf!"
- move /y "!_nf!_bookmark!_xf!" "!f!" >nul
- del /q bookmark.txt
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |