ExcelVBA搭配Python實作PDF合併

建築、土木工程的文件管理

在建築、土木工程領域,專案管理者和工程人員經常面臨著繁瑣的文件管理任務,尤其是涉及大量PDF格式的工程報表和工程圖紙。

歸檔時發現文件散亂或一張一張列印紙本放入卷宗都會很麻煩,不僅浪費寶貴的時間,還可能導致文件混亂、版本混亂的問題,因此,筆者藉由原本Excel的表格當基底搭配Python合併PDF套件,讓整個過程變得比較不那麼痛苦一些...

整體實作邏輯如下:

1.利用PyPDF套件指定input為file_with_paths.txt,output為Merge.pdf,透過Pyinstaller編譯成merge.exe,供之後呼叫合併PDF時使用。

(有需要這個套件的朋友再請加入LINE社群中,我會放在筆記本)

2.Excel中會有PDF文件列表,透過VBA產製出PDF預計要合併的順序路徑文字檔(file_with_paths.txt)。

3.VBA呼叫Shell去執行merge.exe,進行Python套件的合併作業。

4.執行完畢會產生一個Merge.pdf,進入檔案資訊檢查是否為最新版本,成功則完成。

解決方案的價值

1. 自動生成路徑,消除手動錯誤

我們的工具通過Excel VBA自動生成PDF檔案路徑,消除了手動錯誤的風險。工程人員只需在表格中列出相關PDF檔案的路徑,即可完成路徑的生成,節省了寶貴的時間並確保準確性。

2. 自動合併PDF,提高效率

使用Python的PyPDF套件,我們實現了PDF檔案的自動合併。這不僅節省了手動合併的時間,還保證了合併的準確性。透過ExcelVBA列表進行文件的管控,解決版本混淆的問題。

3. 快速檢查最新檔案,降低錯誤風險

工具最後一步使用VBA打開檔案總管,迅速展示生成的合併PDF檔案,自動檢查生成版本的時間,確保工程人員能夠開啟正確的檔案,而非開啟以前所生成的檔案。

P.S:Shell的操作因為執行流程是分開的,所以其實不能知道什麼時候才會完成

總結

這個小工具是基於實際需求而開發,旨在簡化專案管理中的文件合併流程。在建築和土木工程領域,文件管理通常是繁瑣且耗時的工作,尤其是處理大量的PDF文件時更是如此。 透過自動生成PDF路徑、自動合併PDF以及檢查最新檔案的功能為使用者提供了一個更有效率的文件生成選擇。ExcelVBA畢竟還是有它的極限在,此時使用者只需透過呼叫Python的套件來進行功能擴充便能達到更多的可能。


相關程式碼


Sub RunTestGPTWithParameters()
Dim path1 As String
Dim myret As Long
Dim command As String
Dim searchKeyword As String
Dim savePath As String
' 設置可執行文件所在的目錄
'path1 = ThisWorkbook.Path ' ThisWorkbook.Path & "\GooglePhotoDownloader"
'ChDir path1
PDF_PATH = ThisWorkbook.Path & "\Lib\Merge\merge.pdf"
TXT_PATH = ThisWorkbook.Path & "\Lib\Merge\file_with_paths.txt"
command = ThisWorkbook.Path & "\Lib\Merge\Merge.exe """ & TXT_PATH & """ """ & PDF_PATH & """"
' 使用Shell函數運行可執行文件並等待其完成
myret = Shell(command, 1)
End Sub


Sub CheckFileCreateTimeWithRetryAndDelay(ByVal CurrentTime)
' 文件路?
FilePath = ThisWorkbook.Path & "\Lib\merge\merge.pdf"
' ?置容忍的差异??(?里?置?1小?)
ToleranceHours = 0 '1 / 24
' 最大??次?
MaxTries = 20
Dim FileCreateTime As Date
'Dim CurrentTime As Date
Dim Tries As Integer
Tries = 1
Do While Tries <= MaxTries
Debug.Print Tries
If Dir(FilePath) = "" Then
' 文件不存在,等待2秒?再??
Tries = Tries + 1
If Tries <= MaxTries Then
Application.Wait Now + TimeValue("00:00:02")
End If
Else
' 文件存在,?取文件的?建??
FileCreateTime = FileDateTime(FilePath)
' ?取?前??
'CurrentTime = Now
' 比?文件?建??和?前??,考?容忍??
If FileCreateTime > CurrentTime Then
Shell "cmd /c start " & FilePath, vbNormalFocus
Exit Do
Else
' 文件?建??在容忍范?外,等待2秒?然后重?
Tries = Tries + 1
If Tries <= MaxTries Then
Application.Wait Now + TimeValue("00:00:02")
End If
End If
End If
Loop
If Tries > MaxTries Then
MsgBox "已?到最大重?次?。"
End If
End Sub


Sub WriteCollectionToTxt(ByVal coll)
'Dim col As Collection
Dim Item As Variant
Dim FilePath As String
Dim FileName As String
Dim FileNumber As Integer
' ?建一?新的集合并添加?据(?里只是示例,你需要自己填充你的集合)
'Set col = New Collection
'col.Add "Item1"
'col.Add "Item2"
'col.Add "Item3"
' 指定文件名和路?
FileName = "file_with_paths.txt"
FilePath = ThisWorkbook.Path & "\Lib\Merge\" & FileName
' 打?文本文件以?行?入
FileNumber = FreeFile
Open FilePath For Output As FileNumber
' 遍?集合并?每??目?入文本文件
For Each Item In coll
Print #FileNumber, Item
Next Item
' ??文件
Close FileNumber
End Sub

留言

Popular Posts

Excel VBA @ 監造日報表、查驗表 -2

ExcelVBA@施工照片整理的應用範例

Excel VBA@ 監造日報表、查驗表