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

概要

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

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

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

レイアウト継承の理解

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

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

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

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

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

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

この階層の最上位に関する詳細は、スライドマスター を参照してください。

1 つのスライドや共有レイアウトで継承されたロゴや装飾的なマスターシェイプを非表示にするには、マスター グラフィックの表示制御 を参照してください。この例は同じマスターを使用した 2 つのスライドを比較しています。

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

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

次の例は、最初のマスターで タイトルとコンテンツ を探します。そのレイアウトが利用できない場合、意図的に ブランク にフォールバックします。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 メソッドを呼び出します。

次の例は常に 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)
スマートアート 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)

次の例は ブランク レイアウトが存在することを確認し、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

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

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

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

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

使用中のレイアウトを変更した場合、どうなりますか?

依存スライドは、ローカルで影響を受ける書式やオブジェクトを上書きしていない限り、レイアウトの変更を継承します。そのため、プレースホルダーのジオメトリや継承されたスタイルが多数のスライドで同時に変更されることがあります。レイアウトを編集する前に、getDependingSlides を使用して影響を受けるスライドを特定してください。

使用中のレイアウトを削除した場合、どうなりますか?

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