InDesignスクリプト/プラグイン開発

InDesignスクリプト/プラグイン開発のご相談がが増えています。

弊社ではC++, JavaScriptを利用した開発実績が多数ございますので
ご協力できることがありましたらご連絡いただければと思います。
例えば、下記のような実績がございます。

  • 差分抽出用のツール開発
  • 改訂管理ツールの開発
  • 部品管理ツールの開発
  • 一括置換処理ツールの開発
  • MIFデータ(FrameMaker)のInDesignデータへのコンバート
  • HTML出力ツール
  • CKEditorから出力されるデータの自動組版
  • DITAデータのInDesignデータへの自動変換
  • 指定文字列マーキング
  • 自動画像変換ツール

OfficeLSTools – Officeアドイン開発 [コード実行]

元々サンプルパッケージに入っていたデータはシート上に「ExecuteFunction works. Button ID=XX」として
テキストフレームが追加されるコードでした。

仕組みとしてはマニュフェストXMLファイルで、対応するボタン設定部に

<Action xsi:type=”ExecuteFunction”>
<FunctionName>writeText</FunctionName>
</Action>

として指定します。xsi:typeはExecuteFunctionかShowTaskpaneを指定するようです。
ExecuteFunctionを指定することによりJavaScriptコードを実行できます。
ここではwriteTextという関数を実行することになっていました。

実行するコード類はFunctionFile要素で指定した場所に配置するようです。
サンプルではFunctionFile.htmlファイルが指定されています。
このFunctionFile.htmlは以下のようになっていました。

<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″ />
<meta http-equiv=”X-UA-Compatible” content=”IE=Edge” />
<title></title>
<script src=”https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js” type=”text/javascript”></script>
<script src=”https://appsforoffice.microsoft.com/lib/1/hosted/office.js” type=”text/javascript”></script>
<script src=”FunctionFile.js” type=”text/javascript”></script>

</head>
<body>
<!– 注: 本文は意図的に空白にしてあります。これはボタンから呼び出されたものなので、レンダリングする UI がありません。 –>
</body>
</html>

そして、FunctionFile.jsの中で、writeText関数が定義されていました。

function writeText(event) {

// Implement your custom code here. The following code is a simple example.
Office.context.document.setSelectedDataAsync(“ExecuteFunction works. Button ID=” + event.source.id,
function (asyncResult) {
var error = asyncResult.error;
if (asyncResult.status === “failed”) {
// Show error message.
}
else {
// Show success message.
}
});
// Calling event.completed is required. event.completed lets the platform know that processing has completed.
event.completed();
}

こんな感じですね。これでシート上にテキストフレームを追加してフレーム内にテキストを配置します。

OfficeLSToolsでは、カラーパレットを表示させたり、挿入するシートやオブジェクトを選ぶなどの操作が必要なため
ダイアログを表示させる必要があります。それで、ダイアログを表示する方法について調べてみました。
対応するボタンのアクションに適用な関数名を設定します。
あとはスクリプトファイル内で必要な関数を定義すれば良いだけです。
ダイアログの表示にはOffice.context.ui.displayDialogAsyncを利用します。
ダイアログレイアウトはHTMLファイルを生成し表示させる方法にしました。
このようなHTMLをダイアログとして表示させます。タイトル、段落テキスト、ボタン、画像の表示などをしています。

<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″ />
<meta http-equiv=”X-UA-Compatible” content=”IE=Edge” />
<meta name=”robots” content=”noindex,nofollow”>
<title>Dialog API Dialog</title>
<script src=”https://code.jquery.com/jquery-2.2.4.min.js”></script>
<script src=”https://appsforoffice.microsoft.com/lib/1/hosted/office.js”></script>
<script>
Office.initialize = function(reason){}
$(function(){
$(“.btnDialog”).click(function(){
//親となるアドインにメッセージ送信
Office.context.ui.messageParent($(this).val());
});
});
</script>
</head>
<body>
<h4>Sample Dialog</h4>
<p>This is TEST page.</p>
<p>
<button class=”btnDialog” value=”Hello.”>button 1</button>
<button class=”btnDialog” value=”Good Bye.”>button 2</button>
</p>
<p><img src=”./Images/logo.png” /></p>
</body>
</html>

ボタンクリックでこんなダイアログを表示できました。
同じようにしてPowerPointの作業領域にもHTMLでレイアウトしてUIを定義することができるようです。

OfficeLSTools – Officeアドイン開発 [グループの追加]

メニューにグループを追加してみましょう。

Officeアドインでは、CustomTab要素の子要素としてgroup要素を10個まで定義することができるようです。
ちなみに、各group要素の子要素としてcontrol要素は6個までと定義されているとのこと。
※ 1つのアドインにCustomTabは1つしか定義できません。

groupタグを複数記述することで、グループを追加することができグループラベルを設定しメニュー構成を区切ることができます。

<CustomTab id=”TabHome”>
<Group id=”Contoso.Group1″>

</Group>
<Group id=”Contoso.Group2″>

