乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: Grrr1337

确定程序ID

[复制链接]

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2018-2-26 18:04:49 | 显示全部楼层
提示僧侣。
回复

使用道具 举报

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2018-2-26 18:28:14 | 显示全部楼层

在链接代码
PartDocs
是一个数组,其中每个元素都是一个CAcroPDDoc对象。
粗略地看一眼后,代码基本上接受要合并的PDF文件名的逗号分隔字符串,将此字符串解析为数组
a
,并将
PartDocs数组的大小调整
为与
a相同的大小
。然后,对于
a 中的每个文件名
,如果该文件存在,请将 PDF 文档对象添加到
PartDocs
数组中。
if i
部分位于
For
循环测试
i 是否
大于零(因为 VBA 中的 zero=false),如果是这样,则将 PDF 文档合并到索引
i
与索引
0 处的 PDF 文档

回复

使用道具 举报

61

主题

792

帖子

35

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1015
发表于 2018-2-26 18:34:14 | 显示全部楼层

应该把它定义为偏头痛:
  1. ;|
  2. (Merge ; Creates a file, but it contains only the first PDF file (I was testing on single-paged PDFs)
  3.   (strcat (getenv "userprofile") "\\Desktop\\Hale 515\\PDFs") ; in
  4.   (strcat (getenv "userprofile") "\\Desktop\" "MergedPDFS.pdf") ; out
  5. )
  6. |;
  7. ; in - folder that contains .pdf files
  8. ; out - path\\filename.pdf
  9. (defun Merge ( in out / *error* L n PartDocs ni n r )
  10.   
  11.   (defun *error* ( m )
  12.     (and PartDocs (vl-catch-all-apply 'vlax-invoke-method (list PartDocs 'Close)))
  13.     (and AcroApp (vl-catch-all-apply 'vlax-invoke-method (list AcroApp 'CloseAllDocs)))
  14.     (and AcroApp (vl-catch-all-apply 'vlax-invoke-method (list AcroApp 'Exit)))
  15.     (foreach x (list AcroApp AcroPDDoc) (and (eq 'VLA-OBJECT (type x)) (vl-catch-all-apply 'vlax-release-object (list x))))
  16.     (gc) (gc) (and m (princ m)) (princ)
  17.   ); defun *error*
  18.   
  19.   (setq AcroApp (vlax-get-or-create-object "AcroExch.App"))
  20.   (setq L ((lambda (pat) (mapcar '(lambda (x) (strcat pat "\" x)) (vl-directory-files pat "*.pdf" 1))) in))
  21.   
  22.   ; Not Sure how to adjust 'n'
  23.   (setq n (length L))
  24.   ; (setq n 0)
  25.   
  26.   (foreach x L ; The issue is within this loop
  27.     (setq PartDocs (vlax-get-or-create-object "AcroExch.PDDoc"))
  28.    
  29.     (eq :vlax-true (vlax-invoke-method PartDocs 'Open x))
  30.     (setq ni (vlax-invoke-method PartDocs 'GetNumPages))
  31.     ; Function InsertPages(nInsertPageAfter As Long, iPDDocSource As Object, lStartPage As Long, lNumPages As Long, lInsertFlags As Long) As Boolean
  32.     (if (eq :vlax-true (vlax-invoke-method PartDocs 'InsertPages (1- n) PartDocs 0 ni :vlax-true)) ;
  33.       (progn
  34.         (setq n (+ n ni))
  35.         
  36.       ); progn
  37.       (progn
  38.         (setq n (+ 1 (vlax-invoke-method PartDocs 'GetNumPages)))
  39.         
  40.       ); progn
  41.     ); if
  42.     ; (vlax-invoke-method PartDocs 'Close)
  43.     ; (vlax-release-object PartDocs)
  44.   ); foreach
  45.   (setq r
  46.     (eq :vlax-true
  47.       (vlax-invoke-method PartDocs 'Save
  48.         1 ; PDSaveFull
  49.         out
  50.       ); vlax-invoke-method
  51.     ); eq
  52.   ); setq r
  53.   (*error* nil) r
  54. ); defun Merge

顺便说一句,李,谢谢你的意见,但我明天会读的。因为这就像喝伏特加。
回复

使用道具 举报

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2018-2-26 18:48:34 | 显示全部楼层

http://youtu.be/5qHNQxZGZKU
回复

使用道具 举报

61

主题

792

帖子

35

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1015
发表于 2018-2-27 06:00:43 | 显示全部楼层

http://youtu.be/5qHNQxZGZKU
啊,完全不知道这个乐队的存在。
最终得到了什么是CAcroPDDoc对象:
  1. (setq o (vlax-get-or-create-object "AcroExch.PDDoc")) ; returns #

Tho,没有意识到在那个VBA代码中PartDocs是一个数组 - 如果是这样:看起来它无法在LISP中获得。
哦,或者你的意思是他手动为vla对象创建了一个
safearray
,并在以后用CAcroPDDoc对象填充它?
我有点明白了(当我在那里看他的第一个代码建议时).虽然更喜欢使用完整的.pdf文件路径
,所以这是ReDim函数。
这是有价值的信息,起初我试图添加单个PDF文档对象 - 然后我认为这似乎很不寻常,在循环中创建相同的对象而不释放它。
这就是为什么我的lisp代码不同的原因......但是在看了一堆类似的vba-acrobat-scripting代码之后,我意识到我错了。
对我来说,这是代码中最令人沮丧的部分。
最后,我开始在网上寻找“最简单的建议”,只是为了看看InsertPages是如何工作的。
停止在这个简单的例子,关于如何合并两个PDF文档,Sub Button1_Click,看起来我得到了它!
所以现在伙计们,我们有一个LISP子来合并PDF:
  1. ;| Examples:
  2. (MergePDFs
  3.   (strcat (getenv "userprofile") "\\Desktop\\Hale 515\\PDFs") ; in
  4.   (strcat (getenv "userprofile") "\\Desktop\" "MergedPDFS.pdf") ; out
  5. )
  6. (MergePDFs
  7.   (list ; in
  8.     (getfiled "Specify PDF file" (strcat (getenv "userprofile") "\\Desktop\") "pdf" 16)
  9.     (strcat (getenv "userprofile") "\\Desktop\\I_Dont_Exist.pdf")
  10.     (getfiled "Specify PDF file" (strcat (getenv "userprofile") "\\Desktop\") "pdf" 16)
  11.     (getfiled "Specify PDF file" (strcat (getenv "userprofile") "\\Desktop\") "pdf" 16) ; You can cancel and provide nil if you want to
  12.   ); list
  13.   (strcat (getenv "userprofile") "\\Desktop\" "MergedPDFS.pdf") ; out
  14. )
  15. |;
  16. ; in - folder that contains .pdf files, or a list of ("\\.pdf" "\\.pdf" ..)
  17. ; out - path\\filename.pdf - Overwrites the existing (if theres one)
  18. ; If successful, Returns assoc list of '(( PageCount) ..)
  19. (defun MergePDFs ( in out / *error* AcroApp L PD r )
  20.   ; http://www.theswamp.org/index.php?topic=53974.msg586248#msg586248
  21.   (defun *error* ( m )
  22.     (and L (foreach x (mapcar 'car L) (vl-catch-all-apply 'vlax-invoke-method (list x 'Close)) (vl-catch-all-apply 'vlax-release-object (list x))))
  23.     (and AcroApp
  24.       (vl-catch-all-apply 'vlax-invoke-method (list AcroApp 'CloseAllDocs))
  25.       (vl-catch-all-apply 'vlax-invoke-method (list AcroApp 'Exit))
  26.       (vl-catch-all-apply 'vlax-release-object (list AcroApp))
  27.     ); and
  28.     (gc) (gc) (and m (princ m)) (princ)
  29.   ); defun *error*
  30.   
  31.   (and in out
  32.     (or (setq AcroApp (vlax-get-or-create-object "AcroExch.App")) (prompt "\nUnable to interfere with Acrobat object.") )
  33.     (cond
  34.       ( (eq 'STR (type in)) ; folder provided
  35.         (setq L ((lambda (pat / tmp) (if (setq tmp (vl-directory-files pat "*.pdf" 1)) (mapcar (function (lambda (x) (list (vlax-get-or-create-object "AcroExch.PDDoc") (strcat pat "\" x)))) tmp))) in))
  36.       )
  37.       ( (vl-consp in) ; list of .pdf filepaths'n'names provided
  38.         (setq L (mapcar (function (lambda (x) (list (vlax-get-or-create-object "AcroExch.PDDoc") x))) in))
  39.       )
  40.     ); cond
  41.     (setq L (apply (function append) (mapcar (function (lambda (x) (if (eq :vlax-true (vlax-invoke-method (car x) 'Open (cond ((cadr x)) ("")))) (list (append x (list (vlax-invoke-method (car x) 'GetNumPages))))))) L)))
  42.     (setq PD (caar L))
  43.     (progn
  44.       (foreach x (cdr L) ; L - assoc list of (#  )
  45.         (if (eq :vlax-false (vlax-invoke-method PD 'InsertPages (1- (vlax-invoke PD 'GetNumPages)) (car x) 0 (caddr x) :vlax-true))
  46.           (prompt (strcat "\nCannot insert pages from "" (cadr x) """))
  47.         )
  48.       )
  49.       (or (eq :vlax-true (vlax-invoke-method PD 'Save 1 out)) ; 1 = PDSaveFull
  50.         (prompt "\nCannot save the modified document")
  51.       ); or
  52.     ); progn
  53.     (setq r (mapcar 'cdr L))
  54.   ); and
  55.   
  56.   (*error* nil) r
  57. ); defun MergePDFs

再次非常感谢你的帮助,我会尝试调整我的眼睛更多的VBA编码,尽管在编写LISP时仍然更舒服。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 00:21 , Processed in 0.145720 second(s), 60 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表