ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码自定义获取pdf文件页数的函数?

如何用vba代码自定义获取pdf文件页数的函数?

作者:绿色风 分类: 时间:2022-08-17 浏览:378
楼主
kevinchengcw
Q: 如何用vba代码自定义获取pdf文件页数的函数?
A: 自定义函数代码如下:
  1. Function GetPages(FileName As String)   '变量为全路径文件名
  2. Dim FN$, FSO, mFile, Str$, RegEx, P%
  3. FN = FileName   '取得文件名(注:全路径)
  4. Set FSO = CreateObject("scripting.filesystemobject")    '创建FSO项目用于打开文件
  5. Set RegEx = CreateObject("vbscript.regexp")     '创建正则项目,用于匹配关键字段
  6. With RegEx
  7.     .Global = True      '全程有效
  8.     .MultiLine = True   '多行有效
  9.     .Pattern = "/Count [\d]+"   '关键字特征“/Count 页数”
  10. End With
  11. Set mFile = FSO.opentextfile(FN)    '以文本形式打开pdf文件
  12. P = 0   '初始化一下页数值,防止出错
  13. Do While Not mFile.atendofstream    '循环直到文件结尾
  14.     Str = mFile.readline        '读取一行(如此操作是为了避免读入数据量太大)
  15.     If Str Like "*/Count #*" Then P = IIf(Val(Split(RegEx.Execute(Str)(0).Value, " ")(1)) > P, Val(Split(RegEx.Execute(Str)(0).Value, " ")(1)), P)     '取得对应的关键字段中的数值(即页数值)
  16. Loop
  17. mFile.Close     '关闭文件
  18. If P = 0 Then   '如果未取得数值或取得0值,则返回"?"
  19.     GetPages = "?"
  20. Else            '否则返回取得的页数值
  21.     GetPages = P
  22. End If
  23. Set mFile = Nothing     '清空创建的项目
  24. Set FSO = Nothing
  25. Set RegEx = Nothing
  26. End Function
以上代码也可修改为sub程序来运行进行批量处理。
2楼
kevinchengcw
一年半啦,简化一下吧
  1. Function GetPages(FileName As String)   '变量为全路径文件名
  2. Dim Match, Str$, P%
  3. With CreateObject("scripting.filesystemobject").opentextfile(FileName)
  4.     Str = .readall
  5.     .Close
  6. End With
  7. P = 0
  8. With CreateObject("vbscript.regexp")
  9.     .Global = True
  10.     .MultiLine = True
  11.     .Pattern = "\/Count ([\d]+)"
  12.     If .test(Str) Then
  13.         For Each Match In .Execute(Str)
  14.             If Val(Match.submatches(0)) > P Then P = Val(Match.submatches(0))
  15.         Next Match
  16.     End If
  17. End With
  18. GetPages = IIf(P = 0, "?", P)
  19. End Function
3楼
ljh29206
版主 问下  打印 的命令 如何呢
如果我想打印   按页数的 数量 如果 大于 6  则 前2页 打印2次   如果 小于 6  则 前2页 打印1次.
其他全部1次. 该这么操作?
4楼
ljh29206
Sub df()
  Dim FileName As String
Dim Match, Str$, P%
  FileName = Application.GetOpenFilename("PDF文件(*.PDF),*.PDF")
With CreateObject("scripting.filesystemobject").opentextfile(FileName)
    Str = .readall
    .Close
End With
P = 0
With CreateObject("vbscript.regexp")
    .Global = True
    .MultiLine = True
    .Pattern = "\/Count ([\d]+)"
    If .test(Str) Then
        For Each Match In .Execute(Str)
            If Val(Match.submatches(0)) > P Then P = Val(Match.submatches(0))
        Next Match
    End If
End With
MsgBox (P)
End Sub

读不出页数,麻烦 K版帮忙看下.
5楼
kevinchengcw
方便的话,把读不出页数的文件下传看下
6楼
ljh29206
很奇怪 我就那个文件不行 ! 再试了其他的几个都可以!
由于 30M 有多 上传不了!

另 K版 问下  打印 的命令 怎么写
如果我想打印   按页数的 数量 如果 大于 6  则 前2页 打印2次   如果 小于 6  则 前2页 打印1次.
其他全部1次. 该这么操作?
7楼
kevinchengcw
vba不通过控件似乎没办法控件pdf的打印,这个要看你安装的哪个pdf阅读软件,及他是否支持其他程序调用了
8楼
ljh29206
我这边 使用的 是 adobe reader 9  的 软件打开的 请问 可否 做到?

另外 K版 能推介一个 阅读软件 能够做得到?
9楼
kevinchengcw
这方面我也没尝试过,你可以先搜索一下,看有没有现成的实例供参考
10楼
ljh29206
Sub AcrobatPrint()

  Dim FileName As String
Dim Match, Str$, P%
  FileName = Application.GetOpenFilename("PDF文件(*.PDF),*.PDF")
With CreateObject("scripting.filesystemobject").opentextfile(FileName)
    Str = .readall
    .Close
End With

    Dim PrintMode As String
    PrintMode = InputBox("all or first")

     Dim AcroExchApp As Acrobat.CAcroApp
     Dim AcroExchAVDoc As Acrobat.CAcroAVDoc
     Dim AcroExchPDDoc As Acrobat.CAcroPDDoc
     Dim num As Integer

     Set AcroExchApp = CreateObject("AcroExch.App")
     Set AcroExchAVDoc = CreateObject("AcroExchAV.Doc")
     AcroExchAVDoc.Open FileName, ""
     
     Set AcroExchPDDoc = AcroExchAVDoc.GetPDDoc
     num = AcroExchPDDoc.GetNumPages - 1
     If PrintMode = "all" Then
          'Print all pages
           Call AcroExchAVDoc.PrintPages(0, num, 2, 1, 1)
           
     Else
               'Print first page
           Call AcroExchAVDoc.PrintPages(0, 0, 2, 1, 1)
     End If
End Sub

我在 网上找到  以上代码,   打印第一页 或者全部.   
但     Set AcroExchApp = CreateObject("AcroExch.App")
     Set AcroExchAVDoc = CreateObject("AcroExchAV.Doc")
提示  ACtive x  部件不能创建对象
我引用了  关于 adobe reader 9.0 的全部控件 都 不行.
可否帮忙看下 有没的搞 , K版  
11楼
kevinchengcw
估计是对应的dll或ocx文件没有注册,不过先要知道对应的是哪些文件

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap