次の方法で共有


Office PDF エクスポートの拡張

概要:OFFICE 2024、Office LTSC 2024、および Microsoft 365 バージョン 2408 以降のアプリケーション用の COM アドインを、PDF 形式にエクスポートするための独自のロジックで作成します。 説明されている手法には、C++ と COM に関する知識が必要です。

適用対象:Office 2024、Office LTSC 2024、Microsoft 365 バージョン 2408 以降の Excel、OneNote、PowerPoint、Publisher、Visio、Word。

Office (2024) Fixed-Format エクスポート機能の概要

この記事では、サードパーティのソフトウェア開発者が、Office 2024、Office LTSC 2024、Microsoft 365 Version 2408 以降のアプリケーションで使用できる固定形式のエクスポート機能に接続して、独自のエクスポーターを追加する方法について説明します。

アプリケーションには、Microsoft XML Paper Specification (XPS) とポータブル ドキュメント形式 (PDF) の組み込みエクスポーターが含まれます。 固定ファイル形式では、アプリケーションに依存しない形式とプラットフォームに依存しないページ分割された形式でドキュメントの内容が公開されます。

ソフトウェア開発者は、 IMsoDocExporter COM インターフェイスを実装する Office アドインを記述することで、独自のエクスポーターを追加できます。 この記事では、IMsoDocExporter と、Wordなどのホスティング Microsoft 365 アプリケーションとの対話について説明します。

固定形式のエクスポートは、Office 2007 リリース以降に使用できます。この記事には、Office 2024、Office LTSC 2024、Microsoft 365 バージョン 2408 リリースの新機能に関する情報が含まれています。

重要

固定形式のエクスポート機能は、前の 「適用対象」セクションに記載されているすべてのアプリケーションで使用できます。 ただし、以下の説明では、Publisher をアプリケーションの例として使用します。ただし、説明が別のアプリケーションに関連する場合を除きます。

Add-Ins の初期化

ユーザーがアドイン機能にアクセスするには、アドインで新しいメニュー項目または新しいツール バー ボタンをアプリケーションに追加する必要があります。 ユーザーがこのメニュー項目またはボタンを選択すると、アドインは Microsoft Office オブジェクト モデルを使用して作業中の文書へのポインターを取得する必要があります。 次に、作業中のドキュメントの ExportAsFixedFormat メソッドを、QueryInterface メソッドの呼び出しを介して IMsoDocExporter インターフェイスをサポートする IUnknown インターフェイス ポインターを使用して呼び出す必要があります。 インターフェイス ポインターのオブジェクト モデル パラメーターは、VT_UNKNOWN型を持つ VARIANT です。

OneNote の場合、アドインは、IMsoDocExporter インターフェイスのアドインの実装のクラス ID である文字列パラメーターを使用して Publish メソッドを呼び出します。 OneNote では、クラス ID を使用して CoCreateInstance を呼び出して、アドインのクラス ファクトリから IUnknown インターフェイス ポインターを取得します。

パブリッシャーは、 IMsoDocExporter インターフェイスへのポインターを持った後、 IMsoDocExporter によって公開されているメソッドを介してアドインを呼び戻します。 これらのコールバックを通じて、Wordはドキュメント コンテンツとドキュメントに関するその他の情報をアドインに提供します。

Microsoft Office アプリケーション用の COM アドインの構築に関する優れた情報源は、 VC++/ATL を使用した Office2K COM アドインのビルドに関する codeproject.com 記事です。

IMsoDocExporter

IMsoDocExporter インターフェイスは、次のメソッドを公開します。

表 1. IMsoDocExporter インターフェイスによって公開されるメソッド

メソッド

説明

HrCreateDoc

固定形式のエクスポート プロセスの開始時に呼び出されます。

HrAddPageFromEmf

エクスポートするコンテンツのレンダリングされたビューを表す拡張メタファイル (EMF) をアドインに渡すために呼び出されます。

HrAddDocumentMetadataString

ドキュメントの文字列形式のメタデータを指定するために呼び出されます。

HrAddDocumentMetadataDate

ドキュメントの日付形式のメタデータを指定するために呼び出されます。

HrSetDefaultLcid

エクスポートするコンテンツの既定のロケール ID (LCID) を指定するために呼び出されます。

HrAddOutlineNode

ユーザーナビゲーション可能なドキュメントアウトライン情報を指定するために呼び出されます。

HrGetPageBreaks

アドインから改ページ情報を取得するために呼び出されます。

HrSetPageHeightForPagination

アドインがドキュメントのページ分割を有効にするために、ページの高さを指定するために呼び出されます。

HrFinalize

固定形式のエクスポート プロセスの最後に呼び出されます。 アドインが最終的な処理を実行できるようにします。

HrBeginStructNode

複数のページにまたがるドキュメント構造ノードの開始構造をアドインに渡すために呼び出されます。

HrEndStructNode

複数のページにまたがるドキュメント構造ノードの終了構造をアドインに渡すために呼び出されます。

EnableCancel

IDocExCancel インターフェイスへのポインターをアドインに渡すために呼び出されます。

GetOutputOption

固定形式の出力オプションを取得するために呼び出されます。

SetOutputOption

固定形式の出力オプションを設定するために Office によって呼び出されます。

SetDocExporterSite

拡張カラー サポート用の IMsoDocExporterSite インターフェイスへのポインターをアドインに提供するために呼び出されます。

さらに、 IMsoDocExporter では、 IUnknown インターフェイスから継承される次のメソッドも公開されています。

表 2. IUnknown インターフェイスから継承されたメソッド

メソッド

説明

AddRef

参照カウントを 1 ずつ加算します。

QueryInterface

サポートされるインターフェイスへのポインターを返します。 アドインの QueryInterface の実装では、IID_IMsoPdfWriterからの IMsoDocExporter インターフェイス ポインターの返しをサポートする必要があります。

Release

参照カウントを 1 ずつ減算します。

IUnknown インターフェイス メソッドの実装の詳細については、「 IUnknown (COM)」を参照してください。

通話フロー

次の図は、パブリッシャーが IMsoDocExporter で公開されているメソッドを呼び出すシーケンスを示しています。 すべてのメソッドが各 Microsoft Office アプリケーションで使用されるわけではありません。また、すべてのメソッドがエクスポートされるすべてのドキュメントに使用されるわけではありません。

図 1. IMsoDocExporter インターフェイスからメソッドを呼び出す

IMsoDocExporter インターフェイスからメソッドを呼び出

以降のセクションでは、 IMsoDocExporter インターフェイスによって公開されるメソッドについて詳しく説明します。 メソッドは、Publisher によって呼び出される順序の概念で説明されています。

GetOutputOption と SetOutputOption

パブリッシャーは 、GetOutputOption メソッドと SetOutputOption メソッドを呼び出して、固定形式のエクスポート プロセスの出力オプションを取得および設定します。

void GetOutputOption(
    MSODOCEXOPTION docexoption, 
    DWORD* pdwVal 
);
void SetOutputOption(
    MSODOCEXOPTION docexoption, 
    DWORD dwVal 
);

docexoption パラメーターは出力オプションを指定し、(p)dwVal パラメーターは オプションの値を指定します。

Office の組み込みエクスポーターは GetOutputOptionSetOutputOption を使用しますが、アドインはオプションを取得および設定する独自のメソッドを実装し、オプションのユーザー エクスペリエンスを独自に実装できます。

Microsoft Office は、Fixed-Format Add-Ins の msodocexOptionTargetDPIColor でのみ GetOutputOption を呼び出します

Office での固定形式エクスポートを実装するために、Publisher は GetOutputOption メソッドを呼び出して、[ PDF または XPS として発行 ] ダイアログ ボックスでユーザーに表示する出力オプションを取得します。 サード パーティのソフトウェア開発者によって開発されたアドインの場合、Publisher は msodocexOptionTargetDPIColor 値のみを使用 して GetOutputOption を呼び出します。 これは、アドインがサポートする必要がある唯一の値です。 GetOutputOption のアドインの実装がこの値で呼び出された場合、3-D 効果ラスター化のターゲット ドット/インチ (DPI) を返す必要があります。

Microsoft Office は、Fixed-Format アドインの SetOutputOption を呼び出します