</Group>
<Label resid=”Contoso.Group.Label” />
</CustomTab>

こんな感じで定義することになります。

同じようにして他のメニューも追加していけばタブメニューは仕上げることができますね。
次回は、ボタンをクリックされた場合に実行されるスクリプトについて考えてみます。

OfficeLSTools – Officeアドイン開発 [専用メニューの定義]

専用タブの定義、専用ボタンの設定ができました。
OfficeLSToolsでは、ページスライドボタンをクリックすると登録されたスライドのサムネイル画像が表示されるのですがOfficeアドインでは、MENUプルダウンに画像を表示させることができないようです。

それでOfficeアドインでは、プルダウンにコマンドボタンを表示させるだけにして、サムネイルによる挿入スライドイメージを表示させないようにするか、ページスライドのボタンクリックで作業ウィンドウを表示し、作業ウィンドウ内に登録されているスライドのサムネイルを表示させる方法のどちらかになります。作業ウィンドウの利用は他の機能でも実装することになると思われますので、MENUプルダウンはプルダウンにアイコンと文字列で挿入スライド名をラベル表示する方法にしたいと思います。

Control要素のxsi:type属性にMenuと指定します。そしてControl要素の子要素にプルダウン全体をまとめるItems要素と個々のコマンドを示す。Item要素を定義します。以下のようなソースコードとなります。

<Control xsi:type=”Menu” id=”Contoso.TaskpaneMenu1″>
 <Label resid=”Contoso.TaskpaneButton3.Label” />
 <Supertip>
  <Title resid=”Contoso.TaskpaneButton3.Label” />
  <Description resid=”Contoso.TaskpaneButton.Tooltip” />
 </Supertip>
 <Icon>
  <bt:Image size=”16″ resid=”Contoso.normal_16x16″ />
  <bt:Image size=”32″ resid=”Contoso.normal_32x32″ />
  <bt:Image size=”80″ resid=”Contoso.normal_80x80″ />
 </Icon>
 <Items>
  <Item id=”Contoso.TaskpaneMenu1Item1″>
   <Label resid=”Contoso.TaskpaneMenu1Item1.Label” />
   <Supertip>
    <Title resid=”Contoso.TaskpaneMenu1Item1.Label” />
    <Description resid=”Contoso.TaskpaneButton.Tooltip” />
   </Supertip>
   <Icon>
    <bt:Image size=”16″ resid=”Contoso.tpicon_16x16″ />
    <bt:Image size=”32″ resid=”Contoso.tpicon_32x32″ />
    <bt:Image size=”80″ resid=”Contoso.tpicon_80x80″ />
   </Icon>
   <Action xsi:type=”ExecuteFunction”>
    <FunctionName>writeText</FunctionName>
   </Action>
  </Item>
  <Item id=”Contoso.TaskpaneMenu1Item2″>
   <Label resid=”Contoso.TaskpaneMenu1Item2.Label” />
   <Supertip>
    <Title resid=”Contoso.TaskpaneMenu1Item2.Label” />
    <Description resid=”Contoso.TaskpaneButton.Tooltip” />
   </Supertip>
   <Icon>
    <bt:Image size=”16″ resid=”Contoso.tpicon_80x80″ />
    <bt:Image size=”32″ resid=”Contoso.tpicon_80x80″ />
    <bt:Image size=”80″ resid=”Contoso.tpicon_80x80″ />
   </Icon>
   <Action xsi:type=”ExecuteFunction”>
    <FunctionName>writeText</FunctionName>
   </Action>
  </Item>
 </Items>
</Control>

これで、こんなイメージのメニューを定義できました。

OfficeLSTools – Officeアドイン開発 [専用ボタンの定義]

前回は専用タブの定義を行いましたので、今回は専用ボタンの定義を行いたいと思います。

ボタンの追加ですね。
OfficeLSToolsにあるスライド挿入の表紙スライド、章スライド、ページスライドのボタンを配置してみたいと思います。
ページスライドのボタンはプルダウンなので、プルダウン表示については追って確認してみたいと思います。

タブが設定できましたので、まずタブ内にグループを設定します。
今回はOfficeLSToolsでいうところの「スライドを挿入」のグループを設定します。

CustomTab要素の下にGroup要素を指定しLabel要素を定義すれば良いようです。

<CustomTab id=”OfficeLSTools”>
 <Group id=”Contoso.Group1″>
  <Label resid=”Contoso.Group1Label” />

設定する文字列はResources要素側で対応するresidとして用意しておけばOKです。

<bt:String id=”Contoso.Group1Label” DefaultValue=”スライドを挿入” />

これでグループが設定できました。次にグループ内にボタンを配置します。
ボタンのアイコンにはPNG画像を利用できるようです。
16、32、80のサイズを用意しておくことが必須となっているようです。
ボタン表示には
上記で作成したGroup要素の子要素としてLabel要素の次にControl要素を定義します。

