明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2187|回复: 20

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

[复制链接]
发表于 2021-10-31 16:45 | 显示全部楼层 |阅读模式
本帖最后由 sysu-沼泽 于 2021-11-1 09:20 编辑

请教下大家,在Visual Lisp中可以通过什么方式对某路径下的PDF文件进行合并?如果有示例最好啦   ps.已经搜了本论坛和晓东论坛,均是通过PDF编辑器进行的,但目前需要的是通过代码进行自动合并哈。目前搜索到的方案,大部分是通过pdftk库进行操作的,或者请问有相关代码可供借鉴吗?
发表于 2021-10-31 22:03 | 显示全部楼层
试试这个,用startapp调用它

本帖子中包含更多资源

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

x
回复 支持 2 反对 0

使用道具 举报

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

如果有高手把这个软件搞成中文版,合并成一个单文件的工具那就完美了,直接放电脑桌面就能使用
发表于 2021-10-31 21:36 来自手机 | 显示全部楼层
代码启动编辑器,在跟着全路径pdf试一试
发表于 2021-11-1 09:03 | 显示全部楼层
推荐一个命令行的PDF工具 PDFTK,功能很强大。
 楼主| 发表于 2021-11-1 09:21 | 显示全部楼层
mikewolf2k 发表于 2021-11-1 09:03
推荐一个命令行的PDF工具 PDFTK,功能很强大。

您好,我试了pdftk,但用批处理bat的时候一直运行不成功。请问您有相关简单的示例文件吗?我测试下~
 楼主| 发表于 2021-11-1 09:22 | 显示全部楼层
baitang36 发表于 2021-10-31 22:03
试试这个,用startapp调用它

感谢!这个软件不错,特别适用于要人工调整打印顺序的文件
发表于 2021-11-1 09:51 | 显示全部楼层
sysu-沼泽 发表于 2021-11-1 09:21
您好,我试了pdftk,但用批处理bat的时候一直运行不成功。请问您有相关简单的示例文件吗?我测试下~

下载的包里面应该带了示例,另外pdftk -h也有说明。
发表于 2021-11-1 20:44 | 显示全部楼层
不用试了,我写过一个调用外部exe合并PDF,因为lisp不能异步等待,所以当PDF文件比较多的时候,有可能没合并完,lisp就执行后续操作了,导致合并不完整,当然,只有几张PDF的时候,还是能比较好的完成
发表于 2021-11-1 21:37 | 显示全部楼层
http://bbs.mjtd.com/thread-102467-4-1.html

在35楼,lijiao大大有分享源码,可参考看看!
 楼主| 发表于 2021-11-3 08:29 | 显示全部楼层
Atsai 发表于 2021-11-1 21:37
http://bbs.mjtd.com/thread-102467-4-1.html

在35楼,lijiao大大有分享源码,可参考看看!

这个解决方案好!感谢!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-1 03:48 , Processed in 0.625863 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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