科技 · 實用指南
PowerPoint 備忘稿匯出漏字?先核對四種狀態再驗收講稿
空結果可能來自三種不同情況。透過一份受控 PPTX,我們保留全部投影片,並區分備忘稿本文預留位置缺失與真正的空備忘稿。

備忘稿匯出程式順利結束,仍可能漏掉簡報的一部分。驗收講稿前,應為每頁記錄一種結果:沒有備忘稿頁、沒有 BODY 本文預留位置、BODY 為空,或 BODY 有文字。前兩種情況不能與有意留空的備忘稿混為一談。
我們用原創四頁 PPTX,在 Python 3.12.14 與 python-pptx 1.0.2 中測試這項邊界。主動改變放映順序後,已儲存檔案的投影片 ID 依序為 259、257、256、258,對應備忘稿組件為 notesSlide3、無、notesSlide1、notesSlide2。按備忘稿檔名排序無法還原該順序。
稽核保留四筆記錄及原有三個備忘稿頁,輸入檔案的 SHA-256 未變。包含逗號、引號、換行和中文的備忘稿,經 CSV 寫入再讀取後逐字一致。另一次直接讀取則在記憶體中新建第四個備忘稿頁;對缺失 BODY 的 .text 存取觸發 AttributeError。
這是受控的文字擷取測試,並非 PowerPoint 畫面呈現或修復測試。目標是在產生會議講稿或後續資料前,釐清實際讀取了什麼,以及哪些頁面需要作者確認。
按實際頁序讀取,保留四種結果
用 Presentation(path) 開啟保留的副本,走訪 enumerate(prs.slides, 1),同時記錄目前位置與 slide.slide_id。ID 只在該簡報內識別頁面,不能當作跨簡報的通用識別碼。透過投影片的備忘稿關聯取值,不要把 notesSlideN.xml 直接分配給第 N 頁。
每頁先判斷 has_notes_slide;False 記為 no-notes-slide,不存取 notes_slide。否則取得 notes_slide.notes_text_frame;None 記為 no-body-placeholder;.text 等於空字串記為 body-empty;其他字串記為 body-text。保留原始字串與空白字元;如需標記純空白備忘稿,另加旗標,不要悄悄 strip。
BODY 缺失是待處理異常,不是空講稿
BODY 預留位置是備忘稿本文的目標。備忘稿頁還可能有其他文字框與預留位置。在我們缺失 BODY 的樣本中,一個自訂文字框有待審訊息,頁碼預留位置有 999。稽核另外列出兩者的圖案 ID、名稱、類型和文字,演講備忘稿欄保持空值。
不要把所有圖案串接成講稿,也不要自動修復檔案。應請簡報作者判斷自訂文字是否應移入備忘稿本文。BODY 缺失本身不能證明檔案損壞或程式庫有缺陷。上游問題 983 在要求提供範例檔案但未獲提供後關閉,本指南沒有確定其故障原因。
讓匯出結果可核驗,同時保留含義
明確設定 position、slide_id、state、notes 等欄,並將缺失 BODY 的圖案清單另外存為 JSON。使用 csv.DictWriter、UTF-8 和 newline='' 寫 CSV,再用 csv.DictReader 重讀。核對記錄數、頁序、ID、狀態及備忘稿字串全文。含換行的引號欄位會跨實體行,因此應統計解析後的記錄數。
預設 CSV 寫入會把 None 序列化成空欄位,區別必須由 state 欄承載。測試中的四種狀態均保留,含引號、換行和中文的備忘稿往返一致。以 'x' 模式建立新輸出,也確實拒絕覆寫既有目標。保留原 PPTX,不要為了匯出文字呼叫 prs.save。
處理完異常清單,再驗收講稿
匯出記錄數應與投影片總數一致,每個位置只出現一次。讓作者確認 no-notes-slide 與 no-body-placeholder 兩類頁面。body-empty 只表示既有本文文字框為空,不能單獨證明作者有意留白。對不能容忍遺漏的流程,應在這些決定有記錄後再進入下一步。
官方文件早已說明無建立檢查與 BODY 缺失;現有完整腳本也能處理 None,或只匯出非空備忘稿。已審讀的三狀態 CSV 教學同樣能安全記錄缺失和空備忘稿。本文新增的是可重現的第四種異常及驗收對照。未測試 PowerPoint、Keynote、Google Slides 介面、舊 .ppt、加密或惡意套件、豐富文字保真、母片繼承文字,亦不承諾任意圖案都能復原。