Office での固定形式エクスポートの実装とアドインの実装の両方で、Publisher は固定形式のエクスポート プロセスの開始時に SetOutputOption を呼び出します。 Office の実装では、渡されるパラメーター値によって固定形式の出力オプションが指定されます。 ただし、アドインが独自のオプション セットを実装している場合、アドインは Publisher によって渡されるオプションを無視できます。

EnableCancel

パブリッシャーは EnableCancel メソッドを呼び出して、 IMsoDocExCancel インターフェイスへのポインターをアドインに渡します。 アドインは、このインターフェイスを使用して、ユーザーが長いドキュメント エクスポート操作を取り消すかどうかを照会できます。

void EnableCancel(
    IMsoDocExCancel* pdec
);

HrBeginStructNode

Publisher は HrBeginStructNode メソッドを呼び出して、ドキュメント内の複数の完全なページを含むコンテンツのドキュメント構造ノードの開始を指定します。 ページ (段落など) 内に完全に存在するドキュメントの要素のドキュメント構造ノードは、 DocExComment_BeginStructNodeDocExComment_EndStructNode 構造体を使用して、拡張メタファイル (EMF) 自体に Publisher によって埋め込まれます。 ドキュメント構造ノードの詳細については、この記事の「HrAddPageFromEmf」および「DocExComment_BeginStructNode」セクションを参照してください。

HRESULT HrBeginStructNode(
    int idNodeParent, 
    int iSortOrder, 
    const MSODOCEXSTRUCTNODE* pnode, 
    BOOL fNoEndNode
);

idNodeParent パラメーターは、アドインに渡されるノードの親であるノードの ID を指定します。 このパラメーターが 0 の場合、ノードはドキュメント構造ツリーのルートの下にあります。 複数の兄弟ノードがルートの下に配置される場合があります。 このパラメーターが -1 の場合、ノードは現在開いているノードの下、つまり HrEndStructNode の呼び出しによって閉じられない HrBeginStructNode で指定された最後のノードの下にあります。

iSortOrder パラメーターは、その兄弟間の構造体ノードの並べ替え順序を指定します。 同じ並べ替え順序を持つノードは 2 つありません。 ただし、並べ替え順序を構成する整数のセットは連続している必要はありません。 値 -1 は、兄弟の並べ替え順序が、EMF コメントにノードが表示される順序と同じであることを示します。

pnode パラメーターは、次の宣言を持つ MSODOCEXSTRUCTNODE 構造体を指します。

typedef struct _MsoDocexStructNode
{
    int idNode;
    MSODOCEXSTRUCTTYPE nodetype;
    WCHAR* pwchAltText;
    union
    {
        int iHeadingLevel;
        ULONG idPara;
        ULONG idDropCap;
        int iPage;
        WCHAR* pwchActualText;
        MSODOCEXLINEBREAKTYPE bt;
        int iListLevel;
        MSODOCEXLISTTYPE listType;
        ULONG idAtn;
        long cpLim;
        int shapeProperty;
        MsoDocexTableAttr tableAttr;
        long cpNoteRef;
        WCHAR* idTableHeader;
        long cpXchAtnMainDod;
        int iTargetParentId;
        WCHAR* wzMathMlText;
        MsoDocexListAttr* pListAttr;
    };
} MSODOCEXSTRUCTNODE;

idNode メンバーは、HrBeginStructNode の呼び出しで渡されるノードの ID を指定します。 このメンバーの値は 0 でない場合があります。 値 -1 は、子ノードで idNodeParent パラメーターを使用してこのノードを親として指定しないことを示します。 代わりに、このノードは、EMF 内の子ノードを囲むだけで親にすることができます。 複数のノードの ID は -1 にすることができます。 ID が -1 でない場合、値はドキュメント全体で一意です。

MSODOCEXSTRUCTNODE の末尾にある埋め込み共用体は、ノードの種類に応じて異なる方法で解釈されます。

  • iHeadingLevel は、msodocexStructTypeHeading の見出しレベルです。
  • idPara は、P、TOCI、または ListBody の段落 ID です。
  • idDropCap は、msodocexStructTypeDropCap の ID です。
  • iPage は、msodocexStructTypePage のページ番号です。
  • bt は、msodocexStructTypeTextLine の改行型です。
  • iListLevel は、msodocexStructTypeList または msodocexStructTypeListItem のリスト レベルです。
  • listType は、msodocexStructTypeListItem のリスト型です。
  • idAtn は、msodocexStructTypeAnnotationBegin または msodocexStructTypeAnnotationEnd の ID です。
  • cpLim は、msodocexStructTypeTable、msodocexStructTypeTOC、または msodocexStructTypeListBody のテーブル内のテーブルの入れ子の順序を決定するために使用されます。
  • shapeProperty は msodocexStructTypeFigure の場合、コンテンツは図形、テキスト ボックス、またはテーブル セルであり、MSODOCEXSHAPEPROPERTY 列挙型のビット フィールドが含まれています。
  • tableAttr は、msodocexStructTypeTH または msodocexStructTypeTD のテーブル セル属性です。
  • cpNoteRef は、msodocexStructTypeIntLinkNoteRef と msodocexStructTypeFootnote/msodocexStructTypeEndnote をリンクするために使用されます。 これについては、このセクションの後半で詳しく説明します。
  • idTableHeader は、msodocexStructTypeTH または msodocexStructTypeTD の一意の ID です。
  • cpXchAtnMainDod は、msodocexStructTypeCommentAnchor と msodocexStructTypeAnnot をリンクするために使用されます。 これについては、このセクションの後半で詳しく説明します。
  • iTargetParentId は、msodocexStructTypeDiagram を再ペアレント化するノードの ID です。
  • wzMathMlText は、msodocexStructTypeEquation の MathML 文字列です。
  • pListAttr は、msodocexStructTypeList のリスト属性です。

注: cpNoteRefcpXchAtnMainDodwzMathMlTextpListAttr は、Word時に使用できます。Document.ExportAsFixedFormat3、ImproveExportTagging = true で呼び出されます。 必要な最小バージョンは、Microsoft 365 Beta Channel 16.0.18720.20000 です。

表 3. MSODOCEXLINEBREAKTYPE の列挙値

説明

msodocexLineBreakTypeNormal

通常の改行。

msodocexLineBreakTypeManual

手動改行。

msodocexLineBreakTypeEOP

段落の末尾。

表 4. MSODOCEXLISTTYPE の列挙値

説明

msodocexListTypeNone

行頭文字や番号付けはありません。

msodocexListTypeBulletDisc

ディスク型の箇条書き。

msodocexListTypeBulletCircle

円型の箇条書き。

msodocexListTypeBulletSquare

四角形の箇条書き。

msodocexListTypeBulletDecimal

10 進数の番号付け。

msodocexListTypeUpperRoman

大文字のローマ数字の番号付け。

msodocexListTypeLowerRoman

小文字のローマ数字の番号付け。

msodocexListTypeUpperAlpha

大文字のアルファベット番号。

msodocexListTypeLowerAlpha

小文字のアルファベット番号。

表 5。 MSODOCEXSHAPEPROPERTY ビット フィールドの列挙値

数値

説明

msodocexShape

0x00000001

オブジェクトは図形またはテキスト ボックスです。

msodocexShapeText

0x00000002

オブジェクトには空白以外のテキストがあります。

msodocexShapePath

0x00000004

オブジェクトには塗りつぶしやアウトラインがあります。

msodocexShapeAltText

0x00000008

オブジェクトには Alt Text があります。

msodocexShapeEquation

0x00000010

オブジェクトには、数式を含むテキストがあります。

msodocexShapeTabelCell

0x00000020

オブジェクトは、テーブル内のセルです。

MsoDocexTableAttr

MsoDocexTableAttr 構造体は 32 ビットに収まり、テーブル セルの行と列のスパンとヘッダー スコープ情報が含まれます。

struct MsoDocexTableAttr
{
    static constexpr unsigned int MaxSpanBits = sizeof(unsigned int) * 8 / 2 - 1;
    static constexpr unsigned int MaxSpanValue = (1u << MaxSpanBits) - 1;

