2022年3月3日 星期四

Excel VBA:如何讀取 PDF 檔案的頁數

Excel VBA:如何讀取 PDF 檔案的頁數:

筆者很多時候都會將文件變成 Acrobat 的 PDF 存檔,也儲存了不少 PDF 資料檔,久而久之,累積了不少 PDF 檔,雖然已經是分門別類,但當需要時要找出來,也是花了不少時間,所以想將 PDF 資料檔名稱、資料和頁數紀錄在 Excel Worksheet 內,方便找尋檔案時候使用。

Excel VBA 讀取 PDF 檔案的頁數
  • 操作系統:Windows 7 64-bit 版本
  • 開發環境:Microsoft Excel 2007 版本
  • 電腦:MSI GS60 2QD Ghost 龍魂筆電(Gaming Notebook)
  • CPU:Intel Core i7-4720HQ 2.6GHz Haswell 四核心處理器
  • GPU :NVIDIA GeForce GTX 965M 2GB GDDR5 獨顯
  • Memory:8GB DDR3 + 1TB HDD
  • Display:15.6吋 4K 面板

筆者使用讀取二進制檔案方法,首先是選擇了 Directory,然後祇選擇讀取 PDF(.pdf)檔案,再用 Regular Expressions 找尋 Page,最後儲存在 Worksheet 內。

Excel VBA 編程(Excel 2007):
  • 檔案 → 開新檔案,打開新檔案(或按 Ctrl + N)。
  • 工具 → 巨集 → Visual Basic 編輯器,進入 VBA 編輯器(或按 Alt + F11)。
  • 選擇功能表命令 插入 → 點擊模組(Insert → Module)。
  • 編寫 VBA 程式。
  • 執行 VBA 模組(或按 F5)。
  • 檔案 → 關閉並回到 Microsoft Excel(或按 Alt + Q)。
  • 儲存檔案。

讀取 PDF 檔案的頁數 VBA 程式:

Private Sub PDFPage()

    Dim x As Long             ' File Count

    Dim xStr As String          ' Filename

    Dim xRange As Range       ' Cell Range

    Dim xFilebox As FileDialog   ' File Directory Box

    Dim xFdItem As Variant      ' File Item

    Dim xFileName As String     ' Filename

    Dim xFileNum As Long      ' Filename Number

    Dim RegExp As Object       ' File Object

   

    Set xFilebox = Application.FileDialog(msoFileDialogFolderPicker)

    

    If xFilebox.Show = -1 Then

        xFdItem = xFilebox.SelectedItems(1) & Application.PathSeparator

        xFileName = Dir(xFdItem & "*.pdf", vbDirectory)  'Select PDF File Only

 

        Set xRange = Range("A1")

        Range("A:B").ClearContents              ' Clear All AB Content

        Range("A1:B1").Font.Bold = True          ' Header Font Bold

        xRange = "File Name"                   ' Header File Name

        xRange.Offset(0, 1) = "Pages"             ' Headder Pages

       

        x = 2                                ' Start From Row 2

        xStr = ""                             ' Clear Filename String

       

        Do While xFileName <> ""

            Cells(x, 1) = xFileName             ' Store Filename

           

            ' Tools -> References - > Microsoft VBScript Regular Expressions 5.5 (Pattern Search)

            Set RegExp = CreateObject("VBscript.RegExp")  ' VBScript Regular Expressions for Search

            RegExp.Global = True                      ' Global Regular Expressions for Search

            RegExp.Pattern = "/Type\s*/Page[^s]"          ' Search Pattern Page

           

            xFileNum = FreeFile                       ' Return Integral for Next File Number

            Open (xFdItem & xFileName) For Binary As #xFileNum  ' Open Binary File

                xStr = Space(LOF(xFileNum))             ' Return the Size of File

                Get #xFileNum, , xStr                   ' Get File

            Close #xFileNum                           ' Close File

            Cells(x, 2) = RegExp.Execute(xStr).Count    ' Search Pattern and Store Page Number

            x = x + 1                             ' x+1 for counter

            xFileName = Dir                       ' Returns the Next of a Filename until ""

        Loop

    End If

End Sub


相關網頁:
◎ RS-232 ﹣用 Excel 做串列介面數據傳輸及接收 (四) 
◎ RS-232 ﹣用Excel API做串列介面數據傳輸及接收 (五) 
◎ Excel:Customize Menu 如何加入自訂功能表 (一) 
◎ Excel:Customize Menu 如何加入自訂功能表 - 範例 (二) 
◎ Excel:User Defined Functions (UDF) 自定函數 
◎ Excel:排序的順序 Sort order 
◎ Excel : VLOOKUP 和 INDEX 函數應用 
◎ Excel:CTRL 組合快速鍵
◎ Excel:Function 功能快速鍵 
◎ Excel:打開時如何不開啟空白的工作表 
◎ Excel:簡化找尋資料的 VBA 小程式 

2022年 3月 3日(Thu)天氣報告
氣溫:42.0°F / 6.0°C @ 07:00
風速:每小時 6公里
降雨機會:40%
相對濕度:百分之 91%
天氣:多雲

沒有留言:

張貼留言