Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Résumé: Créez un complément COM pour Office 2024, Office LTSC 2024 et Microsoft 365 version 2408 et les applications ultérieures avec votre propre logique d’exportation au format PDF. La technique décrite nécessite une connaissance de C++ et DE COM.
S’applique à : Excel, OneNote, PowerPoint, Publisher, Visio et Word dans Office 2024, Office LTSC 2024, Microsoft 365 version 2408 et ultérieures.
Présentation de la fonctionnalité d’exportation Fixed-Format Office (2024)
Cet article explique comment les développeurs de logiciels tiers peuvent se connecter à la fonctionnalité d’exportation au format fixe disponible dans les applications Office 2024, Office LTSC 2024, Microsoft 365 version 2408 et ultérieures afin qu’ils puissent ajouter leur propre exportateur.
Les applications incluent des exportateurs intégrés pour XPS (Microsoft XML Paper Specification) et PDF (Portable Document Format). Les formats de fichiers fixes exposent le contenu d’un document sous une forme paginée indépendante de l’application et de la plateforme.
Les développeurs de logiciels peuvent ajouter leur propre exportateur en écrivant un complément Office qui implémente l’interface COM IMsoDocExporter . Cet article décrit IMsoDocExporter et son interaction avec une application Microsoft 365 hébergeant, comme Word.
L’exportation au format fixe est disponible depuis la version d’Office 2007, et cet article contient des informations sur les nouvelles fonctionnalités des versions Office 2024, Office LTSC 2024 et Microsoft 365 Version 2408.
Important |
---|
La fonctionnalité d’exportation au format fixe est disponible dans toutes les applications répertoriées dans la section s’applique à. Toutefois, la discussion ci-dessous utilise Publisher comme exemple d’application, sauf dans les cas où une explication est plus pertinente pour une autre application. |
Initialisation de Add-Ins
Pour que l’utilisateur accède à la fonctionnalité de complément, le complément doit ajouter un nouvel élément de menu ou un nouveau bouton de barre d’outils à l’application. Lorsque l’utilisateur sélectionne cet élément de menu ou ce bouton, le complément doit utiliser le modèle objet Microsoft Office pour obtenir un pointeur vers le document actif. Il doit ensuite appeler la méthode ExportAsFixedFormat du document actif avec un pointeur d’interface IUnknown qui prend en charge l’interface IMsoDocExporter via un appel à la méthode QueryInterface . Le paramètre de modèle objet pour le pointeur d’interface est un VARIANT avec VT_UNKNOWN type.
Remarque |
---|
Pour OneNote, le complément appelle la méthode Publish avec un paramètre de chaîne qui est l’ID de classe de l’implémentation du complément de l’interface IMsoDocExporter . OneNote appelle ensuite CoCreateInstance avec l’ID de classe pour obtenir un pointeur d’interface IUnknown à partir de la fabrique de classes du complément. |
Une fois que Publisher a un pointeur vers l’interface IMsoDocExporter , il rappelle le complément via les méthodes exposées par IMsoDocExporter. Par le biais de ces rappels, Word fournit au complément le contenu du document et d’autres informations sur le document.
Une excellente source d’informations sur la création de compléments COM pour les applications Microsoft Office est l’article codeproject.com Création d’un complément COM Office2K avec VC++/ATL.
IMsoDocExporter
L’interface IMsoDocExporter expose les méthodes suivantes.
Tableau 1. Méthodes exposées par l’interface IMsoDocExporter
Méthode |
Description |
---|---|
HrCreateDoc |
Appelé au début du processus d’exportation au format fixe. |
HrAddPageFromEmf |
Appelé pour transmettre au complément un métafichier amélioré (EMF) qui représente une vue rendue du contenu à exporter. |
HrAddDocumentMetadataString |
Appelé pour spécifier les métadonnées de format chaîne pour le document. |
HrAddDocumentMetadataDate |
Appelé pour spécifier les métadonnées de format date pour le document. |
HrSetDefaultLcid |
Appelé pour spécifier l’ID de paramètres régionaux par défaut (LCID) pour le contenu à exporter. |
HrAddOutlineNode |
Appelé pour spécifier les informations de plan de document navigable par l’utilisateur. |
HrGetPageBreaks |
Appelé pour obtenir des informations de pagination à partir du complément. |
HrSetPageHeightForPagination |
Appelé pour spécifier la hauteur de la page pour permettre au complément de paginer le document. |
HrFinalize |
Appelé à la fin du processus d’exportation au format fixe. Permet au complément d’effectuer tout traitement final. |
HrBeginStructNode |
Appelé pour transmettre au complément la structure de départ d’un nœud de structure de document qui s’étend sur plusieurs pages. |
HrEndStructNode |
Appelé pour transmettre au complément la structure de fin d’un nœud de structure de document qui s’étend sur plusieurs pages. |
EnableCancel |
Appelé pour passer un pointeur au complément à une interface IDocExCancel . |
GetOutputOption |
Appelé pour récupérer les options de sortie au format fixe. |
SetOutputOption |
Appelé par Office pour définir les options de sortie au format fixe. |
SetDocExporterSite |
Appelé pour fournir au complément un pointeur vers une interface IMsoDocExporterSite pour une prise en charge étendue des couleurs. |
En outre, IMsoDocExporter expose également les méthodes suivantes héritées de l’interface IUnknown .
Tableau 2. Méthodes héritées de l’interface IUnknown
Méthode |
Description |
---|---|
AddRef |
Incrémente le décompte de références. |
QueryInterface |
Retourne des pointeurs vers des interfaces prises en charge. L’implémentation de QueryInterface du complément doit prendre en charge le renvoi d’un pointeur d’interface IMsoDocExporter à partir de IID_IMsoPdfWriter. |
Version |
Décrémente le décompte de références. |
Pour plus d’informations sur l’implémentation des méthodes d’interface IUnknown , consultez IUnknown (COM).
Flux d’appels
Le diagramme suivant montre la séquence dans laquelle Publisher appelle les méthodes exposées dans IMsoDocExporter. Toutes les méthodes ne sont pas utilisées par chaque application Microsoft Office et toutes les méthodes ne sont pas utilisées pour chaque document exporté.
Figure 1. Appel de méthodes à partir de l’interface IMsoDocExporter
Les sections suivantes décrivent plus en détail les méthodes exposées par l’interface IMsoDocExporter . Les méthodes sont décrites dans l’ordre dans lequel elles seraient appelées par Publisher.
GetOutputOption et SetOutputOption
Publisher appelle les méthodes GetOutputOption et SetOutputOption pour récupérer et définir les options de sortie pour le processus d’exportation au format fixe.
void GetOutputOption(
MSODOCEXOPTION docexoption,
DWORD* pdwVal
);
void SetOutputOption(
MSODOCEXOPTION docexoption,
DWORD dwVal
);
Le paramètre docexoption spécifie l’option de sortie et le paramètre (p)dwVal spécifie la valeur de l’option.
Bien que l’exportateur intégré dans Office utilise GetOutputOption et SetOutputOption, un complément peut implémenter sa propre méthode d’obtention et de définition des options et sa propre expérience utilisateur pour les options.
Microsoft Office appelle GetOutputOption uniquement avec msodocexOptionTargetDPIColor pour Fixed-Format Add-Ins
Pour l’implémentation de l’exportation au format fixe dans Office, Publisher appelle la méthode GetOutputOption pour récupérer les options de sortie à afficher à l’utilisateur dans la boîte de dialogue Publier au format PDF ou XPS . Pour les compléments développés par des développeurs de logiciels tiers, Publisher appelle GetOutputOption avec uniquement la valeur msodocexOptionTargetDPIColor. Il s’agit de la seule valeur qu’un complément doit prendre en charge. Si l’implémentation du complément de GetOutputOption est appelée avec cette valeur, elle doit retourner les points par pouce (DPI) cibles pour la rastérisation d’effet 3D.
Microsoft Office Calls SetOutputOption pour les compléments Fixed-Format
Pour l’implémentation de l’exportation au format fixe dans Office et pour les implémentations de compléments, Publisher appelle SetOutputOption au début du processus d’exportation au format fixe. Dans l’implémentation dans Office, les valeurs de paramètre passées dans spécifient les options de sortie au format fixe. Toutefois, si le complément implémente son propre ensemble d’options, le complément peut ignorer les options qui lui sont transmises par Publisher.
EnableCancel
Publisher appelle la méthode EnableCancel pour passer au complément un pointeur vers une interface IMsoDocExCancel . Le complément peut utiliser cette interface pour demander si un utilisateur choisit d’annuler une opération d’exportation de document longue.
void EnableCancel(
IMsoDocExCancel* pdec
);
HrBeginStructNode
Publisher appelle la méthode HrBeginStructNode pour spécifier le début d’un nœud de structure de document pour le contenu qui englobe plusieurs pages complètes du document. Les nœuds de structure de document pour les éléments du document qui résident entièrement dans une page (par exemple, les paragraphes) sont incorporés par Publisher dans le métafichier amélioré (EMF) lui-même à l’aide des structures DocExComment_BeginStructNode et DocExComment_EndStructNode . Pour plus d’informations sur les nœuds de structure de document, consultez les sections HrAddPageFromEmf et DocExComment_BeginStructNode dans cet article.
HRESULT HrBeginStructNode(
int idNodeParent,
int iSortOrder,
const MSODOCEXSTRUCTNODE* pnode,
BOOL fNoEndNode
);
Le paramètre idNodeParent spécifie l’ID du nœud qui est le parent du nœud passé au complément. Si ce paramètre a la valeur 0, le nœud se trouve sous la racine de l’arborescence de structure de document. Plusieurs nœuds frères peuvent se trouver sous la racine. Si ce paramètre a la valeur -1, le nœud se trouve sous le nœud actuellement ouvert, c’est-à-dire sous le dernier nœud spécifié par HrBeginStructNode qui n’a pas été fermé par un appel à HrEndStructNode.
Le paramètre iSortOrder spécifie l’ordre de tri du nœud de structure parmi ses frères. Deux nœuds ne peuvent pas avoir le même ordre de tri. Toutefois, l’ensemble d’entiers qui constituent l’ordre de tri n’a pas besoin d’être contigu. La valeur -1 indique que l’ordre de tri frère est le même dans lequel les nœuds apparaissent dans les commentaires EMF.
Le paramètre pnode pointe vers une structure MSODOCEXSTRUCTNODE , qui a la déclaration suivante :
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;
Le membre idNode spécifie l’ID du nœud passé dans l’appel à HrBeginStructNode. Il se peut que ce membre n’ait pas la valeur 0. La valeur -1 indique que les nœuds enfants n’utilisent pas le paramètre idNodeParent pour spécifier ce nœud comme parent. Au lieu de cela, ce nœud peut être un parent uniquement en englobant les nœuds enfants dans l’EMF. Plusieurs nœuds peuvent avoir l’ID -1. Si l’ID n’est pas -1, la valeur est unique dans le document.
L’union incorporée à la fin du MSODOCEXSTRUCTNODE est interprétée différemment selon le type de nœud :
- iHeadingLevel est le niveau de titre d’un msodocexStructTypeHeading.
- idPara est l’ID de paragraphe pour un P, TOCI ou ListBody.
- idDropCap est l’ID d’un msodocexStructTypeDropCap.
- iPage est le numéro de page d’une msodocexStructTypePage.
- bt est le type de saut de ligne pour un msodocexStructTypeTextLine.
- iListLevel est le niveau de liste pour un msodocexStructTypeList ou msodocexStructTypeListItem.
- listType est le type de liste d’un msodocexStructTypeListItem.
- idAtn est l’ID d’un msodocexStructTypeAnnotationBegin ou msodocexStructTypeAnnotationEnd.
- cpLim est utilisé pour déterminer l’ordre d’imbrication des tables dans les tables pour un msodocexStructTypeTable, msodocexStructTypeTOC ou msodocexStructTypeListBody.
- shapeProperty concerne un msodocexStructTypeFigure où le contenu est une forme, une zone de texte ou une cellule de tableau et contient des champs de bits de l’énumération MSODOCEXSHAPEPROPERTY.
- tableAttr est les attributs de cellule de table pour un msodocexStructTypeTH ou msodocexStructTypeTD.
- cpNoteRef permet de lier msodocexStructTypeIntLinkNoteRef à msodocexStructType Footnote/msodocexStructTypeEndnote. Cela est expliqué plus en détail plus loin dans cette section.
- idTableHeader est l’ID unique d’un msodocexStructTypeTH ou msodocexStructTypeTD.
- cpXchAtnMainDod est utilisé pour lier msodocexStructTypeCommentAnchor à msodocexStructTypeAnnot. Cela est expliqué plus en détail plus loin dans cette section.
- iTargetParentId est l’ID du nœud dans lequel effectuer le réparent d’un msodocexStructTypeDiagram.
- wzMathMlText est une chaîne MathML pour msodocexStructTypeEquation.
- pListAttr est un attribut de liste pour msodocexStructTypeList.
Remarque : cpNoteRef, cpXchAtnMainDod, wzMathMlText et pListAttr sont disponibles quand Word. Document.ExportAsFixedFormat3 est appelé avec ImproveExportTagging = true. La version minimale requise est Microsoft 365 Beta Channel 16.0.18720.20000.
Tableau 3. Valeurs énumérées de MSODOCEXLINEBREAKTYPE
Valeur |
Description |
---|---|
msodocexLineBreakTypeNormal |
Saut de ligne normal. |
msodocexLineBreakTypeManual |
Saut de ligne manuel. |
msodocexLineBreakTypeEOP |
Fin du paragraphe. |
Tableau 4. Valeurs énumérées de MSODOCEXLISTTYPE
Valeur |
Description |
---|---|
msodocexListTypeNone |
Pas de puces ou de numérotation. |
msodocexListTypeBulletDisc |
Puces en forme de disque. |
msodocexListTypeBulletCircle |
Puces en forme de cercle. |
msodocexListTypeBulletSquare |
Balles de forme carrée. |
msodocexListTypeBulletDecimal |
Numérotation décimale. |
msodocexListTypeUpperRoman |
Numérotation en chiffres romains majuscules. |
msodocexListTypeLowerRoman |
Numérotation numérique romaine en minuscules. |
msodocexListTypeUpperAlpha |
Numérotation alphabétique majuscule. |
msodocexListTypeLowerAlpha |
Numérotation alphabétique minuscule. |
Tableau 5. Valeurs énumérées des champs de bits MSODOCEXSHAPEPROPERTY
Valeur |
Valeur numérique |
Description |
---|---|---|
msodocexShape |
0x00000001 |
L’objet est une forme ou une zone de texte. |
msodocexShapeText |
0x00000002 |
L’objet a du texte non-espace blanc. |
msodocexShapePath |
0x00000004 |
L’objet a un remplissage et/ou un contour. |
msodocexShapeAltText |
0x00000008 |
L’objet a un texte de remplacement. |
msodocexShapeEquation |
0x00000010 |
L’objet contient un texte qui contient une équation. |
msodocexShapeTabelCell |
0x00000020 |
L’objet est une cellule d’un tableau. |
MsoDocexTableAttr
La structure MsoDocexTableAttr s’adapte à 32 bits et inclut les informations d’étendue de ligne et de colonne et d’étendue d’en-tête pour une cellule de tableau.
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;
};
Les membres de la structure MsoDocexTableAttr sont les suivants :
MaxSpanBits Spécifie le nombre de bits disponibles pour les valeurs rowSpan et colSpan, soit 15.
MaxSpanValue Spécifie la valeur maximale qui peut être spécifiée pour les valeurs rowSpan et colSpan.
rowSpan Spécifie le nombre de lignes qu’une cellule de tableau couvre.
fRowScope Spécifie si l’en-tête est Row/Both ou Column.
colSpan Spécifie le nombre de colonnes sur lesquelles s’étend une cellule de tableau.
fColScope Spécifie si l’en-tête est Column/Both ou Row.
MsoDocexListAttr
La structure MsoDocexListAttr inclut des informations pour une liste.
struct MsoDocexListAttr
{
int iListLevel;
long cpLim;
};
Les membres de la structure MsoDocexListAttr sont les suivants :
iListLevel Spécifie l’ordre d’imbrication de la liste.
cpLim Spécifie la position dans le document où la liste se termine.
Conseils de post-traitement
Dans certains cas, les nœuds doivent être post-traités pour obtenir les résultats souhaités.
Post-traitement des notes de bas de page/notes de fin
Pendant l’exportation, les liens de note de bas de page/note de fin sont étiquetés comme msodocexStructTypeIntLinkNoteRef. Les corps de note de bas de page/de note de fin seront étiquetés respectivement comme msodocexStructType Footnote et msodocexStructTypeEndnote, et ils seront toujours des nœuds de niveau supérieur sous le nœud msodocexStructTypeDocument. Le nœud msodocexStructTypeIntLinkNoteRef et le nœud msodocexStructType Footnote/msodocexStructTypeEndnote correspondant auront la même valeur cpNoteRef. Cela peut être utilisé pour déplacer les nœuds de note de bas de page/note de fin sous leurs nœuds de liaison correspondants afin de maintenir un ordre de lecture logique.
Post-traitement des commentaires
Pendant l’exportation, chaque ancre de commentaire est marquée comme msodocexStructTypeCommentAnchor. Les corps de commentaires seront marqués comme msodocexStructTypeAnnot et seront toujours des nœuds de niveau supérieur sous le nœud msodocexStructTypeDocument. Le nœud msodocexStructTypeCommentAnchor et le nœud msodocexStructTypeAnnot correspondant auront la même valeur cpXchAtnMainDod. Cela peut être utilisé pour déplacer les nœuds d’annotation sous leurs nœuds d’ancre de commentaire correspondants afin de maintenir un ordre de lecture logique.
Post-traitement des tables de disposition
Lors de l’exportation, si nous détectons qu’une table est une table de disposition, nous allons la baliser comme msodocexStructTypeTable, mais nous allons définir la valeur cpLim du nœud sur -2 (notre valeur constante pour indiquer qu’il s’agit d’une table de disposition). Cette valeur peut ensuite être utilisée pour déterminer si les nœuds de table doivent être étiquetés à nouveau en tant que nœuds de paragraphe.
Nœuds couvrant le post-traitement des pages (paragraphes, listes, tableaux)
Pour les paragraphes, les valeurs idPara de deux nœuds para peuvent être vérifiées pour déterminer si elles représentent le même paragraphe sur les pages. Pour les tables, les valeurs cpLim peuvent être vérifiées pour voir si elles sont identiques.
Pour les listes, nous avons ajouté une nouvelle classe à MsoDocexStructNode, MsoDocexListAttr, qui contient le cpLim d’une liste. Cela peut être utilisé pour case activée si deux nœuds de liste ont le même cpLim, ce qui signifie qu’ils représentent tous les deux la même liste dans le document.
Pour les nœuds de structure de table, l’union est interprétée comme un ordre des extrémités de table par rapport à d’autres tables à l’aide de cpLim, qui peut être utilisé pour déterminer l’ordre d’imbrication des tables dans les tables.
Dans le contexte de la DocExComment_BeginStructNode, le complément peut ignorer le membre pwchActualText de cette union.
Le membre pwchAltText spécifie un texte de remplacement pour le nœud de structure.
Le paramètre fNoEndNode de HrBeginStructNode spécifie si Publisher appelle la méthode HrEndStructNode pour marquer la fin du nœud de structure. Si fNoEndNode a la valeur false, Publisher appelle HrEndStructNode pour fermer le contenu limité par le nœud. Si ce paramètre a une valeur true , le nœud ne lie aucun contenu.
Le paramètre fNoEndNode affecte l’interprétation de la valeur d’ID parent des nœuds suivants. Si fNoEndNode a la valeur false, les nœuds insérés entre cet appel à HrBeginStructNode et l’appel ultérieur à HrEndStructNode, et qui ont l’ID parent -1, sont des enfants de ce nœud. Toutefois, si fNoEndNode a la valeur true, les nœuds insérés après cet appel à HrBeginStructNode, et qui ont un ID parent de -1, ne sont pas des enfants de ce nœud, mais sont des enfants du nœud le plus récent spécifié qui a fNoEndNode égal à false.
Les nœuds de structure de document peuvent être imbriqués à une profondeur arbitraire.
Les nœuds spécifiés par HrBeginStructNode et ceux spécifiés par DocExComment_BeginStructNode partagent le même espace d’ID et existent dans la même arborescence de structure de document. HrBeginStructNode et DocExComment_BeginStructNode sont deux autres façons d’ajouter des nœuds à cette arborescence. Par exemple, si le nœud le plus récemment ouvert a été ouvert par HrBeginStructNode et que le nœud suivant rencontré provient d’un DocExComment_BeginStructNode EMFcommentrecord avec idNodeParent égal à -1, cela signifie que le nœud de HrBeginStructNode est le parent du nœud de l’enregistrement DocExComment_BeginStructNode .
HrEndStructNode
Publisher appelle la méthode HrEndStructNode pour spécifier la fin d’un nœud de structure de document pour le contenu qui englobe plusieurs pages du document. Le nœud de structure terminé par le HrEndStructNode a été démarré précédemment par un appel à la méthode HrBeginStructNode . Pour plus d’informations, consultez HrBeginStructNode dans cet article.
HRESULT HrEndStructNode();
HrCreateDoc
Publisher appelle la méthode HrCreateDoc pour spécifier la création d’un document au format fixe vide.
HRESULT HrCreateDoc(
const WCHAR* wzDocExFile
);
Publisher appelle la méthode HrCreateDoc au début du processus d’exportation au format fixe pour spécifier la création d’un document au format fixe vide. Le paramètre wzDocExFile spécifie un nom pour le fichier de sortie dans lequel écrire le document au format fixe.
Pour une implémentation de complément, Publisher appelle HrCreateDoc avec le nom de fichier fourni par le complément dans l’appel à la méthode ExportToFixedFormat dans le modèle objet Microsoft Office. Toutefois, étant donné que les compléments fournissent généralement une interface utilisateur de configuration pour permettre à l’utilisateur de spécifier un nom de fichier de sortie, le complément peut ignorer ce nom de fichier pendant le processus d’exportation.
Pour les applications Microsoft Office qui nécessitent le complément pour paginer le document, HrCreateDoc est appelé deux fois, une fois au début de la séquence d’appel de pagination et une fois que le complément a paginé le document. Pour plus d’informations, consultez les descriptions de la méthode HrSetPageHeightForPagination et de la méthode HrGetPageBreaks.
HrSetDefaultLcid
Publisher appelle la méthode HrSetDefaultLcid pour spécifier l’ID de paramètres régionaux par défaut (LCID) pour le contenu à exporter.
HRESULT HrSetDefaultLcid(
DWORD lcid
);
Pour obtenir la liste des LCID valides, consultez Liste des valeurs d’ID de paramètres régionaux (LCID) attribuées par Microsoft.
HrAddPageFromEmf
Publisher appelle la méthode HrAddPageFromEmf pour transmettre au complément un handle à un objet EMF en mémoire qui représente le contenu du document à exporter.
HRESULT HrAddPageFromEmf(
HENHMETAFILE hemf
);
Le module EMF transmis par Microsoft Office au complément est la source principale du contenu exporté par le complément sous forme de fichier au format fixe. Microsoft Office appelle HrAddPageFromEmf une fois pour chaque page de contenu dans le document source de l’application.
Les commentaires EMF transmettent des informations sémantiques
Un EMF est une séquence de commandes de dessin (commandes GDI et GDI+) qui spécifient comment afficher les éléments visuels du document. Le champ EMF ne contient aucune information au-delà de ces commandes (par exemple, « dessiner une image ici » ou « dessiner une ligne là-bas »). En particulier, les emf classiques ne prennent pas en charge les aspects sémantiques du document, tels que les liens hypertexte, les informations de paramètres régionaux et les informations d’accessibilité. Pour conserver les informations sémantiques dans le document exporté, Publisher injecte des enregistrements spéciaux dans l’EMF. Ces enregistrements contiennent les informations sémantiques.
Les enregistrements qui représentent les informations sémantiques sont implémentés en tant que commentaires EMF au format spécial. Le format EMF autorise les types d’enregistrements de commentaire qui sont ignorés par le moteur de rendu pour Graphics Device Interface (GDI), mais qui peuvent contenir des informations arbitraires.
Prenons l’exemple d’un document qui contient un texte de remplacement. (Le texte de remplacement est utilisé par les lecteurs de documents pour décrire des images pour les utilisateurs malvoyants.) Publisher injecte des commentaires EMF avant et après le rendu de l’image, et ces commentaires EMF spécifient le texte de remplacement de l’image. Le complément interprète les commentaires et écrit les informations dans le fichier d’exportation au format fixe.
Le tableau suivant présente les types d’enregistrements sémantiques pris en charge par la fonctionnalité d’exportation au format fixe de Microsoft Office. Ces types sont énumérés par l’énumération MSODOCEXSTRUCTTYPE . Chaque type correspond à un type de structure qui décrit le format de l’enregistrement.
Tableau 6. Types d’enregistrements sémantiques pris en charge par l’exportation au format fixe
Valeur du commentaire |
Structure Type |
---|---|
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)
La structure DocExComment_ExternalHyperlink(Rctfv) décrit un lien hypertexte vers l’extérieur du document, par exemple vers un site Web sur Internet.
struct DocExComment_ExternalHyperlink
{
DWORD ident {};
DWORD iComment {};
union
{
RECT rcdvRegion;
struct
{
float xLeft;
float yTop;
float dxWidth;
float dyHeight;
} rctfvRegion;
};
WCHAR wzLink[MAX_PATH];
};
Les membres de la structure DocExComment_ExternalHyperlink(Rctfv) sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentExternalHyperlink ou msodocexcommentExternalHyperlinkRctfv.
rcdvRegion et rctfvRegion Union qui spécifie la région de la page qui est l’emplacement source du lien hypertexte. La région peut être représentée sous la forme d’un type RECT (rcdvRegion) qui utilise des pixels d’appareil comme unité de mesure, ou en tant que structure qui contient des coordonnées à virgule flottante (rctfvRegion), auquel cas l’unité de mesure est des points.
Si le membre iComment est égal à msodocexcommentExternalHyperlink, le complément doit utiliser rcdvRegion. Dans ce cas, le complément doit appliquer la matrice de transformation EMF actuelle à rcdvRegion pour la convertir en espace de page.
Si le membre iComment est égal à msodocexcommentExternalHyperlinkRctfv, le complément doit utiliser rctfvRegion. Dans ce cas, rctfvRegion étant déjà dans l’espace de page, aucune transformation n’est nécessaire.
wzLink[MAX_PATH] Spécifie l’URL de destination de ce lien hypertexte.
DocExComment_InternalHyperlink(Rctfv)
La structure DocExComment_InternalHyperlink(Rctfv) décrit un lien hypertexte qui établit un lien vers un emplacement dans le document. Notez que, bien que Publisher passe un EMF distinct pour chaque page du document, la destination du lien hypertexte spécifié par DocExComment_InternalHyperlink(Rctfv) peut se trouver sur une page différente de l’emplacement source.
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 {};
};
Les membres de la structure DocExComment_InternalHyperlink(Rctfv) sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentInternalHyperlink ou msodocexcommentInternalHyperlinkRctfv.
rcdvRegion et rctfvRegion Comme avec la structure DocExComment_ExternalHyperlink , ce membre est une union qui spécifie la région de la page qui est l’emplacement source du lien hypertexte. La région peut être représentée sous la forme d’un type RECT (rcdvRegion) qui utilise des pixels d’appareil comme unité de mesure, ou en tant que structure qui contient des coordonnées à virgule flottante (rctfvRegion), auquel cas l’unité de mesure est des points.
Si le membre iComment est égal à msodocexcommentInternalHyperlink, le complément doit utiliser rcdvRegion. Dans ce cas, le complément doit appliquer la matrice de transformation EMF actuelle à rcdvRegion pour la convertir en espace de page.
Si le membre iComment est égal à msodocexcommentInternalHyperlinkRctfv, le complément doit utiliser rctfvRegion. Dans ce cas, rctfvRegion étant déjà dans l’espace de page, aucune transformation n’est nécessaire.
iTargetPage Spécifie le numéro de page de la page de destination dans le document.
xtfvTarget Spécifie la coordonnée x de l’emplacement cible sur la page de destination. L’unité de mesure de cette valeur est de points.
ytfvTarget Spécifie la coordonnée y de l’emplacement cible sur la page de destination. L’unité de mesure de cette valeur est de points.
dytfTargetPage Hauteur de la page de destination en points. Le décalage spécifié par le membre ytfvTarget est relatif au coin supérieur gauche de la page. Toutefois, certains types de format fixe utilisent un système de coordonnées relatif au coin inférieur gauche de la page. Pour ces types de documents, la hauteur de page est requise pour convertir le décalage.
DocExComment_ColorInfo
La structure DocExComment_ColorInfo spécifie les informations d’état de couleur pour l’EMF. Pour plus d’informations sur cette structure, consultez la section Prise en charge étendue des couleurs.
struct DocExComment_ColorInfo
{
DWORD ident {};
DWORD iComment {};
COLORREF clr { 0 };
BOOL fForeColor {};
};
Les membres de la structure DocExComment_ColorInfo sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentColorInfo.
Clr Spécifie un ID de couleur qui représente un état de couleur actuel dans l’EMF.
fForeColor Spécifie si l’ID de couleur dans le membre clr représente une couleur de premier plan ou une couleur d’arrière-plan. Si ce membre a la valeur true, l’ID de couleur représente une couleur de premier plan. Si ce membre a la valeur false, l’ID de couleur représente une couleur d’arrière-plan.
DocExComment_ColorEnable
La structure DocExComment_ColorEnable spécifie si le mappage des couleurs est activé pour le contenu ultérieur dans le champ EMF. Pour plus d’informations sur cette structure, consultez la section Prise en charge étendue des couleurs.
struct DocExComment_ColorEnable
{
DWORD ident {};
DWORD iComment {};
BOOL fEnable {};
};
Les membres de la structure DocExComment_ColorEnable sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentColorMapEnable.
fEnable Spécifie si le mappage de couleurs est activé pour le contenu suivant. La valeur true indique que le mappage des couleurs est activé. La valeur false indique que le mappage des couleurs est désactivé.
DocExComment_BeginStructNode
La structure DocExComment_BeginStructNode marque le début d’un nœud de structure de document. Les nœuds de structure servent l’un des deux objectifs possibles :
Les nœuds de structure peuvent identifier le type de contenu qu’ils contiennent et spécifier la relation hiérarchique entre ce contenu et d’autres contenus dans le document.
Les nœuds de structure peuvent spécifier un texte de remplacement pour les éléments du document.
Si le membre fContentNode a une valeur true , la DocExComment_BeginStructNode est suivie plus loin dans le document par un DocExComment_EndStructNode. Le DocExComment_EndStructNode marque la fin du contenu qui est encapsulé par les informations contenues dans le DocExComment_BeginStructNode.
La collection de nœuds de structure dans le document forme une arborescence ; chaque nœud a un nœud parent et peut également avoir des nœuds frères. Les membres idNodeParent et iSortOrder décrivent la structure de cette arborescence. Notez qu’un nœud enfant peut ou non apparaître entre les structures DocExComment_BeginStructNode et DocExComment_EndStructNode du nœud parent dans l’EMF.
struct DocExComment_BeginStructNode
{
DWORD ident {};
DWORD iComment {};
int idNodeParent {};
int iSortOrder {};
MSODOCEXSTRUCTNODE desn;
BOOL fContentNode {};
int cwchAltText {};
};
Les membres de la structure DocExComment_BeginStructNode sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentBeginStructNode.
idNodeParent Spécifie l’ID du nœud parent. La valeur 0 spécifie le nœud racine. La valeur -1 spécifie le nœud de structure actuellement ouvert, c’est-à-dire le nœud de structure englobant .
iSortOrder Spécifie l’ordre de tri du nœud de structure parmi ses nœuds frères. L’ordre de tri permet au complément de classer correctement le contenu dans le document exporté.
Deux nœuds ne peuvent pas avoir le même ordre de tri. Toutefois, l’ensemble d’entiers qui constituent l’ordre de tri n’a pas besoin d’être contigu.
La valeur -1 indique que l’ordre frère est le même dans lequel les nœuds apparaissent dans les commentaires EMF. Notez que l’ordre dans lequel le contenu apparaît dans l’EMF n’est pas nécessairement l’ordre dans lequel le contenu est consommé par un utilisateur du document.
desn Spécifie une structure MSODOCEXSTRUCTTYPE , qui est définie plus haut dans le document.
Le membre idNode spécifie l’ID du nœud. Il se peut que ce membre n’ait pas la valeur 0. La valeur -1 indique que les nœuds enfants n’utilisent pas le membre idNodeParent pour spécifier ce nœud comme parent. Au lieu de cela, ce nœud peut être un parent uniquement en englobant les nœuds enfants dans l’EMF. Plusieurs nœuds peuvent avoir l’ID -1. Si l’ID n’est pas -1, la valeur est unique dans le document.
Le type de nœud spécifie le type de nœud de structure. Ce membre est égal à l’une des valeurs du type d’énumération MSODOCEXSTRUCTTYPE . Le tableau suivant répertorie des exemples de types de nœuds de structure de document.
Tableau 7. Types de nœuds de structure de document
Valeur de type |
Description |
---|---|
msodocexStructTypePara |
Bloc de texte dans un article. Son nœud parent doit être un article. |
msodocexStructTypeFigure |
Élément graphique (par exemple, une image ou une collection de formes) qui a une représentation textuelle. La représentation textuelle est le texte de remplacement utilisé pour lire ou rechercher le document. |
msodocexStructTypeArticle |
Groupe de nœuds formant un flux de texte unique qui doit être lu ou recherché sous la forme d’un bloc de contenu contigu. Certains documents ont un seul article et d’autres ont plusieurs articles. |
msodocexStructTypeHeading |
Titre dans le texte. |
msodocexStructTypeTable |
Bloc de texte formant un tableau. |
msodocexStructTypeTR |
Bloc de texte formant une seule ligne d’un tableau. |
msodocexStructTypeTD |
Bloc de texte formant une seule cellule dans une ligne de tableau. |
msodocexStructTypeTH |
Bloc de texte formant une cellule d’en-tête unique dans une ligne de tableau. |
msodocexStructTypeList |
Bloc de texte formant une liste. |
msodocexStructTypeListItem |
Bloc de texte formant un élément de liste. |
msodocexStructTypeListBody |
Bloc de texte formant le corps d’un élément de liste. |
msodocexStructTypeDocument |
Un document. |
msodocexStructTypePage |
Page du document. |
msodocexStructTypeTOC |
Table des matières. |
msodocexStructTypeTOCI |
Élément d’une table des matières. |
msodocexStructTypeExtLink |
Lien vers une ressource externe. |
msodocexStructTypeIntLink |
Lien vers une ressource interne. |
msodocexStructType Footnote |
Note de bas de page. |
msodocexStructTypeEndnote |
Note de fin. |
msodocexStructTypeTextbox |
Zone de texte. |
msodocexStructTypeHeader |
Bloc de texte formant un en-tête. |
msodocexStructTypeFooter |
Un pied de page. |
msodocexStructInlineShape |
Forme inline. |
msodocexStructAnnotation |
Annotation. |
msodocexStructTypeSpanBlock |
Bloc de texte. |
msodocexStructTypeWorkbook |
Classeur. |
msodocexStructTypeWorksheet |
Feuille de calcul. |
msodocexStructTypeMacrosheet |
Macrosheet. |
msodocexStructTypeChartsheet |
Feuille de graphique. |
msodocexStructTypeDialogsheet |
Feuille de dialogue. |
msodocexStructTypeSlide |
Diapositive. |
msodocexStructTypeChart |
Graphique |
msodocexStructTypeDiagram |
Diagramme SmartArt |
msodocexStructTypeBulletText |
Texte buller. |
msodocexStructTypeTextLine |
Ligne de texte. |
msodocexStructTypeDropCap |
Un bouchon de goutte. |
msodocexStructTypeSection |
Section. |
msodocexStructTypeAnnotationBegin |
Début d’une annotation. |
msodocexStructTypeAnnotationEnd |
Fin d’une annotation. |
msodocexStructTypeParaRTLAttr |
Bloc de texte dans un article avec une disposition de droite à gauche. |
msodocexStructTypeTableRTLAttr |
Bloc de texte formant un tableau avec une disposition de droite à gauche. |
msodocexStructTypeHeadingRTLAttr |
Titre dans le texte avec disposition de droite à gauche. |
msodocexStructTypeListItemRTLAttr |
Bloc de texte formant un élément de liste avec une disposition de droite à gauche. |
msodocexStructTypeParaUnannotatableAttr |
Bloc de texte dans un article qui n’est pas annotaable. |
msodocexStructTypeTHead |
Zone de ligne d’en-tête dans un tableau. |
msodocexStructTypeTBody |
Zone du corps d’une table, c’est-à-dire la partie entre le THead et le TFoot. |
msodocexStructTypeLabel |
Une étiquette. |
msodocexStructTypeEquation |
Équation. |
msodocexStructTypeIntLinkNoteRef |
Lien de marque de référence de note de bas de page ou de note de fin. |
msodocexStructTypeTFoot |
Zone de ligne de pied de page dans une table. |
msodocexStructTypeTitle |
Titre dans le texte. |
msodocexStructTypeBlockQuote |
Citation de paragraphe ou citation intense. |
msodocexStructTypeCommentAnchor |
Texte lié à un commentaire. |
msodocexStructTypeAnnot |
Contenu d’un seul commentaire. |
msodocexStructTypeQuote |
Guillemet inline. |
msodocexStructTypeCaption |
Une légende pour une équation/figure/table. |
Remarque : msodocexStructTypeTitle, msodocexStructTypeBlockQuote, msodocexStructTypeCommentAnchor, msodocexStructTypeAnnot, msodocexStructTypeQuote et msodocexStructTypeCaption sont disponibles quand Word. Document.ExportAsFixedFormat3 est appelé avec ImproveExportTagging = true. La version minimale requise est Microsoft 365 Beta Channel 16.0.18720.20000.
fContentNode Spécifie si une structure DocExComment_EndStructNode marque la fin de ce nœud de structure. Si fContentNode a la valeur true, une structure DocExComment_EndStructNode ferme le contenu limité par le nœud. Si ce fContentNode a une valeur false , le nœud ne lie aucun contenu.
Le membre fContentNode affecte l’interprétation de la valeur d’ID parent des nœuds suivants. Si fContentNodea la valeur true, les nœuds insérés entre ce DocExComment_BeginStructNode et une DocExComment_EndStructNode suivante, et qui ont l’ID parent -1, sont des enfants de ce nœud. Toutefois, si fContentNode a la valeur true, les nœuds insérés après cette DocExComment_BeginStructNode et qui ont l’ID parent -1, ne sont pas des enfants de ce nœud. Il s’agit des enfants du nœud le plus récent spécifié qui a fContentNode égal à false.
Vous pouvez imbriquer des nœuds de structure de document à une profondeur arbitraire.
cwchAltText Spécifie le nombre de caractères Unicode dans le bloc de texte de remplacement qui suit la structure. Cette chaîne Unicode spécifie un texte de remplacement pour le nœud (par exemple, un texte de remplacement pour une image).
DocExComment_EndStructNode
La structure DocExComment_EndStructNode marque la fin du contenu décoré par les informations contenues dans le DocExComment_BeginStructNode.
struct DocExComment_EndStructNode
{
DWORD ident {};
DWORD iComment {};
};
Les membres de la structure DocExComment_EndStructNode sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentEndStructNode.
DocExComment_BeginTextRun
La structure DocExComment_BeginTextRun identifie la langue d’une séquence de texte dans le document et fournit les points de code Unicode pour le texte.
Bien que certains enregistrements EMF de rendu de texte utilisent Unicode comme représentation de texte, d’autres utilisent les glyphes qui sont dessinés à l’écran, plutôt que le texte source d’origine. Un glyphe est l’index d’une forme donnée dans la police, qui peut être différent d’une police à l’autre.
Il peut y avoir des cas où plusieurs points de code Unicode sont combinés en un seul glyphe ou où un seul point de code Unicode est divisé en plusieurs glyphes. Étant donné que le mappage des points de code aux glyphes dépend du contexte, un utilisateur ne peut pas rechercher de texte ou copier/coller dans un document qui contient uniquement des glyphes. Par conséquent, Publisher fournit parfois le texte Unicode ainsi que les glyphes.
struct DocExComment_BeginTextRun
{
DWORD ident {};
DWORD iComment {};
DWORD lcid {};
int cGlyphIndex {};
int cwchActualText {};
};
Les membres de la structure DocExComment_BeginTextRun sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentBeginTextRun.
lcid Spécifie le LCID pour la séquence de texte.
cGlyphIndex Spécifie la taille d’un tableau qui suit cette structure. Ce tableau implémente une table d’index de glyphes qui mappe les points de code Unicode du texte réel aux glyphes correspondants dans l’EMF. Chaque élément du tableau correspond à un point de code dans le texte. La valeur de cet élément spécifie le premier glyphe utilisé pour afficher ce point de code dans l’EMF. Au moins deux points de code adjacents peuvent avoir la même valeur dans le tableau, ce qui signifie qu’ils se résolvent tous les deux en même glyphe. La valeur peut également être 0, ce qui signifie que ce point de code ne correspond à aucun glyphe.
cwchActualText Spécifie la taille de la séquence de points de code Unicode qui suivent la table d’index de glyphe. Il s’agit du texte qu’un consommateur du document peut utiliser pour la recherche, le copier/coller et l’accessibilité. La valeur de ce membre peut être 0, ce qui signifie qu’aucun texte Unicode n’est fourni.
DocExComment_EndTextRun
La structure DocExComment_EndTextRun marque la fin d’une séquence de texte, dont le début a été marqué par une structure DocExComment_BeginTextRun .
struct DocExComment_EndTextRun
{
DWORD ident {};
DWORD iComment {};
};
Les membres de la structure DocExComment_EndTextRun sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentEndTextRun.
DocExComment_UnicodeForNextTextOut
La structure DocExComment_UnicodeForNextTextOut fonctionne de la même manière que les structures DocExComment_BeginTextRun et DocExComment_EndTextRun . Toutefois, DocExComment_UnicodeForNextTextOut spécifie des points de code Unicode pour l’enregistrement TextOut EMF suivant, plutôt que pour un bloc de contenu EMF limité par des structures de début et de fin.
struct DocExComment_UnicodeForNextTextOut
{
DWORD ident {};
DWORD iComment {};
int cGlyphIndex {};
int cwchActualText {};
};
Les membres de la structure DocExComment_UnicodeForNextTextOut sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentUnicodeForNextTextOut.
cGlyphIndex Spécifie la taille d’un tableau qui suit cette structure. Ce tableau implémente une table d’index de glyphes qui mappe les points de code Unicode du texte réel aux glyphes correspondants dans l’EMF. Chaque élément du tableau correspond à un point de code dans le texte. La valeur de cet élément spécifie le premier glyphe utilisé pour afficher ce point de code dans l’EMF. Au moins deux points de code adjacents peuvent avoir la même valeur dans le tableau, ce qui signifie qu’ils se résolvent tous les deux en même glyphe.
cwchActualText Spécifie la taille de la séquence de points de code Unicode qui suivent la table d’index de glyphe. Il s’agit du texte qu’un consommateur du document peut utiliser pour la recherche, le copier/coller et l’accessibilité.
DocExComment_EPSColor
La structure DocExComment_EPSColor spécifie les informations de couleur d’un fichier PostScript (EPS) encapsulé incorporé dans l’EMF. Pour plus d’informations sur cette structure, consultez la section Prise en charge étendue des couleurs.
typedef struct
{
DWORD ident {};
DWORD iComment {};
BYTE colorInfo[];
} DocExComment_EPSColor;
Les membres de la structure DocExComment_EPSColor sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentEPSColor.
colorInfo[] Spécifie les informations de couleur pour le fichier EPS. Le complément doit transmettre ces informations à Publisher à l’aide de la méthode IMsoDocExporterSite ::SetEPSInfo .
DocExComment_EPSColorCMYKJPEG
La structure DocExComment_EPSColorCMYKJPEG spécifie le début, dans l’EMF, d’un objet binaire qui est un flux de fichier CMYKJPEG. Pour plus d’informations sur cette structure, consultez la section Prise en charge étendue des couleurs.
typedef struct
{
DWORD ident {};
DWORD iComment {};
} DocExComment_EPSColorCMYKJPEG;
Les membres de la structure DocExComment_EPSColorCMYKJPEG sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentEPSCMYKJPEG ;
DocExComment_EPSColorSpotImage
La structure DocExComment_EPSColorSpotImage fournit des informations de couleur de spot pour l’image RVB suivante. Pour plus d’informations sur cette structure, consultez la section Prise en charge étendue des couleurs.
typedef struct
{
DWORD ident {};
DWORD iComment {};
COLORREF cmykAlt { 0 };
COLORREF rgbAlt { 0 };
float flTintMin {};
float flTintMax {};
char szSpotName[1];
} DocExComment_EPSColorSpotImage;
Les membres de la structure DocExComment_EPSColorSpotImage sont les suivants :
Ident Spécifie la valeur constante, msodocexsignature, qui identifie ce commentaire EMF comme contenant des informations sémantiques.
iComment Spécifie la valeur MSODOCEXCOMMENT, msodocexcommentEPSSpotImage.
cmykAlt Spécifie un ID de couleur CMJN.
rgbAlt Spécifie un ID de couleur RVB.
flTintMin Spécifie la teinte minimale.
flTintMax Spécifie la teinte maximale.
szSpotName[1] Spécifie une chaîne de longueur variable, terminée sans fin, qui contient le nom spot.
Prise en charge étendue des couleurs
Pour prendre en charge les espaces de couleur étendus dans Publisher, des enregistrements et des interfaces sémantiques EMF supplémentaires sont nécessaires, car EMF prend uniquement en charge les couleurs RVB (rouge-vert-noir). Les espaces de couleur étendus incluent cmjN (cyan-magenta-jaune-noir) et l’espace de couleur spot, qui sont couramment utilisés dans l’impression commerciale.
Publisher utilise le mappage des couleurs pour représenter les couleurs étendues dans le document EMF. Publisher crée une table de couleurs pour toutes les couleurs utilisées dans le document et remplace les couleurs réelles par des ID de couleurs dans l’EMF. Le type de l’ID de couleur est COLORREF, qui est le même type que celui utilisé pour la couleur RVB. Pour plus d’informations sur la structure COLORREF, consultez COLORREF.
Pour résoudre les ID de couleur dans l’EMF dans l’espace de couleur d’extension, le complément rappelle Publisher via la méthode HrResolveColor de l’interface IMsoDocExporterSite . Le complément transmet à Publisher un pointeur d’interface vers une interface IDOCEXCOLOR comme l’un des paramètres à HrResolveColor. Publisher prend les ID de couleur, également spécifiés dans l’appel à HrResolveColor, les convertit en couleur étendue (RVB, CMJN ou couleur spot) et les transmet au complément via les méthodes de l’interface IDOCEXCOLOR .
Couleurs vectorielles et images recolorées
Les couleurs vectorielles sont toutes les valeurs COLORREF que le complément reçoit de Publisher. Par exemple, la couleur du texte, la couleur du trait de trait de ligne et la couleur pour la recolorisation du métafichier. Lorsque le mappage de couleurs est activé, Publisher utilise un ID de couleur pour COLORREF plutôt qu’une valeur de couleur RVB réelle. Si Publisher fournit au complément un pointeur d’interface IMsoDocExporterSite en appelant la méthode SetDocExporterSite de l’interface IMsoDocExporter , le complément doit toujours appeler la méthode IMsoDocExporterSite ::HrResolveColor pour convertir le COLORREF en une couleur étendue, que le complément reçoit via les méthodes de l’interface IDOCEXCOLOR .
Pour prendre en charge le mappage de couleurs vectorielles, le complément doit effectuer les opérations suivantes :
Implémentez la prise en charge des classes pour une interface IDOCEXCOLOR . Les méthodes de cette interface permettent à Publisher de transmettre une couleur étendue au complément.
Mettez en cache les valeurs d’état de couleur suivantes à partir des enregistrements sémantiques dans l’EMF.
Définir la couleur de premier plan pour la recolorisation. Cette valeur est définie par le biais de la structure DocExComment_ColorInfo .
Définir la couleur d’arrière-plan pour la recolorisation. Cette valeur est définie par le biais de la structure DocExComment_ColorInfo .
Déterminez quand le mappage de couleurs est activé. Cette valeur est définie par le biais de la structure DocExComment_ColorEnable .
Pour une couleur vectorielle, créez une interface IDOCEXCOLOR avec l’ID de couleur, afin que IDOCEXCOLOR ::GetUnresolvedRGB retourne l’ID de couleur. Le complément doit appeler la méthode IMsoDocExporterSite ::HrResolveColor avec l’interface IDOCEXCOLOR et les états de couleur mis en cache. Publisher appelle les méthodes d’interface IDOCEXCOLOR avec la couleur finale, qui peut être RVB, CMJN, spot ou inscription.
Lorsque la couleur de premier plan ou la couleur d’arrière-plan pour la recolorisation est spécifiée à partir d’un enregistrement sémantique EMF, le complément doit recolorier les images du complément (par exemple, les métafichiers ou les images raster).
Images non recolorées
EMF prend en charge les images CMJN à l’aide de GDI+. Par conséquent, les images de l’EMF peuvent être RVB ou CMJN. Si l’image est une image CMJN, le complément doit convertir l’image en espace de couleurs cible.
Publisher conserve un espace de couleur cible pour le document. Le complément peut utiliser cet espace de couleur cible en appelant la méthode IMsoDocExporterSite ::HrConvertImageColorSpace avec l’espace de couleur de l’image.
Couleur des fichiers EPS
Le postscript encapsulé (EPS) est un type de métafichier qui prend en charge les espaces de couleurs étendus. Les utilisateurs qui incorporent des images EPS dans un document Publisher s’attendent à ce que les informations de couleur soient utilisées dans la sortie au format fixe. Dans Publisher, l’EPS est converti en emf avec des enregistrements sémantiques liés à EPS. Ce module EMF est ensuite incorporé dans le fichier EMF de page que l’application transmet au complément.
Pour prendre en charge la couleur dans les fichiers EPS, le complément doit effectuer les opérations suivantes :
Appelez la méthode IMsoDocExporterSite ::SetEPSInfo pour DocExComment_EPSColor enregistrements rencontrés dans l’EMF.
Extrayez l’image CMJN de l’enregistrement DocExComment_EPSColorCMYKJPEG dans l’EMF. Cet enregistrement contient un objet binaire qui est le flux de fichier JPEG CMJN réel. Utilisez-la pour remplacer l’image RVB spécifiée dans l’appel suivant à la fonction StretchDIBits .
L’enregistrement DocExComment_EPSColorSpotImage fournit des informations de couleur spot pour l’image RVB suivante, qui est toujours une image d’index. Le complément doit convertir l’image spot en espace de couleur cible.
Le complément peut éventuellement appeler la méthode IMsoDocExporterSite :: HrGetSpotRecolorInfo pour obtenir la couleur cible du document à partir de Publisher. Le complément peut ensuite recolorier l’image RVB suivante en mappant les couleurs de la palette de l’image RVB aux teintes flTintMin et flTintMax spécifiées dans l’enregistrement DoxExComment_EPSColorSpotImage . La luminosité de chaque couleur de la palette est utilisée pour le mappage.
Notez que l’enregistrement DocExComment_EPSStart est uniquement informatif. Le complément peut ignorer cet enregistrement.
SetDocExporterSite
Publisher appelle SetDocExporterSite pour fournir au complément un pointeur vers une interface IMsoDocExporterSite . L’interface IMsoDocExporterSite expose des méthodes qui permettent une prise en charge étendue des couleurs.
void SetDocExporterSite(
IMsoDocExporterSite* pDocExporterSite
);
Le paramètre pDocExporterSite spécifie le pointeur d’interface vers l’interface IMsoDocExporterSite .
HrSetPageHeightForPagination
Une application peut appeler la méthode HrSetPageHeightForPagination pour spécifier la hauteur de page en points.
HRESULT HrSetPageHeightForPagination(
float dytfPageHeight
);
Certaines applications conservent le document de l’utilisateur dans un format non paginé. Dans ce cas, le complément pagine le document à l’aide de la hauteur de page spécifiée par l’application dans l’appel à HrSetPageHeightForPagination. Le paramètre dytfPageHeight spécifie la hauteur de page en points.
Après avoir spécifié les informations de hauteur de page, l’application transmet le complément entier au document sous la forme d’un seul fichier EMF en mémoire dans un appel à HrAddPageFromEmf. Le complément utilise ensuite le fichier de hauteur de page et le fichier EMF pour paginer le document.
Le complément retourne les informations de pagination à l’application dans les appels suivants à la méthode HrGetPageBreaks .
HrGetPageBreaks
Une application peut appeler la méthode HrGetPageBreaks pour obtenir le nombre et l’emplacement des sauts de page pour les documents paginés par le complément.
HRESULT HrGetPageBreaks(
float* rgdytfPageBreaks,
int* pcchPageBreaks,
BOOL* pfCanTrustLastBreakIsEndOfDocument
);
Une fois que le complément a paginé un document à l’aide de la hauteur de page spécifiée par la méthode HrSetPageHeightForPagination , il retourne les informations de pagination dans les appels suivants que l’application effectue à la méthode HrGetPageBreaks .
Le paramètre rgdytfPageBreaks est un pointeur vers un tableau de valeurs float qui spécifient les emplacements des sauts de page en points. Le premier élément du tableau (index 0) est l’emplacement du premier saut de page, le deuxième élément est l’emplacement du deuxième saut de page, et ainsi de suite. Par conséquent, les valeurs de ces éléments augmentent successivement.
Le paramètre pcchPageBreaks est un pointeur vers une valeur entière qui spécifie le nombre de sauts de page dans le document.
Le paramètre pfCanTrustLastBreakIsEndOfDocument spécifie si l’emplacement du dernier saut de page est la fin du document ou le début de la dernière page du document. Une valeur true indique que le dernier saut de page est la fin du document.
L’application appelle HrGetPageBreakdeux fois pour obtenir les informations de pagination. Lors du premier appel, l’application appelle HrGetPageBreaks pour obtenir le nombre de sauts de page.
HrGetPageBreaks(NULL, &nPageBreaks, NULL);
L’application appelle ensuite HrGetPageBreaks une deuxième fois pour obtenir les emplacements réels. Lors du deuxième appel, l’application transmet une mémoire tampon de taille suffisante pour contenir le tableau des emplacements de saut de page.
HrGetPageBreaks(rgPageBreaks, &nPageBreaks, fCanStopAtLastPageBreak);
Après avoir reçu les informations de saut de page du complément, l’application relance le processus d’exportation au format fixe, en commençant par un appel à la méthode HrCreateDoc , suivi d’un appel à HrAddPageFromEmf pour chacune des pages fournies par les informations de saut de page.
HrAddOutlineNode
Publisher appelle la méthode HrAddOutlineNode pour transmettre au complément une structure qui décrit un nœud dans un plan navigable par l’utilisateur pour le document exporté.
HRESULT HrAddOutlineNode(
int idNodeParent
const MSODOCEXOUTLINENODE* pNode
);
Le code d’exportation au format fixe peut utiliser les informations transmises par la méthode HrAddOutlineNode pour construire un plan navigable par l’utilisateur du document d’exportation. Du point de vue de l’utilisateur, chaque nœud dans le plan est représenté par un texte de titre mappé à un emplacement particulier dans le document.
Chaque appel à HrAddOutlineNode spécifie des informations pour un nœud unique dans ce plan. Chaque nœud est identifié par un ID de nœud unique dans le plan. Un ID de 0 est réservé au nœud racine. Le plan est hiérarchique, c’est-à-dire qu’il a une arborescence dans laquelle chaque nœud a un parent unique et zéro ou plusieurs nœuds enfants.
Le premier paramètre de HrAddOutlineNode fournit l’ID du nœud qui est le parent du nœud transmis.
Publisher appelle toujours HrAddOutlineNode pour un nœud parent avant d’appeler la méthode pour l’un des enfants du nœud parent. En d’autres termes, le code d’exportation est assuré d’avoir déjà les informations de nœud pour le nœud identifié par le paramètre idNodeParent . La seule exception est l’appel initial à HrAddOutlineNode qui spécifie le nœud racine. Pour cet appel, la valeur de idNodeParent est 0.
Les informations supplémentaires dont le code d’exportation a besoin pour chaque nœud sont transmises par HrAddOutlineNode dans une structure MSODOCEXOUTLINENODE pointée par le paramètre pNode .
typedef struct _MsoDocexOutlineNode
{
int idNode {};
WCHAR rgwchNodeText[cwchMaxNodeText];
int iDestPage {};
float dytfvDestPage {};
float dxtfvDestOffset {};
float dytfvDestOffset {};
} MSODOCEXOUTLINENODE;
Les membres de MSODOCEXOUTLINENODE sont décrits comme suit :
idNode ID du nœud. La valeur -1 indique que ce nœud ne peut pas avoir de nœuds enfants dans le plan. Sinon, ce membre a une valeur unique dans le document.
rgwchNodeText Chaîne Unicode qui représente le texte de titre de chaque nœud. Ce texte n’est pas obligatoirement unique dans le plan.
iDestPage Numéro de page de la page qui contient l’emplacement de destination dans le document.
dytfvDestPage Hauteur de la page de destination en points. Le décalage spécifié par le membre dytfvDestOffset est relatif au coin supérieur gauche de la page. Toutefois, certains types de format fixe utilisent un système de coordonnées relatif au coin inférieur gauche de la page. Pour ces types de documents, la hauteur de page est requise pour convertir le décalage.
dxtfvDestOffset Décalage horizontal de l’emplacement de destination sur la page de destination.
dytfvDestOffset Décalage vertical de l’emplacement de destination sur la page de destination.
HrAddDocumentMetadataString
Publisher appelle la méthode HrAddDocumentMetadataString pour spécifier les métadonnées de document sous la forme d’une chaîne Unicode.
HRESULT HrAddDocumentMetadataString(
MSODOCEXMETADATA metadataType,
const WCHAR* pwchValue
);
Le paramètre metadatatype spécifie le type de métadonnées représentées par la chaîne. Le paramètre metadatatype doit être l’une des valeurs suivantes du type d’énumération MSODOCEXMETADATA.
Tableau 8. Valeurs énumérées de MSODOCEXMETADATA
Valeur |
Description |
---|---|
msodocexMetadataTitle |
Titre du document. |
msodocexMetadataAuthor |
L’auteur du document |
msodocexMetadataSubject |
Chaîne qui décrit le sujet du document (par exemple, business ou science). |
msodocexMetadataKeywords |
Mot clé pertinent pour le contenu du document. |
msodocexMetadataCreator |
Créateur du document, éventuellement distinct de l’auteur. |
msodocexMetadataProducer |
Producteur du document, éventuellement distinct de l’auteur ou du créateur. |
msodocexMetadataCategory |
Chaîne qui décrit le type de document (par exemple, mémo, article ou livre). |
msodocexMetadataStatus |
État du document. Ce champ peut indiquer où se trouve le document dans le processus de publication (par exemple, brouillon ou final). |
msodocexMetadataComments |
Commentaires divers relatifs au document. |
Pour un document donné, une seule chaîne peut être associée à chaque type de métadonnées. Par exemple, si le document comporte plusieurs mots clés, ils sont passés au complément sous la forme d’une chaîne concaténée.
Le paramètre pwchValue spécifie une chaîne Unicode qui contient les métadonnées proprement dites.
La façon dont le complément incorpore les métadonnées de chaîne de texte dans le document exporté dépend des détails d’implémentation du code d’exportation et du type de format fixe utilisé dans le document exporté.
HrAddDocumentMetadataDate
Publisher appelle la méthode HrAddDocumentMetadataDate pour spécifier les métadonnées de document sous la forme d’une structure FILETIME.
HRESULT HrAddDocumentMetadataDate(
MSODOCEXMETADATA metadataType,
const FILETIME* pftLocalTime
);
Le paramètre metadatatype spécifie le type de métadonnées représenté par la structure FILETIME . Le paramètre metadatatype doit être l’une des valeurs suivantes du type d’énumération MSODOCEXMETADATA.
Tableau 9. Valeurs énumérées de MSODOCEXMETADATA
Valeur |
Description |
---|---|
msodocexMetadataCreationDate |
Date de création du document. |
msodocexMetadataModDate |
Date de dernière modification du document. |
Le paramètre pftLocalTime spécifie un pointeur vers une structure FILETIME qui contient les informations de date et d’heure pour les métadonnées. L’extrait de code suivant montre comment extraire ces informations de la structure.
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);
La façon dont le complément incorpore les métadonnées de date et d’heure dans le document exporté dépend des détails d’implémentation du code d’exportation et du type de format fixe utilisé dans le document exporté.
HrFinalize
Publisher appelle la méthode HrFinalize à la fin du processus d’exportation de document.
HRESULT HrFinalize();
Le code qui implémente l’exportation au format fixe doit utiliser HrFinalize pour effectuer des tâches telles que le vidage des mémoires tampons de données, l’écriture des données restantes sur le disque et la libération de mémoire et d’autres ressources.
Conclusion
Vous pouvez étendre la fonctionnalité d’exportation au format fixe des applications Office en implémentant l’interface IMsoDocExporter . Les méthodes de cette interface fournissent un canal permettant aux applications Office de communiquer au complément le contenu visuel et les informations sémantiques du document à exporter. Le contenu visuel du document est fourni au complément sous la forme d’un ou de plusieurs métafichiers améliorés en mémoire. Les informations sémantiques sont fournies sous forme d’enregistrements de commentaires spécialement mis en forme dans ce champ EMF. Des méthodes supplémentaires dans l’interface permettent aux applications Office de communiquer des métadonnées et des informations structurelles sur le document.
Ressources supplémentaires
Pour plus d’informations, consultez les ressources suivantes :