Python(Java 経由)でプレゼンテーション情報を取得および更新

概要

Aspose.Slides は、プレゼンテーションの形式を識別し、完全なプレゼンテーション オブジェクト モデルを作成せずにドキュメント メタデータを読み取ることができます。これは、ファイルを分類したり、インベントリを構築したり、プレゼンテーションの内容を読み込んで処理するかどうかを判断する前にプロパティを検査したりする場合に便利です。

この例では、Aspose.Slides for Python via Java と互換性のある Java ランタイムが必要です。各例は、JVM が起動していない場合に起動します。例で使用されているパスに既存のプレゼンテーション ファイルを配置してください。

この記事では、PresentationFactoryPresentationInfo を使用した軽量な検査、および DocumentProperties を使用したターゲット更新を示します。

プレゼンテーション形式の確認

PresentationFactory.getPresentationInfo を使用して、Presentation インスタンスを作成せずにファイルを検査します。 PresentationInfo.getLoadFormat メソッドは、PPTX、PPT、ODP など検出された形式を報告します。

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LoadFormat, PresentationFactory

file_names = ["pres.pptx", "pres.ppt", "pres.odp"]

for file_name in file_names:
    presentation_info = PresentationFactory.getInstance().getPresentationInfo(file_name)
    load_format = presentation_info.getLoadFormat()
    format_name = f"Other ({load_format})"

    if load_format == LoadFormat.Pptx:
        format_name = "PPTX"
    elif load_format == LoadFormat.Ppt:
        format_name = "PPT"
    elif load_format == LoadFormat.Odp:
        format_name = "ODP"

    print(f"{file_name}: {format_name}")

軽量プレゼンテーションインベントリの構築

多数のプレゼンテーション ファイルを処理する場合、検証、インデックス作成、または文書管理システム用のコンパクトなインベントリが必要になることがあります。このシナリオでは、PresentationFactory.getPresentationInfo を使用して PresentationInfo オブジェクトを取得し、次に PresentationInfo.readDocumentProperties を呼び出してドキュメント メタデータを読み取ります。このアプローチは、Presentation インスタンスを作成したり、完全なプレゼンテーション オブジェクト モデルを走査したりする必要がありません。

DocumentProperties が提供する拡張プロパティは、次のインベントリ値を返します。

メソッド インベントリ値
getSlides スライドの総数。
getHiddenSlides 非表示スライドの数。
getNotes ノートが含まれるスライドの数。
getParagraphs 利用可能な場合の段落の総数。
getWords 単語の総数。
getMultimediaClips 音声およびビデオクリップの総数。

以下の例は、Presentation オブジェクトを作成せずにこれらの値を読み取り、コンパクトなインベントリを出力します。また、getHeadingPairsgetTitlesOfParts を組み合わせて、フォント、テーマ、スライド タイトルなどのコンテンツ グループを表示します。

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from pathlib import Path
from asposeslides.api import LoadFormat, PresentationFactory

file_path = "sample.pptx"
presentation_info = PresentationFactory.getInstance().getPresentationInfo(file_path)
document_properties = presentation_info.readDocumentProperties()

load_format = presentation_info.getLoadFormat()
format_name = f"Other ({load_format})"

if load_format == LoadFormat.Pptx:
    format_name = "PPTX"
elif load_format == LoadFormat.Ppt:
    format_name = "PPT"
elif load_format == LoadFormat.Odp:
    format_name = "ODP"

print(f"File: {Path(file_path).name}")
print(f"Format: {format_name}")
print(f"Title: {document_properties.getTitle()}")
print(f"Author: {document_properties.getAuthor()}")
print("Statistics:")
print(f"  Slides: {document_properties.getSlides()}")
print(f"  Hidden slides: {document_properties.getHiddenSlides()}")
print(f"  Slides with notes: {document_properties.getNotes()}")
print(f"  Paragraphs: {document_properties.getParagraphs()}")
print(f"  Words: {document_properties.getWords()}")
print(f"  Multimedia clips: {document_properties.getMultimediaClips()}")

heading_pairs = document_properties.getHeadingPairs()
titles_of_parts = document_properties.getTitlesOfParts()
heading_pairs = heading_pairs if heading_pairs is not None else []
titles_of_parts = titles_of_parts if titles_of_parts is not None else []
part_index = 0

if len(heading_pairs) == 0 or len(titles_of_parts) == 0:
    print("Content groups: not available")
else:
    print("Content groups:")

    for heading_pair in heading_pairs:
        print(f"  {heading_pair.getName()} ({heading_pair.getCount()})")

        for part_offset in range(heading_pair.getCount()):
            if part_index >= len(titles_of_parts):
                break
            print(f"    - {titles_of_parts[part_index]}")
            part_index += 1

    if part_index < len(titles_of_parts):
        print("  Other parts:")

        while part_index < len(titles_of_parts):
            print(f"    - {titles_of_parts[part_index]}")
            part_index += 1

HeadingPair はグループ名とそのグループ内の項目数を提供します。DocumentProperties.getTitlesOfParts はフラットで順序付けられた配列を返すため、各ヘディング ペアで指定された連続したタイトル数だけを消費します。

保存されたメタデータと形式の制限

