夏生生 发表于 2025-2-13 17:38:34

我也来一个利用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 11:26:55

本帖最后由 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)
)

sandyvs 发表于 2025-2-19 23:56:24

zj20190405 发表于 2025-2-19 23:09
能删除合并前的文件就好了

这不难啊,合并完后删除pdflist的文件就行啊,如果是合并指定文件夹中的,就转换成完整路径再删除。或者编个直接获取指定文件夹中的pdf文件的函数,合并完后再删除

夏生生 发表于 2025-2-14 08:35:46

kucha007 发表于 2025-2-13 23:40
前排提醒,慎用:文件没合并,倒是把我PDF都删没了(没进回收站哈哈哈

加了个if,只要合并后文件名非原文件名应该不会删除了,你的问题估计是没pdftk,我发的是个思路,逻辑不严谨。

ssyfeng 发表于 2025-2-13 17:54:46

可以先把要合并的文件复制到临时文件夹中,合并后删除复制的PDF,这是不是好一些

夏生生 发表于 2025-2-13 18:09:35

ssyfeng 发表于 2025-2-13 17:54
可以先把要合并的文件复制到临时文件夹中,合并后删除复制的PDF,这是不是好一些

直接不删除就行,去掉最后一行。

429014673 发表于 2025-2-13 19:58:58

我记得论坛上也有一个

paulpipi 发表于 2025-2-13 20:39:14

试用一下,谢谢分享

kucha007 发表于 2025-2-13 23:40:06

前排提醒,慎用:文件没合并,倒是把我PDF都删没了(没进回收站哈哈哈

菜卷鱼 发表于 2025-2-15 16:06:02

这些外部程序,用ai直接写个python简单得多

bai2000 发表于 2025-2-15 16:18:47

sandyvs 发表于 2025-2-15 11:26
;可能会被安全软件拦截,我这第一次运行火绒会提示

;[功能] 工具-合并PDF,(czx:mergepdf OriPatch Tgt ...

p:stringp 函数少了吧?
页: [1] 2
查看完整版本: 我也来一个利用PDFtk合并某文件夹中所有PDF