    unsigned int rowSpan : MaxSpanBits;
    unsigned int fRowScope : 1;
    unsigned int colSpan : MaxSpanBits;
    unsigned int fColScope : 1;
};

MsoDocexTableAttr 構造体のメンバーは次のとおりです。

  • MaxSpanBits rowSpan 値と colSpan 値で使用できるビット数 (15) を指定します。

  • MaxSpanValue rowSpan と colSpan に指定できる最大値を指定します。

  • rowSpan テーブル セルがまたがる行数を指定します。

  • fRowScope ヘッダーが Row/Both か Column かを指定します。

  • colSpan テーブル セルにまたがる列の数を指定します。

  • fColScope ヘッダーが Column/Both か Row かを指定します。

MsoDocexListAttr

MsoDocexListAttr 構造体には、リストの情報が含まれています。

struct MsoDocexListAttr
{
    int iListLevel;
    long cpLim;
};

MsoDocexListAttr 構造体のメンバーは次のとおりです。

  • iListLevel リストの入れ子の順序を指定します。

  • cpLim リストが終了する文書内の位置を指定します。

処理後のヒント

場合によっては、目的の結果を得るためにノードを後処理する必要があります。

脚注/脚注の後処理

エクスポート中、脚注/文末脚注のリンクは msodocexStructTypeIntLinkNoteRef としてタグ付けされます。 脚注/文末脚注本文はそれぞれ msodocexStructTypeFootnote と msodocexStructTypeEndnote としてタグ付けされ、それらは常に msodocexStructTypeDocument ノードの下の最上位ノードになります。 msodocexStructTypeIntLinkNoteRef ノードと対応する msodocexStructTypeFootnote/msodocexStructTypeEndnote ノードは、同じ cpNoteRef 値を持つことになります。 これは、脚注/文末脚注ノードを対応するリンク ノードの下に移動して、論理的な読み取り順序を維持するために使用できます。

コメントの後処理

エクスポート中、各コメント アンカーは msodocexStructTypeCommentAnchor としてタグ付けされます。 コメント本文は msodocexStructTypeAnnot としてタグ付けされ、常に msodocexStructTypeDocument ノードの最上位ノードになります。 msodocexStructTypeCommentAnchor ノードと対応する msodocexStructTypeAnnot ノードは、同じ cpXchAtnMainDod 値を持つことになります。 これは、注釈ノードを対応するコメント アンカー ノードの下に移動して、論理的な読み取り順序を維持するために使用できます。

レイアウト テーブルの後処理

エクスポート中にテーブルがレイアウト テーブルであると検出された場合は、msodocexStructTypeTable としてタグを付けますが、ノードの cpLim を -2 に設定します (これがレイアウト テーブルであることを示す定数値)。 この値を使用して、テーブル ノードに段落ノードとしてタグを付け直す必要があるかどうかを判断できます。

ページにまたがるノードの後処理 (段落、リスト、テーブル)

段落の場合、2 つの para ノードの idPara 値をチェックして、ページ間で同じ段落を表しているかどうかを判断できます。 テーブルの場合、cpLim 値を確認して、それらが同じかどうかを確認できます。

リストの場合、リストの cpLim を含む MsoDocexStructNode MsoDocexListAttr に新しいクラスを追加しました。 これは、2 つのリスト ノードが同じ cpLim を持っている場合にチェックするために使用できます。これは、両方がドキュメント内の同じリストを表していることを意味します。

テーブル構造ノードの場合、共用体は、テーブル内のテーブルの入れ子順序を決定するために使用できる cpLim を使用して、他のテーブルに対するテーブルの終わりの順序として解釈されます。

DocExComment_BeginStructNodeのコンテキストでは、アドインはこの共用体の pwchActualText メンバーを無視できます。

pwchAltText メンバーは、構造体ノードの代替テキストを指定します。

HrBeginStructNode に対する fNoEndNode パラメーターは、パブリッシャーが HrEndStructNode メソッドを呼び出して構造体ノードの末尾をマークするかどうかを指定します。 fNoEndNode が false の場合、パブリッシャーは HrEndStructNode を呼び出して、ノードによってバインドされたコンテンツを閉じます。 このパラメーターに true 値がある場合、ノードはコンテンツをバインドしません。

fNoEndNode パラメーターは、後続のノードの親 ID 値の解釈に影響します。 fNoEndNodefalse の場合、HrBeginStructNode へのこの呼び出しと HrEndStructNode の後続の呼び出しの間に挿入され、親 ID が -1 であるノードは、このノードの子になります。 ただし、 fNoEndNodetrue の場合、 HrBeginStructNode の呼び出しの後に挿入され、親 ID が -1 のノードは、このノードの子ではなく、 fNoEndNodefalse と等しい次に指定したノードの子になります。

ドキュメント構造ノードは、任意の深さに入れ子にすることができます。

HrBeginStructNode で指定されたノードと、DocExComment_BeginStructNodeによって指定されたノードは、同じ ID 領域を共有し、同じドキュメント構造ツリーに存在します。 HrBeginStructNodeDocExComment_BeginStructNode は、このツリーにノードを追加する 2 つの代替方法です。 たとえば、最後に開いたノードが HrBeginStructNode によって開き、次に検出されたノードが、idNodeParent-1 と等しいDocExComment_BeginStructNode EMFcommentrecord からの場合、HrBeginStructNode のノードがDocExComment_BeginStructNode レコードのノードの親であることを意味します。

HrEndStructNode

Publisher は HrEndStructNode メソッドを呼び出して、ドキュメント内の複数のページを含むコンテンツのドキュメント構造ノードの末尾を指定します。 HrEndStructNode によって終了された構造体ノードは、以前は HrBeginStructNode メソッドの呼び出しによって開始されました。 詳細については、この記事の「HrBeginStructNode」を参照してください。

HRESULT HrEndStructNode();

HrCreateDoc

Publisher は HrCreateDoc メソッドを呼び出して、新しい空の固定形式ドキュメントの作成を指定します。

HRESULT HrCreateDoc(
    const WCHAR* wzDocExFile
);

Publisher は、固定形式のエクスポート プロセスの開始時に HrCreateDoc メソッドを呼び出して、空の固定形式ドキュメントの作成を指定します。 wzDocExFile パラメーターは、固定形式のドキュメントを書き込む出力ファイルの名前を指定します。

アドイン実装の場合、Publisher は、Microsoft Office オブジェクト モデルの ExportToFixedFormat メソッドの呼び出しでアドインが指定したファイル名で HrCreateDoc を呼び出します。 ただし、アドインは通常、ユーザーが出力ファイル名を指定できるように構成 UI を提供するため、アドインはエクスポート プロセス中にこのファイル名を無視する可能性があります。

ドキュメントの改ページを行うためにアドインを必要とする Microsoft Office アプリケーションの場合、 HrCreateDoc は改ページ処理呼び出しシーケンスの開始時に 1 回、ドキュメントのページ分割後に再度呼び出されます。 詳細については、HrSetPageHeightForPagination メソッドと HrGetPageBreaks メソッドの説明を参照してください。

HrSetDefaultLcid

パブリッシャーは HrSetDefaultLcid メソッドを呼び出して、エクスポートするコンテンツの既定のロケール ID (LCID) を指定します。

HRESULT HrSetDefaultLcid(
    DWORD lcid
);

有効な LCID の一覧については、「 Microsoft によって割り当てられたロケール ID (LCID) 値の一覧」を参照してください。

HrAddPageFromEmf

パブリッシャーは HrAddPageFromEmf メソッドを呼び出して、エクスポートするドキュメント内のコンテンツを表すメモリ内 EMF にハンドルをアドインに渡します。

HRESULT HrAddPageFromEmf(
    HENHMETAFILE hemf
);

Microsoft Office によってアドインに渡される EMF は、アドインが固定形式ファイルとしてエクスポートするコンテンツの主なソースです。 Microsoft Office は、アプリケーションのソース ドキュメント内のコンテンツのページごとに HrAddPageFromEmf を 1 回呼び出します。

EMF コメントがセマンティック情報を伝える