PresentationInfo.readDocumentProperties が返すインベントリ プロパティは、ソース ドキュメントに存在するメタデータを反映します。Aspose.Slides はこの呼び出しのためにプレゼンテーション オブジェクト モデルをロードして走査し、これらの値を再計算しません。欠落しているプロパティはデフォルト値で表され、最後にファイルを保存したアプリケーションがドキュメント プロパティを更新していない場合、格納された値は古くなる可能性があります。

  • PPTX: スライド、ノート、非表示スライド、段落、単語、マルチメディアのカウント、およびヘディング ペアとパート タイトルの拡張ドキュメント プロパティが提供されます。利用可能性は、ドキュメント作成者が書き込んだプロパティに依存します。
  • PPT: バイナリ形式は対応するドキュメント要約プロパティを格納できます。プロパティが存在しない、または作成者によって更新されていない場合、Aspose.Slides はスライドから計算せずに格納された値またはデフォルト値を返します。
  • ODP: OpenDocument メタデータはページ、段落、単語数などの一般的な統計情報を提供しますが、これらの値はすべての PowerPoint 固有の拡張プロパティに対応しているわけではありません。非表示スライド、ノートスライド、マルチメディア、ヘディング ペア、パート タイトルのメタデータが利用できないことがあり、インベントリ プロパティはデフォルト値を返す可能性があります。ゼロ値や空配列を、対応するコンテンツが存在しないことの権威ある証拠として扱わないでください。

軽量メタデータ アプローチはインベントリ作成や事前チェックに使用し、結果がメモリ内の変更を反映する必要がある場合や実際のプレゼンテーション コンテンツを検証する必要がある場合は、プレゼンテーションをロードしてライブ オブジェクト モデルを検査してください。

プレゼンテーションプロパティの更新

PresentationInfo.readDocumentProperties が返すプロパティは、Presentation インスタンスを作成せずに変更することもできます。変更は PresentationInfo.updateDocumentProperties で適用し、PresentationInfo.writeBindedPresentation でバインドされたプレゼンテーションを書き出します。

以下の画像は元のドキュメント プロパティを示しています。

PowerPoint プレゼンテーションの元のドキュメント プロパティ

以下の例はタイトルと最終保存時刻を変更し、結果を新しいファイルに書き出します。

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import PresentationFactory
from java.io import FileOutputStream
from java.util import Date

source_file = "sample.pptx"
output_file = "sample_with_updated_properties.pptx"
presentation_info = PresentationFactory.getInstance().getPresentationInfo(source_file)
document_properties = presentation_info.readDocumentProperties()

document_properties.setTitle("Quarterly sales report")
last_saved_time = Date()
document_properties.setLastSavedTime(last_saved_time)

presentation_info.updateDocumentProperties(document_properties)
output_stream = FileOutputStream(output_file)
try:
    presentation_info.writeBindedPresentation(output_stream)
finally:
    output_stream.close()

以下の画像は更新されたドキュメント プロパティを示しています。

PowerPoint プレゼンテーションの変更後のドキュメント プロパティ

便利なリンク

関連するセキュリティ チェックや保護設定については、以下の記事をご参照ください。

よくある質問

フォントが埋め込まれているか、どのフォントが埋め込まれているかを確認する方法は?

プレゼンテーションをロードし、Presentation.getFontsManager を使用します。FontsManager.getEmbeddedFonts で埋め込みフォントを取得し、FontsManager.getFonts でプレゼンテーションで使用されているフォントを取得します。両方の結果を比較して、描画に必要だが埋め込まれていないフォントを特定します。

ファイルに非表示スライドがあるかどうか、またその数をすばやく確認する方法は?

保存されたドキュメント メタデータが十分であれば、PresentationFactory.getPresentationInfoPresentationInfo.readDocumentProperties を通じて DocumentProperties.getHiddenSlides を読み取ります。これは軽量インベントリに適しています。プレゼンテーションがメモリ上で変更されている場合、保存されたメタデータが欠落または古くなる可能性があるため、Presentation.getSlides を走査し、各スライドの Slide.getHidden メソッドで確認してください。

カスタム スライド サイズと向きが使用されているか、デフォルトと異なるかを検出できますか?

はい。プレゼンテーションをロードし、Presentation.getSlideSize を呼び出します。SlideSize.getTypeSlideSize.getSizeSlideSize.getOrientation を使用して現在の設定を期待されるプリセットや寸法と比較します。

チャートが外部データ ソースを参照しているかどうかをすばやく確認する方法は?

はい。各 Chart を見つけ、ChartData.getDataSourceType を呼び出します。外部ブックの場合は、ChartData.getExternalWorkbookPath を呼び出します。データ ソースのタイプとパスが外部参照を示しますが、対象が利用可能かどうかは別途リソース確認が必要です。

レンダリングや PDF エクスポートを遅くする可能性のある「重い」スライドを評価する方法は?

単一の複雑度プロパティは存在しません。Presentation.getSlides と各スライドの BaseSlide.getShapes コレクションを走査します。シェイプ数や大きな画像、エフェクト、アニメーション、マルチメディアの有無をスクリーニング シグナルとして使用し、代表的なレンダリングまたはエクスポートを計測してスライドを実際のパフォーマンス ボトルネックとして確定してください。