Javaでスライドレイアウトを適用または変更する

概要

スライドレイアウトは、タイトル、テキスト、画像、チャート、テーブルなどのプレースホルダーの位置と書式設定を定義します。レイアウトを適用することで、スライドに一貫した構造が与えられ、各スライドは独自のコンテンツを保持できます。

最も一般的なレイアウトは次のとおりです。

  • タイトルスライド: タイトルとサブタイトルのプレースホルダーが含まれます。
  • タイトルとコンテンツ: タイトルプレースホルダーと汎用コンテンツプレースホルダーが含まれます。
  • 空白: コンテンツプレースホルダーがなく、すべての形状を手動で配置する場合に便利です。

レイアウト継承の理解

プレゼンテーションには 3 つの関連レベルがあります。

  1. マスタースライド はテーマ、共有書式設定、背景、および共通オブジェクトを定義します。
  2. レイアウトスライド はマスターに属し、プレースホルダーの特定の配置を定義します。
  3. 通常スライド は 1 つのレイアウトを使用し、そのスライドに入力されたコンテンツを保存します。

通常スライドはレイアウトからテーマと書式設定を継承し、レイアウトはマスターから継承します。通常スライド上で直接設定された値は、そのレベルで継承された値を上書きします。通常スライドが作成されると、そのプレースホルダーシェイプは選択されたレイアウトから生成されますが、プレースホルダーに入力されたコンテンツは通常スライドに属します。

スライドを作成する前にレイアウトに必要なプレースホルダーを追加してください。後からレイアウトに別のプレースホルダーを追加しても、既存の通常スライドに自動的に対応するプレースホルダーシェイプは追加されません。

この関係には 2 つの重要な結果があります。

  • レイアウト上で継承された書式設定や既存プレースホルダーのジオメトリを変更すると、それに依存するすべてのスライドが更新されます。使用中のレイアウトを編集する前に、依存スライドを確認し、結果のプレゼンテーションをレビューしてください。
  • スライドで使用中のレイアウトは削除できません。先に依存スライドを別のレイアウトに再割り当てするか、未使用のレイアウトのみを削除してください。

この階層の最上位レベルの詳細については、Slide Master を参照してください。

スライドごと、または共有レイアウトを通じて継承されたロゴや装飾的なマスターシェイプを非表示にする方法については、Control the Visibility of Master Graphics を参照してください。この例では、同じマスターを使用する 2 つのスライドを比較しています。

スライド レイアウトの選択と適用

プレゼンテーションが標準の PowerPoint レイアウト定義に従う場合は、レイアウトタイプを使用します。レイアウト名はユーザーが編集可能でローカライズできるため、テンプレートのソースを管理していない限り、名前ベースの選択は信頼性が低くなります。

次の例は、最初のマスター上で Title and Content を検索します。そのレイアウトが利用できない場合は、意図的に Blank にフォールバックします。2 回目の null チェックは、プレゼンテーションにカスタムレイアウトのみが含まれる可能性があるために必要です。選択されたレイアウトは、ISlide.setLayoutSlide メソッドを介して最初の通常スライドに適用されます。

import com.aspose.slides.*;

