ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 15711|回复: 16

[求助] EXCEL VBA如何从PDF中提取页面并生成若干个新PDF文件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-2-28 12:05 | 显示全部楼层 |阅读模式
我的PDF文件里有几个页面,我想把它们全部提取出来,再分别生成一个单页的PDF文件。
请问,用EXCEL VBA如何实现?

TA的精华主题

TA的得分主题

发表于 2016-2-28 21:02 | 显示全部楼层
  1. '函数名称:ExtractPDFpages
  2. '函数功能:调用Acrobat提取pdf的单个页面并输出到指定目录(命名规则为[原文件名 - p#.pdf])
  3. '参数:
  4. '1. sPDFfile;原始PDF文件的完整路径
  5. '2. sOutputFolder;提出的PDF页面的保存目录
  6. '注意:需要在装有【Acrobat Professional】软件的电脑上运行


  7. Sub ExtractPDFpages(sPDFfile As String, sOutputFolder As String)
  8.     Dim pdf, pdfSource
  9.     Dim iPageCount As Integer
  10.     Dim sFileName As String
  11.    
  12.    
  13.     sFileName = Mid(sPDFfile, InStrRev(sPDFfile, "") + 1)
  14.     sFileName = Left(sFileName, InStrRev(sFileName, ".") - 1)
  15.    
  16.    
  17.     Set pdf = CreateObject("AcroExch.PDDoc")
  18.     Set pdfSource = CreateObject("AcroExch.PDDoc")
  19.     pdfSource.Open sPDFfile
  20.     iPageCount = pdfSource.GetNumPages
  21.    
  22.     If Right(sOutputFolder, 1) <> "" Then
  23.         sOutputFolder = sOutputFolder & ""
  24.     End If
  25.     For i = 0 To iPageCount - 1
  26.         pdf.Create
  27.         pdf.InsertPages -1, pdfSource, i, 1, 0
  28.         pdf.Save 1, sOutputFolder & sFileName & "-p" & i + 1 & ".pdf"
  29.         pdf.Close
  30.         
  31.     Next
  32.     pdfSource.Close
  33.     Set pdf = Nothing
  34.     Set pdfSource = Nothing

  35. End Sub

  36. '测试代码
  37. Sub Test()
  38.     ExtractPDFpages "d:\Guide.pdf", "d:\output"
  39.     '提取d:\Guide.pdf,并保存为:d:\output\Guide-p1.pdf、d:\output\Guide-p2.pdf、d:\output\Guide-p3.pdf……
  40. End Sub
复制代码

评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-2-28 21:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
何必用VBA,建议使用Acrobat pro
123.gif

TA的精华主题

TA的得分主题

发表于 2016-2-29 07:01 来自手机 | 显示全部楼层
EH2003 发表于 2016-2-28 21:09
何必用VBA,建议使用Acrobat pro

Acrobat pro 是可以达到目的,但2楼的代码只提供了思路,以及外接程序对象的引用方法(手机上网,未测试代码正确性)。如果提取的数量很少时,当然3楼的方法不错,但如果是大量的批处理时,2楼的方法优势就充分体现出来了。

TA的精华主题

TA的得分主题

发表于 2016-2-29 07:11 来自手机 | 显示全部楼层
还有可能,PDF页面提取只是楼主整体需求的一部分,即程序运行到某一时点,根据需求动态提取PDF文件中的某一部分页面,然后程序再将提取结果自动进行其他处理。如果是这样的话,用代码提取页面,避免了人工交互,可以提高效率。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-3-1 15:44 | 显示全部楼层
本帖最后由 bosslxt 于 2016-3-1 16:26 编辑


大侠,太谢谢你的回答了,很给力!!!
另外,我还想再问问:
PDF.InsertPages (参数)
PDF.Save (参数)
这两个命令的参数有哪些。如果我要选择两个或多个页面一起输出,该如何表达?选择多页输出时,如何控制哪个页面在前哪个在后?

TA的精华主题

TA的得分主题

发表于 2016-3-1 20:59 | 显示全部楼层
本帖最后由 小fisher 于 2016-3-1 21:07 编辑

工程中引用了Adobe Acrobat 10.0 Type Library类库(通常是C:\Program Files\Adobe\Acrobat 11.0\Acrobat\acrobat.tlb)之后,可以在对象浏览器中看到AcroPDDoc对象的下列方法:
Function InsertPages(nInsertPageAfter As Long, iPDDocSource As Object, lStartPage As Long, lNumPages As Long, lInsertFlags As Long) As Boolean
Acrobat.AcroPDDoc 的成员
从英文名称看
第一个参数nInsertPageAfter是要插入页面的位置,注意第1页的页码为0,所以第1个参数设置为0时表示为插入到第1页之后,要插入到第1页之前需要把第一个参数设置为-1
第二个参数iPDDocSource表示要插入页面的来源,是AcroPDDoc类型
第三个参数lStartPage表示要插入页面在源文件中的页码,同样是从0开始算
第四个参数lNumPages表示要插入的页数第五个参数lInsertFlags不太清楚,不过设置成0时可以正常使用
要将pdfDoc1的第8-10页插入到pdfDoc2的最前面,代码是pdfDoc2.InsertPages -1, pdfDoc1, -1, 8, 3, 0

Function Save(nType As Integer, sFullPath As String) As Boolean这个方法比较简单,第一个参数是保存类型,有下列选项:Const PDSaveBinaryOK = 16 (&H10)    'Specifies that it's OK to store in binary file. 可以存为二进制文件
Const PDSaveCollectGarbage = 32 (&H20)   'Remove unreferenced objects, often reducing file size.移除未引用的对象,通常可以缩小文件尺寸
Const PDSaveCopy = 2   'Write a copy of the file into the file. 保存文件副本
Const PDSaveFull = 1   'Write the entire file. 保存完整文件
Const PDSaveIncremental = 0 'Write changes only. 只保存改动过的地方
Const PDSaveLinearized = 4  'Save the file in a linearized fashion. 保存为线性化格式(?)
Const PDSaveWithPSHeader = 8  'Writes a PostScript header as part of the saved file. 在保存的文件中添加PostScript文件头

第二个参数是保存文件的完整路径






TA的精华主题

TA的得分主题

发表于 2016-3-1 22:14 | 显示全部楼层
小fisher 老师,我想问一下:
Function InsertPages(nInsertPageAfter As Long, iPDDocSource As Object, lStartPage As Long, lNumPages As Long, lInsertFlags As Long) As Boolean
第二个参数iPDDocSource表示要插入页面的来源,是AcroPDDoc类型
这个来源可以是PDF以外的其他文件类型么??
比如:JPG之类的文件
有个合并PDF的帖子就卡在这个问题上了,PDF格式可以合并,其他的无法合并!

再有听说过:Adobe Acrobat 内置函数,不知道在哪里可以找到解释、说明、教程之类的!

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-3-3 18:02 | 显示全部楼层
小fisher 发表于 2016-3-1 20:59
工程中引用了Adobe Acrobat 10.0 Type Library类库(通常是C:\Program Files\Adobe\Acrobat 11.0\Acrobat\a ...

多谢小fisher老师!
同时我也很感谢参与这个话题的童鞋们,希望有机会大家再来一起探讨VBA方面的问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-1 16:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 bosslxt 于 2016-4-1 17:02 编辑

小fisher 老师,请移步下一个问题:如何利用EXCEL VBA旋转PDF的页面
如有其他高人
,也请帮忙解决一下,谢谢啦!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-30 06:49 , Processed in 0.046071 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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