見出し画像

VSTOアドイン PowerPointのテキスト抽出

以前、VBA PowerPointのテキスト抽出で、PowerPoint文書にVBAプログラムを組み込んで、スライド上で選択したテキストボックスなどから、テキストを抽出してクリップボードにコピーするツールを作成しました。

VBAプログラムは、自分で簡単にカスタマイズができ、動作確認もすぐに行えるので便利なのですが、PowerPoint文書にいちいちプログラムを組み込む手間があり面倒です。

アドインとしてPowerPointアプリケーションに組み込んでやれば、それぞれの文書ファイルにプログラムを組み込む手間もなくなり便利です。
今回は、Officeアドインが比較的簡単に作成できるVisual Studio Community 2019を使用して作成しました。

アドインの使用イメージ

PowerPointのスライド上でテキストボックスなどを選択して、「アドイン」タブの「テキスト抽出」ボタンを押すと、テキストボックス内のテキストが、クリップボードへコピーされます。

使用イメージ

クリップボードの内容をテキストエディタに貼り付けたイメージです。

テキスト

プログラムの説明

プログラムの主な処理内容を説明します。

ーーテキスト抽出ボタンのイベントハンドラ

Shapeのテキストを保管するShapeTextのインスタンスを生成して、GetTextメソッドを使用して、選択中のテキストボックスなどからテキストを抽出します。
抽出したテキストがあれば、クリップボードへテキストを設定します。

private void buttonTextExtraction_Click(object sender, RibbonControlEventArgs e)
{
    ShapeText shapeText = new ShapeText();
    string text = "";

    try
    {
        text = shapeText.GetText(Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange);
    }
    catch { }   // Shape選択が無い場合は除外

    if (text == "")
    {
        MessageBox.Show("抽出したテキストがありません", "テキスト", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    else
    {
        Clipboard.SetText(text);
    }
}

ーー位置情報付きテキスト

Shapeのテキストとともに、上端と左端の位置情報を保管するクラスTextPositionを定義します。

// 位置情報付きテキスト
class TextPosition
{
    private float top;      // Shapeの上端位置
    private float left;     // Shapeの左端位置
    private string text;    // Shapeのテキスト
    public TextPosition(float top, float left, string text)
    {
        this.top = top;
        this.left = left;
        this.text = text;
    }
    public float Top
    {
        get { return top; }
    }
    public float Left
    {
        get { return left; }
    }
    public string Text
    {
        get { return text; }
    }
}

ーーShapeからテキストを抽出して保管する

Shapeからテキストを抽出して保管するクラスShapeTextです。
TextPositionのリストをインスタンス化します。

// PowerPointのShapeからテキストを抽出して保管する
class ShapeText
{
    private List<TextPosition> textPosition;

    public ShapeText()
    {
        textPosition = new List<TextPosition>();
    }
    :
}

ーーShapeからテキストを抽出して返す

選択されたShape内容をTextPositionリストへ保管して、Shapeの位置情報でソーティングを行った後、リストからテキストを取り出して返します。

// Shapeからテキストを抽出して返す
public string GetText(PowerPoint.ShapeRange shapeRange)
{
    textPosition.Clear();

    foreach (PowerPoint.Shape shape in shapeRange)
    {
        ShapeBranch(shape);
    }

    textPosition.Sort(ComparePosition);

    string text = "";
    foreach (TextPosition tp in textPosition)
    {
        text += tp.Text;
    }
    return text;
}

ーーShapeタイプ別分岐処理

グルーピングされたShape群か、SmartArtならGroupItemsを分解して本メソッドを再帰呼び出しします。
表テーブルなら専用のTableToTextPositionメソッドを呼び出します。
上記以外なら、ShapeToTextPositionメソッドを呼び出します。

// Shapeタイプ別分岐処理
private void ShapeBranch(PowerPoint.Shape shape)
{
    if (shape.Type == MsoShapeType.msoGroup ||
        shape.Type == MsoShapeType.msoSmartArt)
    {
        foreach (PowerPoint.Shape item in shape.GroupItems)
        {
            ShapeBranch(item);
        }
    }
    else if (shape.HasTable == MsoTriState.msoTrue)
    {
        TableToTextPosition(shape);
    }
    else
    {
        ShapeToTextPosition(shape);
    }
}

ーー表テーブルを位置情報付きテキストリストへ追加

表テーブルのセルのテキストをタブ文字でつなぎ、TextPositionリストへ追加します。

// 表テーブルを位置情報付きテキストのリストへ追加する
private void TableToTextPosition(PowerPoint.Shape shape)
{
    string text = "";
    foreach (PowerPoint.Row row in shape.Table.Rows)
    {
        foreach (PowerPoint.Cell cell in row.Cells)
        {
            text += cell.Shape.TextFrame2.TextRange.Text + "\t";
        }
        text = text.Substring(0, text.Length - "\t".Length);
        text += Environment.NewLine;
    }

    textPosition.Add(new TextPosition(shape.Top, shape.Left, text));
}

ーーShape内容を位置情報付きテキストリストへ追加

Shape内容を位置情報付きテキストのリストへ追加します。テキストを持たない、例えば直線オブジェクトなどは例外が発生するので処理対象とせず、無視します。

// Shape内容を位置情報付きテキストのリストへ追加する
private void ShapeToTextPosition(PowerPoint.Shape shape)
{
    try
    {
        string text = shape.TextFrame2.TextRange.Text;
        text += Environment.NewLine;

        textPosition.Add(new TextPosition(shape.Top, shape.Left, text));
    }
    catch { }    // TextFrame2.TextRange.TextがないShapeは無視
}

ーーShapeの位置情報で昇順ソートする比較メソッド

リストのソートの比較メソッドです。
Shapeの上端位置で昇順ソートして、スライド上の上から下にリストを並び替えます。
Shapeの上端位置が同じ場合は、左端位置で昇順ソートして、スライド上の左から右にリストを並び替えます。

// Shapeの位置情報で昇順ソートするための比較メソッド
private static int ComparePosition(TextPosition a, TextPosition b)
{
    // Shapeの上端位置で比較
    if (a.Top > b.Top)
    {
        return 1;
    }
    else if (a.Top < b.Top)
    {
        return -1;
    }
    else
    {
        // Shapeの上端位置が同じ場合は、左端位置で比較
        if (a.Left > b.Left)
            return 1;
        else if (a.Left < b.Left)
            return -1;
        else
            return 0;
    }
}

アドインのセットアップ手順

以下に添付の圧縮ファイル「公開.zip」をダウンロードして、デスクトップなど適当なフォルダに保存して解凍します。

図1

「公開」フォルダ内にある「setup.exe」をダブルクリックして起動して、インストールします。

画像5

PowerPointアプリケーションの「アドイン」タブに「テキスト抽出」ボタンが実装されました。

ボタン2

セットアップファイル

セットアップファイルsetup.exeを同梱した圧縮ファイルを以下に添付します。ご利用にあたっては自己責任でお願いします。

ここから先は

149字 / 1ファイル

¥ 100

記事を気に入って頂き、お役に立てたら嬉しいです。