明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: sysu-沼泽

[提问] Visual Lisp实现多PDF合并

[复制链接]
发表于 2021-11-5 22:46 | 显示全部楼层
我一般都是直接用PYTHON 写好的程序合并
发表于 2021-11-7 11:15 | 显示全部楼层
本帖最后由 vitalgg 于 2021-11-7 11:20 编辑

http://atlisp.cn/package-info/pdftk-stable.html

基于 pdftk free 的PDF处理工具。用于 PDF 合并,拆分,加密,解密,加水印,戳记等。




  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; This file was created by @lisp DEV-tools
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. ;; define a first config item  'pdftk:first for package pdftk 's configitem first
  5. (@:define-config 'pdftk:stamp "D:\\Design\\standard\\stamp.pdf" "用于加为戳记的pdf文件")
  6. (@:define-config 'pdftk:background "D:\\Design\\standard\\background.pdf" "用于作为水印的pdf文件。被加水印的PDF文件须为透明背景。")
  7. (@:define-config 'pdftk:pre-folder "D:\\" "选择pdf文件路径时,最后一次操作的文件位置。")
  8. (if (null (findfile (@:get-config 'pdftk:stamp)))
  9.     (@:mkdir (@:path (vl-filename-directory(@:get-config 'pdftk:stamp)))))
  10. ;; (@:get-config 'pdftk:first)
  11. ;; (@:set-config 'pdftk:first  "New Value")
  12. ;; Add menu in @lisp panel
  13. (@:add-menu "出图排版" "PDF设置" "(pdftk:setup)" )
  14. (@:add-menu "出图排版" "合并PDF" "(pdftk:menu-merge)" )
  15. (@:add-menu "出图排版" "拆分PDF" "(pdftk:menu-burst)" )
  16. (@:add-menu "出图排版" "PDF加戳记" "(pdftk:menu-stamp)" )
  17. (@:add-menu "出图排版" "PDF加水印" "(pdftk:menu-background)" )
  18. (@:add-menu "出图排版" "解密PDF" "(pdftk:menu-decrypt)" )
  19. (@:add-menu "出图排版" "加密PDF" "(pdftk:menu-encrypt)" )

  20. (defun pdftk:setup (/ res)
  21.   "pdf tools"
  22.   (setq res
  23.   (ui:input "配置信息"
  24.       (mapcar '(lambda (x) (list (strcase (vl-symbol-name (car x)) T)(cadr x)(cddr x)))
  25.         (vl-remove-if '(lambda (x) (not (wcmatch (vl-symbol-name (car x)) "PDFTK:*")))
  26.           (if @:*config.db*
  27.               @:*config.db* (@:load-config))))))
  28.   (foreach res% res
  29.         (@:set-config (read (car res%)) (cdr res%)))
  30.   )
  31. (defun pdftk:menu-merge (/ folder)
  32.   (@:help "合并选择的文件夹下的所有pdf,到父级目录,并打开该目录。")
  33.   (if (setq folder (system:get-folder "请选择要合并的PDF文件夹"))
  34.       (progn
  35.   (@:set-config 'pdftk:pre-folder (system:dir folder))
  36.   (pdftk:merge folder)
  37.   (system:explorer (strcat folder "\\..\\" )))))
  38. (defun pdftk:merge (folder / app files filetmp filename-bk fp-bookmark file-bk file-bk-utf8)
  39.   "将参数folder 文件夹下的 pdf 文件合并成一个文件。合并后的文件名为 `文件夹-merge-all.pdf' "
  40.   ""
  41.   "(pdftk:merge \"D:\\Output\\A项目\")"
  42.   (setq app "bin\\pdftk.exe")
  43.   (pdftk:download)
  44.   (if (and (findfile app)
  45.      folder
  46.      (vl-directory-files folder "*.pdf" 1))
  47.       (progn
  48.   (@:patch-pgp-shell)
  49.   (setq files "*.pdf")
  50.   (setq filetmp "merge-tmp.pdf")
  51.   (setq filename-bk "merge-all.pdf")
  52.   (setvar "cmdecho" 0)
  53.   ;;创建标签文件。
  54.   (setq fp-bookmark (open (strcat folder "\\bk.txt")"w"))
  55.   (setq i 0)
  56.   (foreach bk% (vl-directory-files folder "*.pdf" 1)
  57.      (write-line "BookmarkBegin" fp-bookmark)
  58.      (write-line (strcat "BookmarkTitle: "
  59.              (vl-filename-base bk%))
  60.            fp-bookmark)
  61.      (write-line "BookmarkLevel: 1" fp-bookmark)
  62.      (write-line (strcat "BookmarkPageNumber: "
  63.              (itoa (setq i (1+ i))))
  64.            fp-bookmark))
  65.   (close fp-bookmark)
  66.   ;; 转码
  67.   (setq file-bk (strcat folder "\\bk.txt"))
  68.   (setq file-bk-utf8 (strcat folder "\\bk-utf8.txt"))
  69.   (command "shell-bg"
  70.      (strcat  @:*prefix* "bin\\iconv.exe -f gb2312 -t utf-8 \""
  71.         file-bk "\" >> \"" file-bk-utf8  "\""
  72.         ))
  73.   ;;(sleep 3)
  74.   (print folder)

  75.   (command "start-bg"
  76.      (strcat " /D \"" folder "\""
  77.        " /MIN /B  "
  78.        @:*prefix* app  " "
  79.        files " "
  80.        "output " filetmp
  81.        ))
  82.   (while (null (findfile (strcat folder "\\" filetmp)))
  83.     (sleep 3))
  84.   (command "start-bg"
  85.      (strcat  " /D \"" folder "\""
  86.         " /MIN /B  "
  87.         @:*prefix* app  " "
  88.         filetmp " "
  89.         "update_info_utf8 "
  90.         " bk-utf8.txt "
  91.         " output \"..\\"
  92.         (vl-filename-base folder) "-" filename-bk "\" "
  93.         ))
  94.   (while (null (findfile (strcat folder "\\..\\"
  95.                (vl-filename-base folder)
  96.                "-" filename-bk)))
  97.     (sleep 3))
  98.   (vl-file-delete file-bk)
  99.   (vl-file-delete file-bk-utf8)
  100.   (vl-file-delete (strcat folder "\\" filetmp))
  101.   
  102.   (setvar "cmdecho" 1)
  103.   (system:explorer (strcat folder "\\..\\" ))
  104.   ))
  105.   (princ)
  106.   )

  107. (defun pdftk:menu-burst (/ pdf-file)
  108.   (@:help "拆分选择的 pdf 文件,并打开文件所在目录。")
  109.   (if (setq pdf-file  (getfiled "请选择要拆分的PDF文件" (@:get-config 'pdftk:pre-folder) "pdf" 8))
  110.       (progn
  111.   (@:set-config 'pdftk:pre-folder (system:dir (vl-filename-directory pdf-file )))
  112.   (pdftk:burst pdf-file)
  113.   (system:explorer (vl-filename-directory pdf-file)))))
  114. (defun pdftk:burst (pdf-filename / app )
  115.   "拆分 pdf 文件为单页文件"
  116.   (setq app "bin\\pdftk.exe")
  117.   (pdftk:download)
  118.   (if (and (findfile app)
  119.      (= 'str (type-of pdf-filename))
  120.      (findfile pdf-filename))
  121.       (progn
  122.   (setvar "cmdecho" 0)
  123.   (command "start-bg"
  124.      (strcat " /D \"" (vl-filename-directory pdf-filename) "\""
  125.        " /MIN /B  "
  126.        @:*prefix* app  " \""
  127.        pdf-filename "\" "
  128.        "burst "
  129.        ))
  130.   (setvar "cmdecho" 1)
  131.   ))
  132.   (princ)
  133.   )

  134. (defun pdftk:menu-encrypt (/ filename pw permission permissions)
  135.   (@:help "选择一个 pdf 文件,设置所有者密码和用户密码,并打开文件所在目录。")
  136.   (setq permission '(("Printing"  nil "高质量打印")
  137.          ("DegradedPrinting" nil "低质量打印")
  138.          ("ModifyContents" nil "编辑内容,同时允许 Assembly.")
  139.          ("Assembly" nil "组装")
  140.          ("CopyContents" nil "复制内容,同时允许 ScreenReaders")
  141.          ("ScreenReaders" nil "屏幕阅读器")
  142.          ("ModifyAnnotations" nil "编辑注释,同时允许 FillIn")
  143.          ("FillIn" nil "?填充?")
  144.          ("AllFeatures" nil "以上所有.")))

  145.   (if (setq filename (getfiled "请选择要加密的PDF文件" (@:get-config 'pdftk:pre-folder) "pdf" 8))
  146.       (progn
  147.   (@:set-config 'pdftk:pre-folder (system:dir (vl-filename-directory filename )))
  148.   (setq pw (ui:input "请输入密码用于加密PDF:"
  149.          '(("所有者密码:" "" "请输入所有者密码" T)
  150.            ("所有者密码2:" "" "再次输入以确认" T)
  151.            ("用户密码:"  "" "请输入使用者密码" T)
  152.            ("用户密码2:" "" "再次输入以确认" T))))
  153.   (setq permissions
  154.         (mapcar '(lambda (x) (car (string:to-list x ": ")))
  155.           (ui:select-multi "请选择用户权限:" (mapcar '(lambda (x) (strcat (car x) ": " (last x))) permission))))
  156.   (if (null permissions)
  157.       (setq permissions '("")))
  158.   
  159.   (while (and pw
  160.         (or
  161.          (not (eq (cdr (assoc "所有者密码:" pw))(cdr (assoc "所有者密码2:" pw))))
  162.          (not (eq (cdr (assoc "用户密码:" pw))(cdr (assoc "用户密码2:" pw))))))
  163.     (alert "请注意所有者或用户的两次输入必须相同。所有者和用户的密码可以不同。")
  164.     (setq pw (ui:input "请输入密码用于加密PDF:"
  165.            '(("所有者密码:" "" "请输入所有者密码" T)
  166.              ("所有者密码2:" "" "再次输入以确认" T)
  167.              ("用户密码:"  "" "请输入使用者密码" T)
  168.              ("用户密码2:" "" "再次输入以确认" T))))
  169.     )
  170.   (if pw
  171.       (progn
  172.         (pdftk:encrypt filename (cdr (assoc "所有者密码:" pw)) (cdr (assoc "用户密码:" pw)) permissions)
  173.         (system:explorer (vl-filename-directory filename)))
  174.     ))))
  175. (defun pdftk:menu-decrypt (/ pdf-file)
  176.   (@:help "选择一个 pdf 文件,去除所有者密码,并打开文件所在目录。")
  177.   (if (setq pdf-file (getfiled "请选择要解密的PDF文件" (@:get-config 'pdftk:pre-folder) "pdf" 8))
  178.       (progn
  179.   (@:set-config 'pdftk:pre-folder (system:dir (vl-filename-directory pdf-file )))
  180.   (pdftk:decrypt
  181.    pdf-file
  182.    (cdr (assoc "所有者密码:"
  183.          (ui:input "请输入密码用于解密PDF:"
  184.              '(("所有者密码:" "" "请输入所有者密码" T))))))
  185.   (system:explorer (vl-filename-directory filename))
  186.   )))

  187. (defun pdftk:menu-stamp (/ filename)
  188.   (@:help "选择一个文件,给该文件加上戳记,戳记文件在pdf设置中进行设置。")
  189.   (if (setq filename (getfiled "请选择要加戳记的PDF文件" (@:get-config 'pdftk:pre-folder) "pdf" 8))
  190.       (progn
  191.   (@:set-config  'pdftk:pre-folder(system:dir (vl-filename-directory filename)))
  192.   (pdftk:stamp filename)
  193.   (system:explorer (vl-filename-directory filename)))))

  194. (defun pdftk:stamp (filename / app)
  195.   ;; 可执行文件路径
  196.   (setq app "bin\\pdftk.exe")
  197.   (pdftk:download)
  198.   (if (null (findfile  (@:get-config 'pdftk:stamp)))
  199.       (progn
  200.   (vl-file-copy (strcat (@:package-path "pdftk") "stamp.pdf")
  201.           (@:get-config 'pdftk:stamp))
  202.   (sleep 2)))
  203.   ;;(setq files (vl-directory-files (system:get-folder) "*.pdf"))
  204.   (if (and (findfile app)
  205.      filename)
  206.       (progn
  207.   ;;(setq folder (system:get-folder "请选择要合并的PDF文件夹"))
  208.   ;;(setq files (strcat folder  "\\*.pdf"))
  209.   (if (/= "" (@:get-config 'pdftk:stamp))
  210.       (progn
  211.         (setvar "cmdecho" 0)
  212.         (command "start-bg"
  213.            (strcat " /D \"" (vl-filename-directory filename) "\""
  214.              " /MIN /B  "
  215.              @:*prefix* app  " \""
  216.              filename "\" "
  217.              "stamp \"" (@:get-config 'pdftk:stamp)"\" "
  218.              "output \""
  219.              (strcat (vl-filename-directory filename) "\\"
  220.                (vl-filename-base filename) "-stamp.pdf\" ")
  221.              ))
  222.         (setvar "cmdecho" 1)
  223.         ))
  224.   ))
  225.   (princ)
  226.   )
  227. (defun pdftk:menu-background (/ filename)
  228.   (@:help "选择一个文件,给该文件加上水印,水印文件在pdf设置中进行设置。所选的 pdf 文件必须为透明背景才有效果。")
  229.   (if (setq filename  (getfiled "请选择要加水印的PDF文件" (@:get-config 'pdftk:pre-folder) "pdf" 8))
  230.       (progn
  231.   (@:set-config  'pdftk:pre-folder (system:dir (vl-filename-directory filename)))
  232.   (pdftk:background filename)
  233.   (system:explorer (vl-filename-directory filename))
  234.   )))

  235. (defun pdftk:background (filename / app)
  236.   ;; 可执行文件路径
  237.   (setq app "bin\\pdftk.exe")
  238.   (pdftk:download)
  239.   (if (null (findfile (@:get-config 'pdftk:background)))
  240.       (progn
  241.   (vl-file-copy (strcat (@:package-path "pdftk") "background.pdf")
  242.           (@:get-config 'pdftk:background))
  243.   (sleep 2)
  244.   ))
  245.   ;;(setq files (vl-directory-files (system:get-folder) "*.pdf"))
  246.   (if (and (findfile app)
  247.      filename)
  248.       (progn
  249.   ;;(setq folder (system:get-folder "请选择要合并的PDF文件夹"))
  250.   ;;(setq files (strcat folder  "\\*.pdf"))
  251.   (if (/= "" (@:get-config 'pdftk:background))
  252.       (progn
  253.         (setvar "cmdecho" 0)
  254.         (command "start-bg"
  255.            (strcat " /D \"" (vl-filename-directory filename) "\""
  256.              " /MIN /B  "
  257.              @:*prefix* app  " \""
  258.              filename "\" "
  259.              "background \""(@:get-config 'pdftk:background)"\" "
  260.              "output \""
  261.              (strcat (vl-filename-directory filename) "\\"
  262.                (vl-filename-base filename) "-background.pdf\" ")
  263.              ))
  264.         (setvar "cmdecho" 1)
  265.         ))
  266.   ))
  267.   (princ)
  268.   )

发表于 2021-11-7 16:01 | 显示全部楼层
baitang36 发表于 2021-10-31 22:03
试试这个,用startapp调用它

您有探索者PDF工程易览的绿色版吗?
发表于 2021-11-24 21:29 | 显示全部楼层
本帖最后由 KO你 于 2021-11-24 21:33 编辑
baitang36 发表于 2021-10-31 22:03
试试这个,用startapp调用它

大佬,试用下这版下面是下载链接:
http://www.pc6.com/softview/SoftView_131704.html
合并拆分都很快


是英文版的,我一直想找个中文版的没找到

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2021-11-24 21:35 | 显示全部楼层
KO你 发表于 2021-11-24 21:29
大佬,试用下这版下面是下载链接:
http://www.pc6.com/softview/SoftView_131704.html
合并拆分都很快 ...

如果有高手把这个软件搞成中文版,合并成一个单文件的工具那就完美了,直接放电脑桌面就能使用
发表于 2022-11-10 00:59 | 显示全部楼层
谢谢你们的图分享
发表于 2022-11-10 08:31 | 显示全部楼层
KO你 发表于 2021-11-24 21:35
如果有高手把这个软件搞成中文版,合并成一个单文件的工具那就完美了,直接放电脑桌面就能使用

挺好用的,多谢分享
发表于 2022-11-30 08:28 | 显示全部楼层
这个是好东西哦,一直在找呢!!
发表于 2022-11-30 09:58 | 显示全部楼层
我也一直想要这样的操作!
 楼主| 发表于 2022-11-30 20:04 | 显示全部楼层
mokson 发表于 2022-11-30 09:58
我也一直想要这样的操作!

9楼的解决方案好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-30 22:54 , Processed in 0.415131 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表