Presentation presentation = new Presentation("input.pptx");
try {
    IMasterLayoutSlideCollection layoutSlides = presentation.getMasters().get_Item(0).getLayoutSlides();
    ILayoutSlide targetLayout = layoutSlides.getByType(SlideLayoutType.TitleAndObject);

    if (targetLayout == null) {
        targetLayout = layoutSlides.getByType(SlideLayoutType.Blank);
    }

    if (targetLayout == null) {
        throw new IllegalStateException("The first master does not contain a suitable layout slide.");
    }

    presentation.getSlides().get_Item(0).setLayoutSlide(targetLayout);
    presentation.save("output-with-new-layout.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

スライドのレイアウトを変更しても、スライドに直接追加された通常のシェイプは削除されません。ただし、プレースホルダーの位置、継承された書式設定、および既存プレースホルダーと新しいレイアウト間の対応が変わる可能性があるため、レイアウトを大きく変更する際は出力を確認してください。

レイアウトスライドの追加

選択と作成は別々の操作です。前の例は既存のレイアウトを選択しただけで、作成は行っていません。レイアウトを作成するには、対象マスターのレイアウトコレクションで IMasterLayoutSlideCollection.add メソッドを呼び出します。

次の例は常に Title and Content レイアウト Report Title and Content を新規作成し、そのレイアウトに基づく通常スライドを追加します。レイアウト名はコレクション内で一意である必要があります。

import com.aspose.slides.*;

Presentation presentation = new Presentation("input.pptx");
try {
    IMasterSlide masterSlide = presentation.getMasters().get_Item(0);
    ILayoutSlide reportLayout = masterSlide.getLayoutSlides().add(SlideLayoutType.TitleAndObject, "Report Title and Content");
    presentation.getSlides().addEmptySlide(reportLayout);

    presentation.save("output-with-report-layout.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

テンプレートが本当に別の再利用可能構造を必要とする場合にのみレイアウトを追加してください。適切なレイアウトがすでに存在する場合は、重複作成せずに選択して再利用してください。

レイアウトスライドへのプレースホルダー追加

ILayoutSlide.getPlaceholderManager メソッドは、レイアウトにプレースホルダーシェイプを追加するための ILayoutPlaceholderManager を提供します。

PowerPoint プレースホルダー ILayoutPlaceholderManager メソッド
コンテンツ addContentPlaceholder(float x, float y, float width, float height)
コンテンツ (縦) addVerticalContentPlaceholder(float x, float y, float width, float height)
テキスト addTextPlaceholder(float x, float y, float width, float height)
テキスト (縦) addVerticalTextPlaceholder(float x, float y, float width, float height)
画像 addPicturePlaceholder(float x, float y, float width, float height)
チャート addChartPlaceholder(float x, float y, float width, float height)
テーブル addTablePlaceholder(float x, float y, float width, float height)
SmartArt addSmartArtPlaceholder(float x, float y, float width, float height)
メディア addMediaPlaceholder(float x, float y, float width, float height)
オンライン画像 addOnlineImagePlaceholder(float x, float y, float width, float height)

次の例は Blank レイアウトが存在することを確認し、4 つのプレースホルダーを追加した後、変更されたレイアウトを使用する通常スライドを作成します。順序は意図的です:プレースホルダーは通常スライド作成前に追加されるため、Aspose.Slides はそのスライド上に対応するプレースホルダーシェイプを生成できます。

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ILayoutSlide blankLayout = presentation.getLayoutSlides().getByType(SlideLayoutType.Blank);

    if (blankLayout == null) {
        throw new IllegalStateException("The presentation does not contain a Blank layout slide.");
    }

    ILayoutPlaceholderManager placeholderManager = blankLayout.getPlaceholderManager();
    placeholderManager.addContentPlaceholder(20, 20, 310, 270);
    placeholderManager.addVerticalTextPlaceholder(350, 20, 350, 270);
    placeholderManager.addChartPlaceholder(20, 310, 310, 180);
    placeholderManager.addTablePlaceholder(350, 310, 350, 180);

    presentation.getSlides().addEmptySlide(blankLayout);
    presentation.save("output-with-placeholders.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

レイアウトスライド上のプレースホルダー

未使用レイアウトスライドの削除

Compress.removeUnusedLayoutSlides メソッドを使用して、通常スライドから参照されていないレイアウトを削除できます。このメソッドは使用中のレイアウトはそのまま残します。

import com.aspose.slides.*;

Presentation presentation = new Presentation("input.pptx");
try {
    Compress.removeUnusedLayoutSlides(presentation);
    presentation.save("output-without-unused-layouts.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

特定のレイアウトを削除するには、まずその hasDependingSlides または getDependingSlides メソッドを使用します。削除前に依存スライドを別のレイアウトに再割り当てし、ILayoutSlide.remove を呼び出してください。使用中のレイアウトを削除しようとすると、PptxEditException がスローされます。

レイアウトスライド上のフッター表示の制御

レイアウトには独自のフッター、スライド番号、日付時刻プレースホルダーがあります。これらのプレースホルダーをレイアウト単位で制御するには、ILayoutSlide.getHeaderFooterManager メソッドを使用します。たとえば、コンテンツレイアウトではフッターを表示し、タイトルレイアウトでは非表示にしたい場合に便利です。

次の例はレイアウトを安全に選択し、フッター要素を表示可能にします。

import com.aspose.slides.*;

Presentation presentation = new Presentation("input.pptx");
try {
    ILayoutSlide layoutSlide = presentation.getLayoutSlides().getByType(SlideLayoutType.TitleAndObject);

    if (layoutSlide == null) {
        layoutSlide = presentation.getLayoutSlides().getByType(SlideLayoutType.Blank);
    }

    if (layoutSlide == null) {
        throw new IllegalStateException("The presentation does not contain a suitable layout slide.");
    }

    ILayoutSlideHeaderFooterManager headerFooterManager = layoutSlide.getHeaderFooterManager();
    headerFooterManager.setFooterVisibility(true);
    headerFooterManager.setSlideNumberVisibility(true);
    headerFooterManager.setDateTimeVisibility(true);
    headerFooterManager.setFooterText("Footer text");
    headerFooterManager.setDateTimeText("Date and time text");

    presentation.save("output-with-layout-footers.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

マスターと子レイアウト全体のフッター表示の制御

マスターヒエラルキー全体で一貫したフッター設定を適用するには、IMasterSlide.getHeaderFooterManager メソッドを使用します。IMasterSlideHeaderFooterManager の伝搬メソッドはマスターとその依存レイアウトスライドおよび通常スライドに作用し、単一の通常スライドだけを対象にすることはできません。

import com.aspose.slides.*;

Presentation presentation = new Presentation("input.pptx");
try {
    IMasterSlideHeaderFooterManager headerFooterManager = presentation.getMasters().get_Item(0).getHeaderFooterManager();
    headerFooterManager.setFooterAndChildFootersVisibility(true);
    headerFooterManager.setSlideNumberAndChildSlideNumbersVisibility(true);
    headerFooterManager.setDateTimeAndChildDateTimesVisibility(true);
    headerFooterManager.setFooterAndChildFootersText("Footer text");
    headerFooterManager.setDateTimeAndChildDateTimesText("Date and time text");

    presentation.save("output-with-master-footers.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

FAQ

マスタースライドとレイアウトスライドの違いは何ですか?

マスタースライドはプレゼンテーションのテーマと共有書式設定を定義します。レイアウトスライドはマスターに属し、プレースホルダーの再利用可能な配置を定義します。通常スライドはこれらのレイアウトを使用し、スライド固有のコンテンツを保持します。

レイアウトスライドを別のプレゼンテーションへコピーできますか?

はい。目的のコレクションに対して addClone メソッドでコピーを追加します。プレゼンテーション間でコピーする場合は、フォント、テーマ、画像、その他のリソースがソースレイアウトで使用されているかも確認してください。

使用中のレイアウトを変更するとどうなりますか?

依存スライドはレイアウトの変更を継承します(ローカルで上書きしていない限り)。プレースホルダーのジオメトリや継承されたスタイルは多数のスライドで一度に変わる可能性があります。編集前に getDependingSlides で影響を受けるスライドを特定してください。

使用中のレイアウトを削除しようとするとどうなりますか?

Aspose.Slides は PptxEditException をスローします。まず依存スライドを別のレイアウトに再割り当てするか、removeUnusedLayoutSlides を使用して未参照のレイアウトのみを削除してください。