EMF は、ドキュメントのビジュアル要素をレンダリングする方法を指定する描画コマンド (GDI および GDI+ コマンド) のシーケンスです。 EMF には、これらのコマンド以外の情報は含まれません (たとえば、"ここに画像を描画する"、または "線を描画する" など)。 特に、従来の EMF では、ハイパーリンク、ロケール情報、アクセシビリティ情報など、ドキュメントのセマンティックな側面はサポートされていません。 エクスポートされたドキュメント内のセマンティック情報を保持するために、Publisher は EMF に特殊なレコードを挿入します。 これらのレコードにはセマンティック情報が含まれています。

セマンティック情報を表すレコードは、特別な形式の EMF コメントとして実装されます。 EMF 形式では、グラフィックス デバイス インターフェイス (GDI) のレンダリング エンジンによって無視されるコメント レコード型を使用できますが、任意の情報を含めることができます。

たとえば、代替テキストを含むドキュメントを考えてみましょう。 (代替テキストは、視覚障穣を持つユーザーの画像を記述するためにドキュメント リーダーによって使用されます)。パブリッシャーは、イメージのレンダリングの前後に EMF コメントを挿入し、これらの EMF コメントはイメージの代替テキストを指定します。 アドインはコメントを解釈し、固定形式のエクスポート ファイルに情報を書き込みます。

次の表は、Microsoft Office 固定形式エクスポート機能でサポートされているセマンティック レコードの種類を示しています。 これらの型は、 MSODOCEXSTRUCTTYPE 列挙型によって列挙されます。 各型は、レコードの形式を記述する構造体型に対応します。

表 6. 固定形式エクスポートでサポートされるセマンティック レコードの種類

コメント値

構造体の種類

msodocexcommentExternalHyperlink

DocExComment_ExternalHyperlink

msodocexcommentExternalHyperlinkRctfv

DocExComment_ExternalHyperlink

msodocexcommentInternalHyperlink

DocExComment_InternalHyperlink

msodocexcommentInternalHyperlinkRctfv

DocExComment_InternalHyperlink

msodocexcommentColorInfo

DocExComment_ColorInfo

msodocexcommentColorMapEnable

DocExComment_ColorEnable

msodocexcommentBeginTextRun

DocExComment_BeginTextRun

msodocexcommentBeginTextRunRTL

DocExComment_BeginTextRun

msodocexcommentEndTextRun

DocExComment_EndTextRun

msodocexcommentBeginStructNode

DocExComment_BeginStructNode

msodocexcommentEndStructNode

DocExComment_EndStructNode

msodocexcommentUnicodeForNextTextOut

DocExComment_UnicodeForNextTextOut

msodocexcommentUnicodeForNextTextOutRTL

DocExComment_UnicodeForNextTextOut

msodocexcommentEPSColor

DocExComment_EPSColor

msodocexcommentEPSCMYKJPEG

DocExComment_EPSColorCMYKJPEG

msodocexcommentEPSSpotImage

DocExComment_EPSColorSpotImage

msodocexcommentEPSStart

DocExComment_EPSStart

msodocexcommentPageName

DocExComment_PageName

msodocexcommentTransparent

DocExComment_Transparent

DocExComment_ExternalHyperlink(Rctfv)

DocExComment_ExternalHyperlink(Rctfv) 構造体は、ドキュメントの外部 (インターネット上の Web サイトなど) にリンクするハイパーリンクを記述します。

struct DocExComment_ExternalHyperlink
{
    DWORD ident {};
    DWORD iComment {};
    union
    {
        RECT  rcdvRegion;
        struct
        {
            float xLeft;
            float yTop;
            float dxWidth;
            float dyHeight;
        } rctfvRegion;
    };
    WCHAR wzLink[MAX_PATH];
};

DocExComment_ExternalHyperlink(Rctfv) 構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値、msodocexcommentExternalHyperlink、または msodocexcommentExternalHyperlinkRctfv を指定します。

  • rcdvRegionrctfvRegion ハイパーリンクのソースの場所であるページの領域を指定する共用体。 この領域は、デバイス ピクセルを測定単位として使用する RECT 型 (rcdvRegion) として、または浮動小数点座標 (rctfvRegion) を含む構造体として表すことができます。この場合、測定単位はポイントです。

    iComment メンバーが msodocexcommentExternalHyperlink と等しい場合、アドインは rcdvRegion を使用する必要があります。 この場合、アドインは現在の EMF 変換マトリックスを rcdvRegion に適用してページ空間に変換する必要があります。

    iComment メンバーが msodocexcommentExternalHyperlinkRctfv と等しい場合、アドインは rctfvRegion を使用する必要があります。 この場合、 rctfvRegion は既にページ空間に存在するため、変換は必要ありません。

  • wzLink[MAX_PATH] このハイパーリンクの宛先 URL を指定します。

DocExComment_InternalHyperlink(Rctfv)

DocExComment_InternalHyperlink(Rctfv) 構造体は、ドキュメント内の場所にリンクするハイパーリンクを記述します。 Publisher はドキュメントのページごとに個別の EMF を渡しますが、 DocExComment_InternalHyperlink(Rctfv) で指定されたハイパーリンクの宛先は、ソースの場所とは異なるページ上にある可能性があることに注意してください。

struct DocExComment_InternalHyperlink
{
    DWORD ident {};
    DWORD iComment {};
    union
    {
        RECT  rcdvRegion;
        struct
        {
            float xLeft;
            float yTop;
            float dxWidth;
            float dyHeight;
        } rctfvRegion;
    };
    DWORD iTargetPage {};
    float xtfvTarget {};
    float ytfvTarget {};
    float dytfTargetPage {};
};

DocExComment_InternalHyperlink(Rctfv) 構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値、msodocexcommentInternalHyperlink、または msodocexcommentInternalHyperlinkRctfv を指定します。

  • rcdvRegionrctfvRegionDocExComment_ExternalHyperlink 構造体と同様に、このメンバーはハイパーリンクのソース位置であるページの領域を指定する共用体です。 この領域は、デバイス ピクセルを測定単位として使用する RECT 型 (rcdvRegion) として、または浮動小数点座標 (rctfvRegion) を含む構造体として表すことができます。この場合、測定単位はポイントです。

    iComment メンバーが msodocexcommentInternalHyperlink と等しい場合、アドインは rcdvRegion を使用する必要があります。 この場合、アドインは現在の EMF 変換マトリックスを rcdvRegion に適用してページ空間に変換する必要があります。

    iComment メンバーが msodocexcommentInternalHyperlinkRctfv と等しい場合、アドインは rctfvRegion を使用する必要があります。 この場合、 rctfvRegion は既にページ空間に存在するため、変換は必要ありません。

  • iTargetPage 文書内のコピー先ページのページ番号を指定します。

  • xtfvTarget コピー先ページのターゲット位置の x 座標を指定します。 この値の測定単位はポイントです。

  • ytfvTarget コピー先ページのターゲット位置の y 座標を指定します。 この値の測定単位はポイントです。

  • dytfTargetPage 変換先ページの高さをポイント単位で指定します。 ytfvTarget メンバーによって指定されたオフセットは、ページの左上隅を基準にしています。 ただし、一部の固定形式の型では、ページの左下隅を基準とした座標系が使用されます。 これらの種類のドキュメントでは、オフセットを変換するためにページの高さが必要です。

DocExComment_ColorInfo

DocExComment_ColorInfo構造体は、EMF の色状態情報を指定します。 この構造の詳細については、「拡張カラー サポート」セクションを参照してください。

struct DocExComment_ColorInfo
{
    DWORD ident {};
    DWORD iComment {};
    COLORREF clr { 0 };
    BOOL fForeColor {};
};

DocExComment_ColorInfo構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentColorInfo を指定します。

  • clr EMF の現在の色の状態を表す色 ID を指定します。

  • fForeColorclr メンバーの色 ID が前景色または背景色を表すかどうかを指定します。 このメンバーの値が true の場合、色 ID は前景色を表します。 このメンバーの値が false の場合、色 ID は背景色を表します。

DocExComment_ColorEnable

DocExComment_ColorEnable構造体は、EMF 内の後続のコンテンツに対してカラー マッピングを有効にするかどうかを指定します。 この構造の詳細については、「拡張カラー サポート」セクションを参照してください。

struct DocExComment_ColorEnable
{
    DWORD ident {};
    DWORD iComment {};
    BOOL fEnable {};
};

