我也来一个利用PDFtk合并某文件夹中所有PDF
本帖最后由 夏生生 于 2025-2-14 08:33 编辑***警告,请谨慎测试,会删除您的PDF***
利用了麦叔的模拟dos execute函数,需保证您有PDFTK.EXE,且其在autocad的支持文件搜索路径中,功能为利用PDFtk合并某文件夹中所有PDF,并删除原有PDF
(defun c:tt(/ diy_dos_execute cmd file files folder1 folder2 output)
;此函数来自麦叔(老迈)
(defun diy_dos_execute(exefile win wait / exec)
(and (setq exec (vlax-create-object "wscript.shell"))
(progn(vlax-invoke exec
'run
exefile
(cond
((member win (list 2 3 5)) win)
(5))
(if wait
1
0))
(vlax-release-object exec)))
(princ))
(setq file (findfile "PDFTK.exe")
folder1 (vl-filename-directory file)
file (getfiled "选择任意PDF文件" (strcat folder1 "/") "pdf" 8)
folder2 (vl-filename-directory file)
files (vl-directory-files folder2 "*.pdf")
file (apply 'strcat
(mapcar '(lambda (x) (strcat folder2 "\\" x " ")) files))
output(strcat folder2
"\\"
(getstring t "\n输入合并后文件名:")
".pdf"))
(setq cmd (strcat "cmd /c cd /d " folder1 " & pdftk " file "cat output " output))
(diy_dos_execute cmd 2 1)
(if(findfile output)(foreach n files (vl-file-delete (strcat folder2 "\\" n)))))
本帖最后由 sandyvs 于 2025-2-15 23:10 编辑
;可能会被安全软件拦截,我这第一次运行火绒会提示
;[功能] 工具-合并PDF,(czx:mergepdf OriPatch TgtPatch PdfName)
;[用法](czx:mergepdf "F:\\文档\\临时合并PDF" "F:\\桌面\\临时生成" (strcat (vl-filename-base (getvar 'DwgName)) ".pdf"))
;[说明]oripatch 要合成PDF的文件夹或PDF完整路径表//tgtpatch = 合并后的PDF文件夹//pdfname = 合并后的PDF名称(.pdf)
(defun czx:mergepdf (OriPatch TgtPatch PDFName / myapp pdflist pdflst pdfpath tkpath)
(if (and (p:stringp OriPatch) (vl-file-directory-p OriPatch));源文件夹存在
(progn
(setq pdflst (vl-directory-files OriPatch "*.PDF" 1)) ;源文件夹存在PDF
(if pdflst
(setq pdflist (apply 'strcat (mapcar '(lambda (x) (strcat "\"" OriPatch "\\" x "\" ")) pdflst)))
)
)
(progn
(if (and (listp OriPatch) (vl-every '(lambda (x) (and (p:stringp x) (= ".PDF" (strcase (vl-filename-extension x))))) OriPatch))
(setq pdflist (apply 'strcat (mapcar '(lambda (x) (strcat "\""x "\" ")) OriPatch)))
)
)
)
(if (setq TKPath (findfile "pdftk.exe"));如果Pdftk存在
(if
(and
pdflist
(vl-file-directory-p TgtPatch);目标文件夹存在
;(setq PDFName (strcat (menucmd "M=$(edtime,$(getvar,date),合并_MODDHHMMSS)") "-" PreNam".pdf"));合并后的文件名
)
(progn
(princ "\n 文件合并中,请耐心等待!!!")
(czx:runps (strcat "\"" TKPath "\" "
pdflist
"cat output \"" (setq pdfpath (strcat TgtPatch "\\" PDFName)) "\"")
nil
)
(if (vl-file-directory-p TgtPatch)
(vlax-invoke (vla-GetInterfaceObject *Acad* "WScript.Shell") "run" TgtPatch))
(while (null(findfile pdfpath))
;(princ)
)
(if (findfile pdfpath)
(progn
(setq myapp (vlax-create-object "Shell.Application"))
(vlax-invoke-method myapp "shellexecute" pdfpath "" "" "open" 0)
(princ"\n 合并完成!" )
(vlax-release-object myapp)
)
)
)
)
(alert "请将pdftk.exe放到cad搜索路径后重试!")
)
)
;[功能] 工具-运行powershell,(czx:RunPS command flag)
;[用法](czx:RunPS "Get-Process | Out-File C:\\AdminLog.txt" t)
;[说明]command = 要执行的命令//flag = T为管理员,nil为普通
(defun czx:RunPS (command flag / run)
(setq shell (vlax-create-object "Shell.Application"))
(if flag (setq run "runas") (setq run ""))
(vlax-invoke-method
shell
'ShellExecute
"powershell.exe"
(strcat "-Command \"" command "\"")
""
run
0 ; 窗口模式(0= 隐藏 1=正常窗口)
)
(vlax-release-object shell)
) zj20190405 发表于 2025-2-19 23:09
能删除合并前的文件就好了
这不难啊,合并完后删除pdflist的文件就行啊,如果是合并指定文件夹中的,就转换成完整路径再删除。或者编个直接获取指定文件夹中的pdf文件的函数,合并完后再删除 kucha007 发表于 2025-2-13 23:40
前排提醒,慎用:文件没合并,倒是把我PDF都删没了(没进回收站哈哈哈
加了个if,只要合并后文件名非原文件名应该不会删除了,你的问题估计是没pdftk,我发的是个思路,逻辑不严谨。 可以先把要合并的文件复制到临时文件夹中,合并后删除复制的PDF,这是不是好一些 ssyfeng 发表于 2025-2-13 17:54
可以先把要合并的文件复制到临时文件夹中,合并后删除复制的PDF,这是不是好一些
直接不删除就行,去掉最后一行。 我记得论坛上也有一个 试用一下,谢谢分享 前排提醒,慎用:文件没合并,倒是把我PDF都删没了(没进回收站哈哈哈 这些外部程序,用ai直接写个python简单得多 sandyvs 发表于 2025-2-15 11:26
;可能会被安全软件拦截,我这第一次运行火绒会提示
;[功能] 工具-合并PDF,(czx:mergepdf OriPatch Tgt ...
p:stringp 函数少了吧?
页:
[1]
2