Python を介した Java でプレゼンテーションのインク オブジェクトを管理

はじめに

PowerPoint にはフリーハンドのストロークを描くことができるインク機能が提供されています。インクは他のオブジェクトをハイライトしたり、接続やプロセスを示したり、スライド上の特定の項目に注意を引くために使用できます。

Aspose.Slides はインク オブジェクトを操作するために必要な型を提供します。たとえば、Ink クラスはスライド上のインク オブジェクトを表します。

通常のオブジェクトとインク オブジェクトの違い

PowerPoint スライド上のオブジェクトは通常、シェイプ オブジェクトで表されます。最も単純な形態では、シェイプはオブジェクト自体(フレーム)の領域と、コンテナのサイズ、形状、背景などのプロパティを定義するコンテナです。詳細は Shape Layout Format を参照してください。

ただし、PowerPoint がインク オブジェクトを扱う場合、フレーム(コンテナ)のすべてのプロパティはサイズ以外無視されます。コンテナ領域のサイズは標準の Shape.getWidth および Shape.getHeight メソッドで決まります。

ink_powerpoint1

インク トレース

インク トレースは、ユーザーがデジタル インクで書く際のペンの軌跡を記録する基本要素です。トレースは連続した点のシーケンスを保持します。

最も単純なエンコーディングは、各サンプル点の X と Y 座標を指定します。すべての連続点が描画されると、次のような画像が生成されます。

ink_powerpoint2

描画用ブラシ プロパティ

ブラシはインク トレースの点を結ぶ線を描くために使用されます。ブラシには独自の色とサイズがあり、InkBrush.getColorInkBrush.getSize メソッドで取得できます。

インク ブラシの色を設定する

この Python コードはインク ブラシの色を設定する方法を示しています。

import jpype
import asposeslides

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