DocExComment_ColorEnable構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentColorMapEnable を指定します。

  • fEnable 後続のコンテンツに対してカラー マッピングを有効にするかどうかを指定します。 値 true は、カラー マッピングが有効になっていることを示します。 false の値は、カラー マッピングが無効になっていることを示します。

DocExComment_BeginStructNode

DocExComment_BeginStructNode構造体は、ドキュメント構造ノードの先頭をマークします。 構造体ノードは、次の 2 つの目的の 1 つを提供します。

  • 構造ノードは、含まれているコンテンツの種類を識別し、そのコンテンツとドキュメント内の他のコンテンツとの間の階層関係を指定できます。

  • 構造体ノードでは、ドキュメント内の要素に代替テキストを指定できます。

fContentNode メンバーに true 値がある場合、DocExComment_BeginStructNodeはドキュメントの後半でDocExComment_EndStructNodeに従います。 DocExComment_EndStructNodeは、DocExComment_BeginStructNodeの情報によってラップされるコンテンツの末尾をマークします

ドキュメント内の構造体ノードのコレクションはツリーを形成します。各ノードには親ノードがあり、兄弟ノードを持つこともあります。 idNodeParent メンバーと iSortOrder メンバーは、このツリーの構造について説明します。 子ノードは、EMF 内の親ノードの DocExComment_BeginStructNodeDocExComment_EndStructNode 構造体の間に表示される場合と表示されない場合があることに注意してください。

struct DocExComment_BeginStructNode
{
    DWORD ident {};
    DWORD iComment {};
    int idNodeParent {};
    int iSortOrder {};
    MSODOCEXSTRUCTNODE desn;
    BOOL fContentNode {};
    int cwchAltText {};
};

DocExComment_BeginStructNode構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentBeginStructNode を指定します。

  • idNodeParent 親ノードの ID を指定します。 値 0 は、ルート ノードを指定します。 値 -1 は、現在開いている構造体ノード、つまり外側の構造体ノード 指定します。

  • iSortOrder 兄弟ノード間の構造体ノードの並べ替え順序を指定します。 並べ替え順序を使用すると、アドインはエクスポートされたドキュメント内のコンテンツを正しく並べ替えることができます。

    同じ並べ替え順序を持つノードは 2 つありません。 ただし、並べ替え順序を構成する整数のセットは連続している必要はありません。

    値 -1 は、兄弟順序が EMF コメントにノードが表示される順序と同じであることを示します。 コンテンツが EMF に表示される順序は、必ずしもドキュメントのユーザーがコンテンツを使用する順序ではないことに注意してください。

  • desn ドキュメントで前に定義した MSODOCEXSTRUCTTYPE 構造体を指定します。

idNode メンバーは、ノードの ID を指定します。 このメンバーの値は 0 でない場合があります。 値 -1 は、子ノードで idNodeParent メンバーを使用してこのノードを親として指定しないことを示します。 代わりに、このノードは、EMF 内の子ノードを囲むだけで親にすることができます。 複数のノードの ID は -1 にすることができます。 ID が -1 でない場合、値はドキュメント全体で一意です。

nodetype は、構造体ノードの種類を指定します。 このメンバーは、 MSODOCEXSTRUCTTYPE 列挙型の値のいずれかと等しくなります。 次の表に、ドキュメント構造ノードの種類の例を示します。

表 7. ドキュメント構造ノードの種類

型の値

説明

msodocexStructTypePara

アーティクル内のテキスト ブロック。 その親ノードはアーティクルである必要があります。

msodocexStructTypeFigure

テキスト表現を持つグラフィカル要素 (画像や図形のコレクションなど)。 テキスト表現は、ドキュメントの読み取りまたは検索に使用される代替テキストです。

msodocexStructTypeArticle

連続したコンテンツ ブロックとして読み取りまたは検索する必要がある単一のテキスト フローを形成するノードのグループ。 一部のドキュメントには 1 つの記事があり、他のドキュメントには複数の記事があります。

msodocexStructTypeHeading

テキスト内の見出し。

msodocexStructTypeTable

テーブルを形成するテキスト ブロック。

msodocexStructTypeTR

テーブルの 1 行を形成するテキスト ブロック。

msodocexStructTypeTD

テーブル行の 1 つのセルを形成するテキスト ブロック。

msodocexStructTypeTH

テーブル行に 1 つのヘッダー セルを形成するテキスト ブロック。

msodocexStructTypeList

リストを形成するテキスト ブロック。

msodocexStructTypeListItem

リスト アイテムを形成するテキスト ブロック。

msodocexStructTypeListBody

リスト アイテムの本文を形成するテキスト ブロック。

msodocexStructTypeDocument

ドキュメント。

msodocexStructTypePage

ドキュメント内のページ。

msodocexStructTypeTOC

目次。

msodocexStructTypeTOCI

目次の項目。

msodocexStructTypeExtLink

外部リソースへのリンク。

msodocexStructTypeIntLink

内部リソースへのリンク。

msodocexStructTypeFootnote

脚注

msodocexStructTypeEndnote

文末脚注

msodocexStructTypeTextbox

テキスト ボックス。

msodocexStructTypeHeader

ヘッダーを形成するテキスト ブロック。

msodocexStructTypeFooter

フッター。

msodocexStructInlineShape

インライン図形。

msodocexStructAnnotation

注釈。

msodocexStructTypeSpanBlock

テキスト ブロック。

msodocexStructTypeWorkbook

ブック。

msodocexStructTypeWorksheet

ワークシート。

msodocexStructTypeMacrosheet

マクロシート。

msodocexStructTypeChartsheet

グラフシート。

msodocexStructTypeDialogsheet

ダイアログシート。

msodocexStructTypeSlide

スライド。

msodocexStructTypeChart

グラフ

msodocexStructTypeDiagram

SmartArt 図

msodocexStructTypeBulletText

Buller テキスト。

msodocexStructTypeTextLine

テキストの行。

msodocexStructTypeDropCap

ドロップ キャップ。

msodocexStructTypeSection

セクション

msodocexStructTypeAnnotationBegin

注釈の先頭。

msodocexStructTypeAnnotationEnd

注釈の末尾。

msodocexStructTypeParaRTLAttr

右から左のレイアウトを持つアーティクル内のテキスト ブロック。

msodocexStructTypeTableRTLAttr

右から左にレイアウトされたテーブルを形成するテキスト ブロック。

msodocexStructTypeHeadingRTLAttr

右から左のレイアウトのテキスト内の見出し。

msodocexStructTypeListItemRTLAttr

右から左のレイアウトでリスト アイテムを形成するテキスト ブロック。

msodocexStructTypeParaUnannotatableAttr

注釈が付かないアーティクル内のテキスト ブロック。

msodocexStructTypeTHead

テーブル内のヘッダー行領域。

msodocexStructTypeTBody

テーブル内の本体領域、つまり THead と TFoot の間の部分。

msodocexStructTypeLabel

ラベル。

msodocexStructTypeEquation

数式

msodocexStructTypeIntLinkNoteRef

脚注または文末脚注の参照マークのリンク。

msodocexStructTypeTFoot

テーブル内のフッター行領域。

msodocexStructTypeTitle

テキスト内のタイトル。

msodocexStructTypeBlockQuote

段落の引用符または強い引用符。

msodocexStructTypeCommentAnchor

コメントにリンクされている一部のテキスト。

msodocexStructTypeAnnot

1 つのコメントの内容。

msodocexStructTypeQuote

インライン引用符。

msodocexStructTypeCaption

数式/図/表のキャプション。

注: msodocexStructTypeTitlemsodocexStructTypeBlockQuotemsodocexStructTypeCommentAnchormsodocexStructTypeAnnotmsodocexStructTypeQuotemsodocexStructTypeCaption は、Word場合に使用できます。Document.ExportAsFixedFormat3、ImproveExportTagging = true で呼び出されます。 必要な最小バージョンは、Microsoft 365 Beta Channel 16.0.18720.20000 です。

fContentNodeDocExComment_EndStructNode構造体がこの構造体ノードの末尾をマークするかどうかを指定します。 fContentNodetrue の場合、DocExComment_EndStructNode構造体は、ノードによってバインドされたコンテンツを閉じます。 この fContentNodefalse 値がある場合、ノードはコンテンツをバインドしません。

