テクノロジー · 実用ガイド

PowerPointのノート書き出しで本文が抜ける?4状態を分けて確認する

空の結果には異なる原因があります。独自のPPTXテストで全スライドを残し、ノート本文の欠落と空欄を区別しました。

オリジナル概念図:ノートの4状態監査:既存のノートスライド、次にBODY文字枠を確認し、なし・BODY欠落・空欄・文字ありを分けます。
オリジナル概念図:ノートの4状態監査:既存のノートスライド、次にBODY文字枠を確認し、なし・BODY欠落・空欄・文字ありを分けます。 Watch at Ease

ノートの書き出しがエラーなく終わっても、プレゼンテーションの一部を取りこぼすことがあります。原稿を受け入れる前に、各スライドを「ノートスライドなし」「BODYプレースホルダーなし」「BODYが空」「BODYに文字あり」のいずれかで記録します。最初の2つを、意図的に空にしたノートと一緒に扱わないでください。

Python 3.12.14とpython-pptx 1.0.2で、独自に作成した4スライドのPPTXを検証しました。表示順を意図的に変更した保存済みファイルでは、スライドIDが259、257、256、258の順となり、ノート部品はnotesSlide3、なし、notesSlide1、notesSlide2に対応しました。ノートのファイル名順ではこの順序を再現できません。

監査では4行と既存の3つのノートスライドを保ち、入力ファイルのSHA-256も変わりませんでした。カンマ、引用符、改行、中国語を含むノートは、CSVへの書き込みと再読み込みで完全に一致しました。別の単純な読み取りではメモリー内に4つ目のノートスライドが作られ、BODYのない状態で.textを読むとAttributeErrorになりました。

これは条件を限定した文字抽出の検証であり、PowerPointでの描画や修復のテストではありません。講演原稿や後続データを作る前に、何を読み取れたか、どのページを作成者に確認すべきかを明らかにする手順です。

実際のスライド順で4つの結果を残す

保存用の原本を残したコピーをPresentation(path)で開き、enumerate(prs.slides, 1)で走査して位置とslide.slide_idを記録します。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がないだけで、破損やライブラリーの不具合とは断定できません。上流のissue983はサンプル提出を求めた後、未提出のまま終了しており、この記事はその原因を特定していません。

意味を失わずに書き出しを照合する

position、slide_id、state、notesなどの列を明示し、BODY欠落時の図形一覧は別のJSONに保持します。csv.DictWriter、UTF-8、newline=''でCSVを書き、csv.DictReaderで再読します。行数、位置、ID、状態、ノート全文を比較します。引用されたノートには改行が入るため、物理行数ではなく解析後のレコード数を数えます。

標準的なCSV出力ではNoneが空欄になるため、区別はstate列に持たせます。検証では4状態を保持でき、引用符、改行、中国語も往復で一致しました。'x'モードによる新規出力は既存の保存先への上書きも拒否しました。元のPPTXを保ち、文字を書き出すためだけにprs.saveを呼ばないでください。

例外一覧を確認してから原稿を受け入れる

結果の数を全スライド数に合わせ、各位置が1度ずつ現れることを確認します。no-notes-slideとno-body-placeholderは作成者と確認します。body-emptyは既存の本文枠が空であるという結果であり、意図的な空欄だという証明ではありません。漏れを許容できない処理では、判断を記録してから次へ進みます。

作成を伴わない確認やBODY欠落は公式資料ですでに説明されています。既存の完全なスクリプトにはNone処理や非空ノートのみの出力があり、確認済みの3状態CSVチュートリアルも欠落と空欄を安全に記録します。今回追加したのは再現可能な第4の例外と受け入れ基準の比較です。PowerPoint、Keynote、Google Slidesの画面、旧.ppt、暗号化・悪意あるパッケージ、書式の再現、マスターから継承する文字、任意の図形の普遍的な復元は検証していません。

オリジナル概念図:並べ替えたテストではID259、257、256、258がノート部品3、なし、1、2に対応し、4行の出力が例外を保持しました。
オリジナル概念図:並べ替えたテストではID259、257、256、258がノート部品3、なし、1、2に対応し、4行の出力が例外を保持しました。 Watch at Ease