<Control xsi:type=”Button” id=”Contoso.TaskpaneButton1″>
 <Label resid=”Contoso.TaskpaneButton1.Label” />
 <Supertip>
  <Title resid=”Contoso.TaskpaneButton1.Label” />
  <Description resid=”Contoso.TaskpaneButton.Tooltip” />
 </Supertip>
 <Icon>
<bt:Image size=”16″ resid=”Contoso.cover16″ />
<bt:Image size=”32″ resid=”Contoso.cover32″ />
<bt:Image size=”80″ resid=”Contoso.cover80″ />
 </Icon>
 <Action xsi:type=”ExecuteFunction”>
  <FunctionName>ButtonId1</FunctionName>
 </Action>
</Control>

こんな感じですね。他にもボタンを同じようにControl要素を追記して定義します。
また画像を所定の場所に配置しておく必要もありますね。

Control要素のxsi:type属性にはButtonとMenuが設定できるようです。
Supertip要素はヒント情報
Action要素はクリックされたときに実行される内容になるようです。

こんな感じでボタンが配置できました。

OfficeLSTools – Officeアドイン開発 [専用タブの定義]

弊社で開発したOfficeLSToolsはVSTOを利用したアドインのため、MacやWEB版でも利用可能なOfficeアドインを開発していきたいと考えています。
Officeアドインプラットフォーム(https://docs.microsoft.com/ja-jp/office/dev/add-ins/overview/office-add-ins)を利用して少しずつブログにて情報を展開してみたいと思います。

まずは環境構築です。
https://docs.microsoft.com/ja-jp/office/dev/add-ins/tutorials/powerpoint-tutorial
こちらのページにあるようにVisualStdioを利用してプロジェクトを追加→ビルドまで進めます。

サンプルデータではアドインの表示がホームタブに表示されるようになっているので
HelloWorldプロジェクトのHelloWorld.xmlのOfficeTabをCustomTabに変更しIDを採番し
CustomTabの子要素であるGroup要素の後ろにLabel要素を設定すれば任意のタブ名を
設定できるようです。

<label resid=”Contoso.TabLabel”></label>

こんな感じでLabel要素を定義し
Resources要素内で

<bt:string id=”Contoso.TabLabel” DefaultValue=”OfficeLSTools”></bt:string>

などと定義しておけば任意のタブ名に変更できるようです。
ここではOfficeLSToolsをタブ名にしています。

Officeアドインタブ

これから少しずつ対応していきたいと思います。
どこまで移植できるか…。

OfficeLSTools(PowerPoint/Excelアドイン開発 VSTO)

PowerPoint/Excelのアドイン開発、サービス展開を検討中です。

用意されたテンプレートや設定ファイルがあれば、誰でも一定品質のドキュメントを仕上げることができます。
詳しくはOfficeLSTools紹介ページをご覧ください。紹介ドキュメントや動画などで動作イメージができます。

PowerPointアドインではあらかじめ定義されたページを読み込ませて、部分的なテキストを差し替えるだけで目的の資料を作成できます。また読み込ませたオブジェクトをあらかじめ定義しておきボタン1つで読み込ませることができます。その他企業カラーに合わせた編集がしやすいように支援機能が用意されています。

Excelアドインでも企業カラーに合わせた表レイアウト、グラフレイアウトを実現できます。
他にも便利な機能がありますので一度お試しいただければと思います。

officeLSTools_logo

よろしくお願いいたします。

MA-CREATE 佐藤

SVG編集 D3.js

SVGデータを利用した回路図、艤装図、コネクタを
WEBブラウザ上で情報確認したり、操作確認できると非常に便利です。

SVG加工調整用に公開されているライブラリは多数あります。
弊社ではD3.jsを利用しています。
WEBに情報も多数転がっているので実装しやすいです。

WEB上での図形の描画やグラフ描画にも非常に有効ですね。

自然言語処理 janome, word2vec

コンテンツ管理システムにおいて、各種データにメタ情報を設定するのは非常に手のかかることです。
大量のデータを非構造から、構造化データに変換したことによって、大きなメリットがありますが
構造化された各トピックデータに対して適切なメタ情報を設定することはなかなか大変なものです。

janome, mecabといった形態素解析モジュールを利用して文章を解析し、各データにどのような
メタデータを設定するかの候補を自動的に設定する(候補としてあげる)ことができます。

また形態素解析の結果データを管理しておけば、word2vecといったモジュールを利用して
このいわば辞書データを利用し文章や単語の類似語や文章を要約するよな情報を抽出することができます。
単語や文章の類似度なども評価することができます。

蓄積されている大量のデータを利用し、的確な情報管理のために有用なツールとなります。

ご興味のある方はお気軽にご連絡下さい。

Confluenceプラグイン開発

コンテンツコラボレーションツールとして有名なConfluenceのプラグイン開発を経験しました。
非常に拡張性のあるツールなので、スモールスタートから必要に応じたカスタマイズをすることが
可能ですね。
大企業からベンチャー企業に導入されているという意味での安心感と安定感があります。
今後も機会があれば開発をすすめていきたい。

株式会社MA-CREATE 佐藤