fContentNode メンバーは、後続のノードの親 ID 値の解釈に影響します。 fContentNodetrue の場合、このDocExComment_BeginStructNodeと後続のDocExComment_EndStructNodeの間に挿入され、親 ID が -1 であるノードは、このノードの子になります。 ただし、 fContentNodetrue の場合、この DocExComment_BeginStructNodeの後に挿入され、親 ID が -1 のノードは、このノードの子ではありません。 これらは、 fContentNodefalse と等しい、次に指定したノードの子です。

ドキュメント構造ノードを任意の深さに入れ子にすることができます。

cwchAltText 構造体に続く代替テキストのブロック内の Unicode 文字の数を指定します。 この Unicode 文字列は、ノードの代替テキスト (画像の代替テキストなど) を指定します。

DocExComment_EndStructNode

DocExComment_EndStructNode構造体は、DocExComment_BeginStructNode内の情報によって装飾されるコンテンツの末尾をマークします。

struct DocExComment_EndStructNode
{
    DWORD ident {};
    DWORD iComment {};
};    

DocExComment_EndStructNode構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentEndStructNode を指定します。

DocExComment_BeginTextRun

DocExComment_BeginTextRun構造体は、ドキュメント内の一連のテキストの言語を識別し、テキストの Unicode コード ポイントを提供します。

テキスト レンダリング EMF レコードの中には、テキスト表現として Unicode を使用するものもありますが、元のソース テキストではなく、画面に描画されるグリフを使用するものもあります。 グリフは、フォント内の特定の図形のインデックスであり、フォントごとに異なる場合があります。

複数の Unicode コード ポイントが 1 つのグリフに結合されたり、1 つの Unicode コード ポイントが複数のグリフに分割されたりする場合があります。 コード ポイントからグリフへのマッピングはコンテキストに依存するため、ユーザーはグリフのみを含むドキュメントでテキスト検索やコピー/貼り付けを行うことはできません。 そのため、Publisher は Unicode テキストとグリフを提供する場合があります。

struct DocExComment_BeginTextRun
{
    DWORD ident {};
    DWORD iComment {};
    DWORD lcid {};
    int cGlyphIndex {};
    int cwchActualText {};
};

DocExComment_BeginTextRun構造体のメンバーは次のとおりです。

  • Ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentBeginTextRun を指定します。

  • lcid テキスト シーケンスの LCID を指定します。

  • cGlyphIndex この構造体に続く配列のサイズを指定します。 この配列は、実際のテキスト内の Unicode コード ポイントを EMF 内の対応するグリフにマップするグリフ インデックス テーブルを実装します。 配列の各要素は、テキスト内のコード ポイントに対応します。 その要素の値は、EMF でそのコード ポイントをレンダリングするために使用される最初のグリフを指定します。 隣接する 2 つ以上のコード ポイントが配列内で同じ値を持つことがあります。これは、両方が同じグリフに解決されることを意味します。 値は 0 にすることもできます。これは、このコード ポイントがグリフにマップされないことを意味します。

  • cwchActualText グリフ インデックス テーブルに続く Unicode コード ポイントのシーケンスのサイズを指定します。 これは、ドキュメントのコンシューマーが検索、コピー/貼り付け、アクセシビリティに使用できるテキストです。 このメンバーの値は 0 にすることができます。これは、Unicode テキストが指定されていないことを意味します。

DocExComment_EndTextRun

DocExComment_EndTextRun構造体はテキスト シーケンスの末尾をマークし、その先頭は DocExComment_BeginTextRun 構造体でマークされています。

struct DocExComment_EndTextRun
{
    DWORD ident {};
    DWORD iComment {};
};    

DocExComment_EndTextRun構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentEndTextRun を指定します。

DocExComment_UnicodeForNextTextOut

DocExComment_UnicodeForNextTextOut構造体は、DocExComment_BeginTextRun および DocExComment_EndTextRun 構造体と同様に機能します。 ただし、 DocExComment_UnicodeForNextTextOut では、begin 構造体と end 構造体で囲まれた EMF コンテンツのブロックではなく、次の EMF TextOut レコードに対してのみ Unicode コード ポイントを指定します。

struct DocExComment_UnicodeForNextTextOut
{
    DWORD ident {};
    DWORD iComment {};
    int cGlyphIndex {};
    int cwchActualText {};
};

DocExComment_UnicodeForNextTextOut構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentUnicodeForNextTextOut を指定します。

  • cGlyphIndex この構造体に続く配列のサイズを指定します。 この配列は、実際のテキスト内の Unicode コード ポイントを EMF 内の対応するグリフにマップするグリフ インデックス テーブルを実装します。 配列の各要素は、テキスト内のコード ポイントに対応します。 その要素の値は、EMF でそのコード ポイントをレンダリングするために使用される最初のグリフを指定します。 隣接する 2 つ以上のコード ポイントが配列内で同じ値を持つことがあります。これは、両方が同じグリフに解決されることを意味します。

  • cwchActualText グリフ インデックス テーブルに続く Unicode コード ポイントのシーケンスのサイズを指定します。 これは、ドキュメントのコンシューマーが検索、コピー/貼り付け、アクセシビリティに使用できるテキストです。

DocExComment_EPSColor

DocExComment_EPSColor構造体は、EMF に埋め込まれたカプセル化された PostScript (EPS) ファイルの色情報を指定します。 この構造の詳細については、「拡張カラー サポート」セクションを参照してください。

typedef struct
{
    DWORD ident {};
    DWORD iComment {};
    BYTE colorInfo[];
} DocExComment_EPSColor;

DocExComment_EPSColor構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentEPSColor を指定します。

  • colorInfo[] EPS ファイルの色情報を指定します。 アドインは、 IMsoDocExporterSite::SetEPSInfo メソッドを使用して、この情報を Publisher に渡す必要があります。

DocExComment_EPSColorCMYKJPEG

DocExComment_EPSColorCMYKJPEG構造体は、CMYKJPEG ファイル ストリームであるバイナリ オブジェクトの EMF の開始を指定します。 この構造の詳細については、「拡張カラー サポート」セクションを参照してください。

typedef struct
{
    DWORD ident {};
    DWORD iComment {};
} DocExComment_EPSColorCMYKJPEG;

DocExComment_EPSColorCMYKJPEG構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentEPSCMYKJPEG を指定します。

DocExComment_EPSColorSpotImage

DocExComment_EPSColorSpotImage構造体は、後続の RGB イメージのスポット カラー情報を提供します。 この構造の詳細については、「拡張カラー サポート」セクションを参照してください。

typedef struct
{
    DWORD ident {};
    DWORD iComment {};
    COLORREF cmykAlt { 0 };
    COLORREF rgbAlt { 0 };
    float flTintMin {};
    float flTintMax {};
    char szSpotName[1];
} DocExComment_EPSColorSpotImage;

DocExComment_EPSColorSpotImage構造体のメンバーは次のとおりです。

  • ident セマンティック情報を含むものとしてこの EMF コメントを識別する定数値 msodocexsignature を指定します。

  • iComment MSODOCEXCOMMENT 値 msodocexcommentEPSSpotImage を指定します。

  • cmykAlt CMYK カラー ID を指定します。

  • rgbAlt RGB カラー ID を指定します。

  • flTintMin 最小濃淡を指定します。

  • flTintMax 最大濃淡を指定します。

  • szSpotName[1] スポット名を含む可変長の 0 で終わる文字列を指定します。

拡張カラー サポート

Publisher で拡張色空間をサポートするには、EMF が RGB (赤緑黒) 色のみをサポートするため、追加の EMF セマンティック レコードとインターフェイスが必要です。 拡張カラー スペースには、CMYK (シアンマゼンタイエローブラック) とスポットカラースペースが含まれます。これは商用印刷でよく使用されます。

Publisher では、カラー マッピングを使用して、ドキュメント EMF 内の拡張色を表します。 Publisher は、ドキュメントで使用されるすべての色のカラー テーブルを作成し、実際の色を EMF の色 ID に置き換えます。 カラー ID の型は COLORREF で、RGB カラーに使用される型と同じです。 COLORREF 構造体の詳細については、「COLORREF」を参照してください。