from asposeslides.api import Presentation, Ink

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("pres.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    ink = slide.getShapes().get_Item(0)
    if isinstance(ink, Ink):
        traces = ink.getTraces()
        if len(traces) > 0:
            brush = traces[0].getBrush()
            brush.setColor(Color.RED)
        else:
            print("The ink object has no traces.")
    else:
        print("The first shape is not an ink object.")
finally:
    presentation.dispose()

インク ブラシのサイズを設定する

この Python コードはインク ブラシのサイズを設定する方法を示しています。

import jpype
import asposeslides

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

from asposeslides.api import Presentation, Ink

Dimension = jpype.JClass("java.awt.Dimension")

presentation = Presentation("pres.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    ink = slide.getShapes().get_Item(0)
    if isinstance(ink, Ink):
        traces = ink.getTraces()
        if len(traces) > 0:
            brush = traces[0].getBrush()
            brush_size = Dimension(5, 10)
            brush.setSize(brush_size)
        else:
            print("The ink object has no traces.")
    else:
        print("The first shape is not an ink object.")
finally:
    presentation.dispose()

通常、ブラシの幅と高さは一致せず、PowerPoint はブラシサイズを表示しません(該当データ セクションはグレー表示)。幅と高さが一致した場合、PowerPoint は次のようにサイズを表示します。

ink_powerpoint3

分かりやすくするために、インク オブジェクトの高さを増やして重要な寸法を確認します。

ink_powerpoint4

コンテナ(フレーム)はブラシのサイズを考慮せず、常に線の太さは 0 とみなします(前の画像参照)。

したがって、インク オブジェクト全体の可視領域を決定するには、トレースのブラシ サイズを考慮する必要があります。ここでは、対象オブジェクト(手書きテキスト トレース)がコンテナ(フレーム)のサイズに合わせて拡大されています。コンテナのサイズが変わってもブラシ サイズは一定であり、逆も同様です。

ink_powerpoint5

PowerPoint はテキスト オブジェクトでも同様の動作を使用します。

ink_powerpoint6

エクスポートおよびレンダリング時のインク 表示制御

Aspose.Slides は、エクスポートまたはレンダリングされた出力でインク オブジェクトの表示方法を制御するための InkOptions クラスを提供します。プロパティを使用してインクを完全に非表示にしたり、インク ブラシのマスク操作の解釈方法を変更したりできます。

インク オプションは、複数の出力タイプのエクスポートまたはレンダリング オプションを通じて利用できます。

出力 インク オプション プロパティ
PDF PdfOptions.getInkOptions
HTML HtmlOptions.getInkOptions
SVG SVGOptions.getInkOptions
TIFF TiffOptions.getInkOptions
スライド画像 RenderingOptions.getInkOptions

次の InkOptions メソッドは同じ 2 つの設定を公開します。

  • getHideInk はインク オブジェクトが出力に含まれるかどうかを決定します。既定値は False です。
  • getInterpretMaskOpAsOpacity は、インク ブラシをレンダリングする際にマスク操作を不透明度として解釈するかどうかを決定します。既定値は True です。False を指定して setInterpretMaskOpAsOpacity を呼び出すと、ROP 操作が使用されます。

PDF 出力でインク オブジェクトを非表示にする

既定では、エクスポート時にインク オブジェクトは表示されたままです。手書き注釈やその他のインク コンテンツを除いたクリーンな出力を作成するには、True を指定して InkOptions.setHideInk を呼び出します。

次の Python 例は、すべてのインク オブジェクトを非表示にした状態でプレゼンテーションを PDF にエクスポートします。

import jpype
import asposeslides

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

from asposeslides.api import Presentation, PdfOptions, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    pdf_options = PdfOptions()
    pdf_options.getInkOptions().setHideInk(True)

    presentation.save("presentation_without_ink.pdf", SaveFormat.Pdf, pdf_options)
finally:
    presentation.dispose()

スライドを画像としてレンダリングする際にインク オブジェクトを非表示にする

ビットマップ画像としてスライドをレンダリングする際にインク オブジェクトを非表示にするには、RenderingOptions.getInkOptions を構成し、レンダリング オプションを Slide.getImage に渡します。

次の Python 例は、インク オブジェクトなしで最初のスライドを PNG 画像としてレンダリングします。

import jpype
import asposeslides

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

from asposeslides.api import Presentation, RenderingOptions, ImageFormat

presentation = Presentation("presentation.pptx")
try:
    rendering_options = RenderingOptions()
    rendering_options.getInkOptions().setHideInk(True)

    slide = presentation.getSlides().get_Item(0)
    image = slide.getImage(rendering_options)
    try:
        image.save("slide_without_ink.png", ImageFormat.Png)
    finally:
        image.dispose()
finally:
    presentation.dispose()

インク マスクのレンダリング制御

InkOptions.getInterpretMaskOpAsOpacity 設定は、インク ブラシをレンダリングする際にマスク操作をどのように解釈するかを制御します。既定値は True(不透明度使用)です。ROP 操作を使用したい場合は、False を指定して InkOptions.setInterpretMaskOpAsOpacity を呼び出してください。

次の Python 例は、スライドを SVG にエクスポートし、インク マスク操作に ROP ベースのレンダリングを使用します。

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SVGOptions

FileOutputStream = jpype.JClass("java.io.FileOutputStream")

presentation = Presentation("presentation.pptx")
try:
    svg_options = SVGOptions()
    svg_options.getInkOptions().setInterpretMaskOpAsOpacity(False)

    stream = FileOutputStream("slide.svg")
    try:
        slide = presentation.getSlides().get_Item(0)
        slide.writeAsSvg(stream, svg_options)
    finally:
        stream.close()
finally:
    presentation.dispose()

同じ設定は、プレゼンテーションをエクスポートするかスライドを TIFF にレンダリングする際に、TiffOptions.getInkOptions を通じて適用できます。

インクを非表示にするか保持するかの選択

レビュー マークなしで配布用のクリーンな注釈付きプレゼンテーションが必要な場合は、エクスポート時に True を指定して InkOptions.setHideInk を呼び出します。

インク 注釈が意図したコンテンツ(レビュー コメント、手書きメモ、ハイライト、描画など)として残る必要がある場合は、InkOptions.getHideInk を既定値の False のままにしてください。これにより、同じプレゼンテーションからソース インク オブジェクトを変更せずに、レビュー用と最終版の出力を別々に生成できます。

FAQ

既存のインク ストロークの色やサイズを変更できますか?

はい。まず Ink.getTraces でトレースを取得し、InkTrace.getBrush を取得します。その後、InkBrush.setColor または InkBrush.setSize を呼び出してブラシを変更できます。

インクを非表示にすると元のプレゼンテーションが変更されますか?

いいえ。InkOptions.setHideInk を呼び出すと、レンダリングまたはエクスポート結果にのみ影響し、元のプレゼンテーション内のインク オブジェクトは削除も変更もされません。

どのエクスポート形式がインク オプションに対応していますか?

PDF、HTML、SVG、TIFF、ビットマップ スライド画像の各エクスポートまたはレンダリング オプションでインク オプションを構成できます(上表参照)。

さらに読む