如何使用VBA获取pdf文档中的页数?

时间:2017-07-10 14:46:02

标签: vba excel-vba pdf acrobat excel

我会在这个问题上发布我的解决方案,但也许其他人找到了更好的方法。

我想使用VBA获取pdf文档中的页数。

我回顾了类似的[vba]和[acrobat]问题,但我没有找到一个独立的解决方案。在查看了其他帖子,Adobe Acrobat的SDK和VBA对象浏览器之后,我学到了很多东西来拼凑这个解决方案。

我正在运行Excel 2013和Adobe Acrobat 9.0 Pro。

我理解answer my own question可以。

3 个答案:

答案 0 :(得分:2)

此解决方案适用于安装Excel 2013 Professional和Adobe Acrobat 9.0 Pro的情况。

您需要启用Adobe对象模型:工具 - >参考文献 - >选中Acrobat复选框。

Adobe's SDK对GetNumPages方法的文档有限。

'with Adobe Acrobat 9 Professional installed
'with Tools -> References -> Acrobat checkbox selected

Sub AcrobatGetNumPages()

Dim AcroDoc As Object

Set AcroDoc = New AcroPDDoc

AcroDoc.Open ("C:\Users\Public\Lorem ipsum.pdf") 'update file location

PageNum = AcroDoc.GetNumPages

MsgBox PageNum

AcroDoc.Close

End Sub

答案 1 :(得分:0)

灵感来自:https://www.extendoffice.com/documents/excel/5330-excel-vba-pdf-page-count.html

我创建了下面的函数。我没有安装 Adob​​ acrobat pro。

子测试()

Dim vFolder, vFileName

vFolder = "D:\Test Count Pages In PDF File\"
'vFolder = "D:\Test Count Pages In PDF File\" '--> fine for both forms (with or without PathSeparator)
vFileName = "My File.pdf"
Debug.Print fNumberOfPages_in_PDF_File(vFolder, vFileName)
    

结束子

函数 fNumberOfPages_in_PDF_File(vFolder, vFileName)

Dim xStr As String
Dim xFileNum As Long
Dim RegExp As Object

'--- Number of Pages =0 if the file is not a PDF file
If Not vFileName Like "*.pdf" Then
    fNumberOfPages_in_PDF_File = 0
    Exit Function
End If

'--- Add PathSeparator ("\") if it does not exist
If Right(vFolder, 1) <> Application.PathSeparator Then
    vFolder = vFolder & Application.PathSeparator
End If

'--- Count the number of pages in Pdf File
xStr = ""
Set RegExp = CreateObject("VBscript.RegExp")
RegExp.Global = True
RegExp.Pattern = "/Type\s*/Page[^s]"
xFileNum = FreeFile
Open (vFolder & vFileName) For Binary As #xFileNum
    xStr = Space(LOF(xFileNum))
    Get #xFileNum, , xStr
Close #xFileNum

fNumberOfPages_in_PDF_File = RegExp.Execute(xStr).Count

结束函数

答案 2 :(得分:-1)

Option Explicit
Public PDFDoc As AcroPDDoc, PDFPage As Object, A3&, A4&
Sub Main()
    Dim fso As FileSystemObject, fld As Folder, filePDF As File, fileName$, i&, Arr()
    Set fso = New FileSystemObject
    Set PDFDoc = New AcroPDDoc
    Set fld = fso.GetFolder(ThisWorkbook.Path)
    ReDim Arr(1 To 1000, 1 To 4)
    For Each filePDF In fld.Files
    
     Application.Calculation = xlCalculationManual
    
        fileName = filePDF.Name
        If Right(fileName, 4) = ".pdf" Then
            CountPagesPDF (ThisWorkbook.Path & "\" & fileName)
            i = i + 1
            Arr(i, 1) = fileName
            Arr(i, 2) = A3 + A4
            Arr(i, 3) = A3
            Arr(i, 4) = A4
            
        End If
    Next
    Range("A3:D" & Cells.Rows.Count).Clear
    Range("A3:D" & (i + 1)) = Arr
    Set PDFPage = Nothing
    Set PDFDoc = Nothing
    Set fso = Nothing
    
     Application.Calculation = xlCalculationAutomatic
    
End Sub

Sub CountPagesPDF(FullFileName$)
    Dim j&, n&, x, y
    A3 = 0
    A4 = 0
    PDFDoc.Open (FullFileName)
    n = PDFDoc.GetNumPages
    
    Application.Calculation = xlCalculationManual
    
    For j = 0 To n - 1
        Set PDFPage = PDFDoc.AcquirePage(j)
        x = PDFPage.GetSize().x
        y = PDFPage.GetSize().y
        If x + y > 1500 Then A3 = A3 + 1 Else A4 = A4 + 1
    Next
    
    Application.Calculation = xlCalculationAutomatic
    
    PDFDoc.Close
End Sub