EMF のカラー ID を拡張色空間に解決するために、アドインは IMsoDocExporterSite インターフェイスの HrResolveColor メソッドを使用して Publisher に呼び戻します。 アドインは、パラメーターの 1 つとして IDOCEXCOLOR インターフェイスへのインターフェイス ポインターを HrResolveColor に渡します。 Publisher は、 HrResolveColor の呼び出しで指定されたカラー ID を受け取り、拡張色 (RGB、CMYK、またはスポット カラー) に変換し、 IDOCEXCOLOR インターフェイスのメソッドを介してアドインに戻します。

ベクターの色と色の変更された画像

ベクターの色は、アドインが Publisher から受け取る COLORREF 値です。 たとえば、テキストの色、線のストロークの色、メタファイルの色の色などです。 カラー マッピングが有効になっている場合、Publisher は実際の RGB カラー値ではなく COLORREF のカラー ID を使用します。 Publisher が IMsoDocExporterSite インターフェイス ポインターを IMsoDocExporterSite インターフェイス ポインターで提供する場合、アドインは常に IMsoDocExporterSite::HrResolveColor メソッドを呼び出して COLORREF を拡張色に変換し、アドインが IDOCEXCOLOR インターフェイス内のメソッドを介して受け取る必要があります。

ベクター カラー マッピングをサポートするには、アドインで次の操作を行う必要があります。

  • IDOCEXCOLOR インターフェイスのクラス サポートを実装します。 このインターフェイスの メソッドを使用すると、Publisher は拡張カラーをアドインに渡すことができます。

  • EMF のセマンティック レコードから次の色の状態値をキャッシュします。

  • 色を変更する前景色を設定します。 これは、 DocExComment_ColorInfo 構造体を介して設定されます。

  • 色を変更する背景色を設定します。 これは、 DocExComment_ColorInfo 構造体を介して設定されます。

  • カラー マッピングが有効になっているタイミングを決定します。 これは、 DocExComment_ColorEnable 構造体を介して設定されます。

  • ベクター カラーの場合は、IDOCEXCOLOR::GetUnresolvedRGB がカラー ID を返すように、色 ID を持つ IDOCEXCOLOR インターフェイスを作成します。 アドインは、IDOCEXCOLOR インターフェイスとキャッシュされた色の状態で IMsoDocExporterSite::HrResolveColor メソッドを呼び出す必要があります。 パブリッシャーは、最終的な色 (RGB、CMYK、スポット、または登録の濃淡) を使用して IDOCEXCOLOR インターフェイス メソッドを呼び出します。

  • EMF セマンティック レコードから色を変更するための前景色または背景色が指定されている場合、アドインはアドイン内の画像 (メタファイルやラスター画像など) の色を変更する必要があります。

色が変更されていないイメージ

EMF では、GDI+ を使用した CMYK イメージ がサポートされています。 したがって、EMF内の画像はRGBまたはCMYKのいずれかであり得る。 イメージが CMYK イメージの場合、アドインはイメージをターゲットの色空間に変換する必要があります。

Publisher は、ドキュメントのターゲット色空間を維持します。 アドインでは、イメージの色空間で IMsoDocExporterSite::HrConvertImageColorSpace メソッドを呼び出すことで、このターゲットカラー空間を使用できます。

EPS ファイルからの色

カプセル化された Postscript (EPS) は、拡張色空間をサポートするメタファイル型です。 パブリッシャー ドキュメントに EPS イメージを埋め込むユーザーは、固定形式の出力で色情報が使用されることを想定しています。 Publisher 内では、EPS は EPS 関連のセマンティック レコードを含む EMF に変換されます。 この EMF は、アプリケーションがアドインに渡すページ EMF ファイルに埋め込まれます。

EPS ファイルの色をサポートするには、アドインで次の操作を行う必要があります。

  • EMF で検出されたレコードに対して IMsoDocExporterSite::SetEPSInfo メソッドを呼び出 DocExComment_EPSColor

  • EMF の DocExComment_EPSColorCMYKJPEG レコードから CMYK イメージを抽出します。 このレコードには、実際の CMYK JPEG ファイル ストリームであるバイナリ オブジェクトが含まれています。 これを使用して、 StretchDIBits 関数の後続の呼び出しで指定された RGB イメージを置き換えます。

  • DocExComment_EPSColorSpotImage レコードは、常にインデックス イメージである後続の RGB イメージのスポット カラー情報を提供します。 アドインは、スポット イメージをターゲットの色空間に変換する必要があります。

  • アドインは必要に応じて IMsoDocExporterSite:: HrGetSpotRecolorInfo メソッドを呼び出して、Publisher からドキュメントのターゲットカラーを取得できます。 その後、アドインは、RGB イメージのパレットの色を、DoxExComment_EPSColorSpotImage レコードで指定された flTintMinflTintMax の濃淡にマッピングすることで、後続の RGB イメージの色を変更できます。 パレットの各色の明るさがマッピングに使用されます。

DocExComment_EPSStart レコードは情報提供のみであることに注意してください。 アドインはこのレコードを無視できます。

SetDocExporterSite

パブリッシャーは SetDocExporterSite を呼び出して、 IMsoDocExporterSite インターフェイスへのポインターをアドインに提供します。 IMsoDocExporterSite インターフェイスは、拡張カラー サポートを有効にするメソッドを公開します。

void SetDocExporterSite(
    IMsoDocExporterSite* pDocExporterSite
);

pDocExporterSite パラメーターは、IMsoDocExporterSite インターフェイスへのインターフェイス ポインターを指定します。

HrSetPageHeightForPagination

アプリケーションは HrSetPageHeightForPagination メソッドを呼び出して、ページの高さをポイント単位で指定できます。

HRESULT HrSetPageHeightForPagination(
    float dytfPageHeight
);

一部のアプリケーションでは、ユーザーのドキュメントが未承認の形式で保持されます。 このような場合、アドインは HrSetPageHeightForPagination の呼び出しでアプリケーションによって指定されたページの高さを使用してドキュメントを改ページします。 dytfPageHeight パラメーターは、ページの高さをポイント単位で指定します。

ページの高さ情報を指定した後、アプリケーションは 、HrAddPageFromEmf の呼び出しで、ドキュメント全体のアドインを単一のメモリ内 EMF ファイルとして渡します。 その後、アドインはページの高さと EMF ファイルを使用してドキュメントを改ページします。

アドインは、 後続の HrGetPageBreaks メソッドの呼び出しで改ページ情報をアプリケーションに返します。

HrGetPageBreaks

アプリケーションは HrGetPageBreaks メソッドを呼び出して、アドインによってページ分割されたドキュメントの改ページの数と場所を取得できます。

HRESULT HrGetPageBreaks(
    float* rgdytfPageBreaks,
    int* pcchPageBreaks,
    BOOL* pfCanTrustLastBreakIsEndOfDocument
);

アドインは、 HrSetPageHeightForPagination メソッドで指定されたページの高さを使用してドキュメントを改ページ処理した後、アプリケーションが HrGetPageBreaks メソッドに対して行う後続の呼び出しで改ページ情報を返します。

rgdytfPageBreaks パラメーターは、ページ区切りの位置をポイント単位で指定する浮動小数点値の配列へのポインターです。 配列の最初の要素 (インデックス 0) は最初の改ページの場所、2 番目の要素は 2 番目の改ページの場所などです。 そのため、これらの要素の値は連続的に増加しています。

pcchPageBreaks パラメーターは、ドキュメント内の改ページ数を指定する整数値へのポインターです。

pfCanTrustLastBreakIsEndOfDocument パラメーターは、最後の改ページの場所がドキュメントの末尾か、ドキュメントの最後のページの先頭かを指定します。 true 値は、最後の改ページがドキュメントの末尾であることを示します。

アプリケーションは HrGetPageBreak 2 回呼び出して改ページ情報を取得します。 最初の呼び出しでは、アプリケーションは HrGetPageBreaks を呼び出して改ページ数を取得します。

HrGetPageBreaks(NULL, &nPageBreaks, NULL);

次に、アプリケーションは HrGetPageBreaks を 2 回目に呼び出して、実際の場所を取得します。 2 番目の呼び出しでは、アプリケーションは、改ページ位置の配列を保持するのに十分なサイズのバッファーを渡します。

HrGetPageBreaks(rgPageBreaks, &nPageBreaks, fCanStopAtLastPageBreak);

アドインから改ページ情報を受け取った後、アプリケーションは固定形式のエクスポート プロセスを再開し、 HrCreateDoc メソッドを呼び出してから、改ページ情報によって指定された各ページに対して HrAddPageFromEmf を呼び出します。

HrAddOutlineNode

パブリッシャーは HrAddOutlineNode メソッドを呼び出して、エクスポートされたドキュメントのユーザーが移動可能なアウトライン内のノードを記述する構造体をアドインに渡します。

HRESULT HrAddOutlineNode(
    int idNodeParent 
    const MSODOCEXOUTLINENODE* pNode
);    

固定形式のエクスポート コードでは、 HrAddOutlineNode メソッドによって渡された情報を使用して、エクスポート ドキュメントのユーザーが移動可能なアウトラインを作成できます。 ユーザーの観点から見ると、アウトライン内の各ノードは、ドキュメント内の特定の場所にマップされるタイトル テキストによって表されます。

HrAddOutlineNode を呼び出すたびに、このアウトライン内の 1 つのノードの情報が指定されます。 各ノードは、アウトライン内で一意のノード ID によって識別されます。 ID 0 は、ルート ノード用に予約されています。 アウトラインは階層構造であり、つまり、各ノードに 1 つの親ノードと 0 個以上の子ノードがあるツリー構造があります。

HrAddOutlineNode の最初のパラメーターは、渡されるノードの親であるノードの ID を提供します。

パブリッシャーは、親ノードの子のいずれかの メソッドを呼び出す前に、親ノードに対して 常に HrAddOutlineNode を呼び出します。 つまり、エクスポート コードは、 idNodeParent パラメーターによって識別されるノードのノード情報を既に持っていることが保証されます。 唯一の例外は、ルート ノードを指定する HrAddOutlineNode の最初の呼び出しです。 この呼び出しの 場合、idNodeParent の値は 0 です

エクスポート コードが各ノードに必要とする追加情報は、pNode パラメーターによって指される MSODOCEXOUTLINENODE 構造体の HrAddOutlineNode によって渡されます。

typedef struct _MsoDocexOutlineNode
{
    int idNode {};
    WCHAR rgwchNodeText[cwchMaxNodeText];
    int iDestPage {};
    float dytfvDestPage {};
    float dxtfvDestOffset {};
    float dytfvDestOffset {};
} MSODOCEXOUTLINENODE;

MSODOCEXOUTLINENODE のメンバーについては、次のように説明します。

  • idNode ノードの ID。 値 -1 は、このノードがアウトラインに子ノードを含めることができないことを示します。 それ以外の場合、このメンバーにはドキュメント全体で一意の値があります。

  • rgwchNodeText 各ノードのタイトル テキストを表す Unicode 文字列。 このテキストは、アウトライン全体で一意である必要はありません。

  • iDestPage ドキュメント内の宛先の場所を含むページのページ番号。

  • dytfvDestPage 変換先ページの高さをポイント単位で指定します。 dytfvDestOffset メンバーによって指定されたオフセットは、ページの左上隅を基準にしています。 ただし、一部の固定形式の型では、ページの左下隅を基準とした座標系が使用されます。 これらの種類のドキュメントでは、オフセットを変換するためにページの高さが必要です。

  • dxtfvDestOffset コピー先ページの移動先の位置の水平方向のオフセット。

  • dytfvDestOffset コピー先ページの移動先の位置の垂直方向のオフセット。

HrAddDocumentMetadataString

Publisher は HrAddDocumentMetadataString メソッドを呼び出して、Unicode 文字列の形式でドキュメント メタデータを指定します。

HRESULT HrAddDocumentMetadataString(
    MSODOCEXMETADATA metadataType, 
    const WCHAR* pwchValue
);

metadatatype パラメーターは、文字列で表されるメタデータの種類を指定します。 metadatatype パラメーターは、MSODOCEXMETADATA 列挙型の次のいずれかの値である必要があります。

表 8. MSODOCEXMETADATA の列挙値

説明

msodocexMetadataTitle

ドキュメントのタイトル。

msodocexMetadataAuthor

ドキュメントの作成者

msodocexMetadataSubject

ドキュメントの主題を表す文字列 (ビジネスや科学など)。

msodocexMetadataKeywords

ドキュメント コンテンツに関連するキーワード。

msodocexMetadataCreator

ドキュメントの作成者。作成者とは異なる場合があります。

msodocexMetadataProducer

ドキュメントのプロデューサー。作成者または作成者とは異なる場合があります。

msodocexMetadataCategory

ドキュメントの種類を表す文字列 (メモ、記事、書籍など)。

msodocexMetadataStatus

ドキュメントの状態。 このフィールドには、文書がパブリケーション プロセス内のどこにあるかを反映できます (下書きや最終版など)。

msodocexMetadataComments

ドキュメントに関連するその他のコメント。

特定のドキュメントに対して、各メタデータ型に関連付けられている文字列は 1 つだけです。 そのため、たとえば、ドキュメントに複数のキーワードがある場合、それらは 1 つの連結文字列としてアドインに渡されます。

pwchValue パラメーターは、メタデータ自体を含む Unicode 文字列を指定します。

アドインがエクスポートされたドキュメントにテキスト文字列メタデータを組み込む方法は、エクスポート コードの実装の詳細と、エクスポートされたドキュメントで使用される固定形式の種類によって異なります。

HrAddDocumentMetadataDate

パブリッシャーは HrAddDocumentMetadataDate メソッドを呼び出して、FILETIME 構造体の形式でドキュメント メタデータを指定します。

HRESULT HrAddDocumentMetadataDate(
    MSODOCEXMETADATA metadataType, 
    const FILETIME* pftLocalTime
);

metadatatype パラメーターは、FILETIME 構造体で表されるメタデータの種類を指定します。 metadatatype パラメーターは、MSODOCEXMETADATA 列挙型の次のいずれかの値である必要があります。

表 9. MSODOCEXMETADATA の列挙値

説明

msodocexMetadataCreationDate

ドキュメントの作成日。

msodocexMetadataModDate

ドキュメントの最終更新日。

pftLocalTime パラメーターは、メタデータの日付と時刻の情報を含む FILETIME 構造体へのポインターを指定します。 次のコード スニペットは、構造体からこの情報を抽出する方法を示しています。

SYSTEMTIME st = { 0 };
WCHAR s[100];
FileTimeToSystemTime(pfiletime, &st);
swprintf(s, 99, L" %04d-%02d-%02dT%02d:%02d:%02dZ", st.wYear % 10000, 
    st.wMonth % 100, st.wDay % 100, st.wHour % 100, st.wMinute % 100, 
    st.wSecond % 100);

アドインがエクスポートされたドキュメントに日付と時刻のメタデータを組み込む方法は、エクスポート コードの実装の詳細と、エクスポートされたドキュメントで使用される固定形式の種類によって異なります。

HrFinalize

パブリッシャーは、ドキュメント エクスポート プロセスの最後に HrFinalize メソッドを呼び出します。

HRESULT HrFinalize();

固定形式のエクスポートを実装するコードでは、 HrFinalize を使用して、データ バッファーのフラッシュ、ディスクへの残りのデータの書き込み、メモリやその他のリソースの解放などのタスクを実行する必要があります。

まとめ

IMsoDocExporter インターフェイスを実装することで、Office アプリケーションの固定形式のエクスポート機能を拡張できます。 このインターフェイスのメソッドは、Office アプリケーションがドキュメント内のビジュアル コンテンツとセマンティック情報をアドインと通信してエクスポートするためのチャネルを提供します。 ドキュメントのビジュアル コンテンツは、1 つ以上のメモリ内拡張メタファイルとしてアドインに提供されます。 セマンティック情報は、この EMF 内で特別に書式設定されたコメント レコードとして提供されます。 インターフェイスのその他のメソッドを使用すると、Office アプリケーションはドキュメントに関するメタデータと構造情報を通信できます。

その他のリソース

詳細については、次のリソースを参照してください。