Compartir a través de


Ampliación de la exportación de PDF de Office

Resumen: Cree un complemento COM para Office 2024, Office LTSC 2024 y Aplicaciones de Microsoft 365 versión 2408 y posteriores con su propia lógica para exportar a formato PDF. La técnica descrita requiere conocimientos de C++ y COM.

Se aplica a: Excel, OneNote, PowerPoint, Publisher, Visio y Word en Office 2024, Office LTSC 2024, Microsoft 365 versión 2408 y versiones posteriores.

Introducción a office (2024) Fixed-Format característica de exportación

En este artículo se explica cómo los desarrolladores de software de terceros pueden conectarse a la característica de exportación de formato fijo disponible en office 2024, Office LTSC 2024, microsoft 365 versión 2408 y posteriores para que puedan agregar su propio exportador.

Las aplicaciones incluyen exportadores integrados para Microsoft XML Paper Specification (XPS) y Portable Document Format (PDF). Los formatos de archivo fijo exponen el contenido de un documento en un formato paginado que es independiente de la aplicación y de la plataforma.

Los desarrolladores de software pueden agregar su propio exportador escribiendo un complemento de Office que implemente la interfaz COM IMsoDocExporter . En este artículo se describe IMsoDocExporter y su interacción con una aplicación de Microsoft 365 de hospedaje, como Word.

La exportación de formato fijo está disponible desde la versión de Office 2007 y en este artículo se incluye información sobre las características que son nuevas en las versiones de Office 2024, Office LTSC 2024, Microsoft 365 Versión 2408.

Importante

La característica de exportación de formato fijo está disponible en todas las aplicaciones enumeradas en la sección Anterior Se aplica a. Sin embargo, en la explicación siguiente se usa Publisher como una aplicación de ejemplo, excepto en aquellos casos en los que una explicación es más relevante para una aplicación diferente.

Inicialización de Add-Ins

Para que el usuario acceda a la funcionalidad del complemento, el complemento debe agregar un nuevo elemento de menú o un nuevo botón de barra de herramientas a la aplicación. Cuando el usuario selecciona este botón o elemento de menú, el complemento debe usar el modelo de objetos de Microsoft Office para obtener un puntero al documento activo. A continuación, debe llamar al método ExportAsFixedFormat del documento activo con un puntero de interfaz IUnknown que admita la interfaz IMsoDocExporter mediante una llamada al método QueryInterface . El parámetro del modelo de objetos para el puntero de interfaz es variant con VT_UNKNOWN tipo.

Nota

Para OneNote, el complemento llama al método Publish con un parámetro de cadena que es el identificador de clase de la implementación del complemento de la interfaz IMsoDocExporter . A continuación, OneNote llama a CoCreateInstance con el identificador de clase para obtener un puntero de interfaz IUnknown del generador de clases del complemento.

Una vez que Publisher tiene un puntero a la interfaz IMsoDocExporter , llama al complemento a través de los métodos expuestos por IMsoDocExporter. A través de estas devoluciones de llamada, Word proporciona al complemento contenido del documento y otra información sobre el documento.

Una excelente fuente de información sobre la creación de complementos COM para aplicaciones de Microsoft Office es el artículo codeproject.com Creación de un complemento COM de Office2K con VC++/ATL.

IMsoDocExporter

La interfaz IMsoDocExporter expone los métodos siguientes.

Tabla 1. Métodos expuestos por la interfaz IMsoDocExporter

Método

Descripción

HrCreateDoc

Se llama al principio del proceso de exportación de formato fijo.

HrAddPageFromEmf

Se llama a para pasar el complemento un metarchivo mejorado (EMF) que representa una vista representada del contenido que se va a exportar.

HrAddDocumentMetadataString

Se llama a para especificar metadatos de formato de cadena para el documento.

HrAddDocumentMetadataDate

Se llama a para especificar metadatos de formato de fecha para el documento.

HrSetDefaultLcid

Se llama a para especificar el identificador de configuración regional (LCID) predeterminado para el contenido que se va a exportar.

HrAddOutlineNode

Se llama a para especificar la información de esquema del documento navegable por el usuario.

HrGetPageBreaks

Se llama a para obtener información de paginación del complemento.

HrSetPageHeightForPagination

Se llama a para especificar el alto de página para permitir que el complemento pagina el documento.

HrFinalize

Se llama al final del proceso de exportación de formato fijo. Permite que el complemento realice cualquier procesamiento final.

HrBeginStructNode

Se llama a para pasar el complemento a la estructura inicial de un nodo de estructura de documentos que abarca varias páginas.

HrEndStructNode

Se llama a para pasar el complemento a la estructura final de un nodo de estructura de documento que abarca varias páginas.

EnableCancel

Se llama a para pasar el complemento un puntero a una interfaz IDocExCancel .

GetOutputOption

Se llama a para recuperar las opciones de salida de formato fijo.

SetOutputOption

Lo llama Office para establecer opciones de salida de formato fijo.

SetDocExporterSite

Se llama a para proporcionar al complemento un puntero a una interfaz IMsoDocExporterSite para una compatibilidad con colores extendida.

Además, IMsoDocExporter también expone los métodos siguientes que se heredan de la interfaz IUnknown .

Tabla 2. Métodos heredados de la interfaz IUnknown

Método

Descripción

AddRef

Incrementa el recuento de referencia.

QueryInterface

Devuelve los punteros a las interfaces compatibles. La implementación del complemento de QueryInterface debe admitir la devolución de un puntero de interfaz IMsoDocExporter desde IID_IMsoPdfWriter.

Versión

Disminuye el recuento de referencia.

Para obtener información sobre cómo implementar los métodos de interfaz IUnknown , vea IUnknown (COM).

Flujo de llamadas

En el diagrama siguiente se muestra la secuencia en la que Publisher llama a los métodos expuestos en IMsoDocExporter. No todos los métodos los usa cada aplicación de Microsoft Office y no todos los métodos se usan para cada documento que se exporta.

Figura 1. Métodos de llamada desde la interfaz IMsoDocExporter

Métodos de llamada desde la interfaz IMsoDocExporter

En las secciones siguientes se describen aún más los métodos expuestos por la interfaz IMsoDocExporter . Los métodos se describen aproximadamente en el orden en que publisher los llamaría.

GetOutputOption y SetOutputOption

Publisher llama a los métodos GetOutputOption y SetOutputOption para recuperar y establecer opciones de salida para el proceso de exportación de formato fijo.

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

El parámetro docexoption especifica la opción de salida y el parámetro (p)dwVal especifica el valor de la opción.

Aunque el exportador integrado en Office usa GetOutputOption y SetOutputOption, un complemento puede implementar su propio método de obtención y configuración de opciones y su propia experiencia de usuario para las opciones.

Microsoft Office llama solo a GetOutputOption con msodocexOptionTargetDPIColor para Fixed-Format Add-Ins

Para la implementación de la exportación de formato fijo en Office, Publisher llama al método GetOutputOption para recuperar las opciones de salida para mostrarlas al usuario en el cuadro de diálogo Publicar como PDF o XPS . En el caso de los complementos desarrollados por desarrolladores de software de terceros, Publisher llama a GetOutputOption solo con el valor msodocexOptionTargetDPIColor. Este es el único valor que un complemento necesita admitir. Si se llama a la implementación del complemento de GetOutputOption con este valor, debe devolver los puntos por pulgada (PPP) de destino para la rasterización de efectos 3D.

Microsoft Office llama a SetOutputOption para complementos de Fixed-Format

Tanto para la implementación de la exportación de formato fijo en Office como para las implementaciones de complementos, Publisher llama a SetOutputOption al principio del proceso de exportación de formato fijo. En la implementación en Office, los valores de parámetro pasados especifican opciones de salida de formato fijo. Sin embargo, si el complemento implementa su propio conjunto de opciones, el complemento puede omitir las opciones que le pasa Publisher.

EnableCancel

Publisher llama al método EnableCancel para pasar al complemento un puntero a una interfaz IMsoDocExCancel . El complemento puede usar esta interfaz para consultar si un usuario decide cancelar una operación de exportación de documentos larga.

void EnableCancel(
    IMsoDocExCancel* pdec
);

HrBeginStructNode

Publisher llama al método HrBeginStructNode para especificar el inicio de un nodo de estructura de documento para el contenido que abarca varias páginas completas del documento. Publisher inserta los nodos de estructura de documento para los elementos del documento que residen completamente dentro de una página (por ejemplo, párrafos) en el propio metarchivo mejorado (EMF) mediante las estructuras DocExComment_BeginStructNode y DocExComment_EndStructNode . Para obtener más información sobre los nodos de estructura de documentos, vea las secciones HrAddPageFromEmf y DocExComment_BeginStructNode en este artículo.

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

El parámetro idNodeParent especifica el identificador del nodo que es el elemento primario del nodo que se pasa al complemento. Si este parámetro es 0, el nodo se encuentra bajo la raíz del árbol de estructura de documentos. Varios nodos del mismo nivel pueden encontrarse bajo la raíz. Si este parámetro es -1, el nodo se encuentra en el nodo actualmente abierto, es decir, en el último nodo especificado por HrBeginStructNode que no se ha cerrado mediante una llamada a HrEndStructNode.

El parámetro iSortOrder especifica el criterio de ordenación del nodo de estructura entre sus elementos del mismo nivel. No hay dos nodos que puedan tener el mismo criterio de ordenación. Sin embargo, el conjunto de enteros que constituyen el criterio de ordenación no debe ser contiguo. Un valor de -1 indica que el criterio de ordenación del mismo nivel es el mismo orden en el que aparecen los nodos en los comentarios de EMF.

El parámetro pnode apunta a una estructura MSODOCEXSTRUCTNODE , que tiene la siguiente declaración:

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;

El miembro idNode especifica el identificador del nodo que se pasa en la llamada a HrBeginStructNode. Es posible que este miembro no tenga un valor de 0. Un valor de -1 indica que los nodos secundarios no usan el parámetro idNodeParent para especificar este nodo como su elemento primario. En su lugar, este nodo solo puede ser primario si incluye nodos secundarios en emf. Varios nodos pueden tener un identificador de -1. Si el identificador no es -1, el valor es único en todo el documento.

La unión incrustada al final del MSODOCEXSTRUCTNODE se interpreta de forma diferente en función del tipo de nodo:

  • iHeadingLevel es el nivel de encabezado de un msodocexStructTypeHeading.
  • idPara es el identificador de párrafo de un objeto P, TOCI o ListBody.
  • idDropCap es el identificador de un msodocexStructTypeDropCap.
  • iPage es el número de página de msodocexStructTypePage.
  • bt es el tipo de salto de línea para msodocexStructTypeTextLine.
  • iListLevel es el nivel de lista de msodocexStructTypeList o msodocexStructTypeListItem.
  • listType es el tipo de lista de msodocexStructTypeListItem.
  • idAtn es el identificador de msodocexStructTypeAnnotationBegin o msodocexStructTypeAnnotationEnd.
  • cpLim se usa para determinar el orden de anidamiento de tablas dentro de tablas para msodocexStructTypeTable, msodocexStructTypeTOC o msodocexStructTypeListBody.
  • shapeProperty es para un msodocexStructTypeFigure donde el contenido es una forma, un cuadro de texto o una celda de tabla y contiene campos de bits de la enumeración MSODOCEXSHAPEPROPERTY.
  • tableAttr es los atributos de celda de tabla para msodocexStructTypeTH o msodocexStructTypeTD.
  • cpNoteRef se usa para vincular msodocexStructTypeIntLinkNoteRef con msodocexStructTypeFootnote/msodocexStructTypeEndnote. Esto se explica con más detalle más adelante en esta sección.
  • idTableHeader es el identificador único de msodocexStructTypeTH o msodocexStructTypeTD.
  • cpXchAtnMainDod se usa para vincular msodocexStructTypeCommentAnchor con msodocexStructTypeAnnot. Esto se explica con más detalle más adelante en esta sección.
  • iTargetParentId es el identificador del nodo al que se va a volver a asignar msodocexStructTypeDiagram.
  • wzMathMlText es una cadena MathML para msodocexStructTypeEquation.
  • pListAttr es atributos de lista para msodocexStructTypeList.

Nota: cpNoteRef, cpXchAtnMainDod, wzMathMlText y pListAttr están disponibles cuando Word. Se llama a Document.ExportAsFixedFormat3 con ImproveExportTagging = true. La versión mínima necesaria es el canal beta de Microsoft 365 16.0.18720.20000.

Tabla 3. Valores enumerados de MSODOCEXLINEBREAKTYPE

Valor

Descripción

msodocexLineBreakTypeNormal

Salto de línea normal.

msodocexLineBreakTypeManual

Salto de línea manual.

msodocexLineBreakTypeEOP

Final del párrafo.

Tabla 4. Valores enumerados de MSODOCEXLISTTYPE

Valor

Descripción

msodocexListTypeNone

Sin viñetas ni numeración.

msodocexListTypeBulletDisc

Viñetas en forma de disco.

msodocexListTypeBulletCircle

Viñetas en forma de círculo.

msodocexListTypeBulletSquare

Viñetas de forma cuadrada.

msodocexListTypeBulletDecimal

Numeración decimal.

msodocexListTypeUpperRoman

Numeración de números romanos en mayúsculas.

msodocexListTypeLowerRoman

Numeración numérica romana en minúsculas.

msodocexListTypeUpperAlpha

Numeración alfabética en mayúsculas.

msodocexListTypeLowerAlpha

Numeración alfabética en minúsculas.

Tabla 5. Valores enumerados de campos de bits MSODOCEXSHAPEPROPERTY

Valor

Valor numérico

Descripción

msodocexShape

0x00000001

El objeto es una forma o un cuadro de texto.

msodocexShapeText

0x00000002

El objeto tiene texto sin espacios en blanco.

msodocexShapePath

0x00000004

El objeto tiene un relleno o contorno.

msodocexShapeAltText

0x00000008

El objeto tiene Texto alternativo.

msodocexShapeEquation

0x00000010

El objeto tiene texto que contiene una ecuación.

msodocexShapeTabelCell

0x00000020

El objeto es una celda de una tabla.

MsoDocexTableAttr

La estructura MsoDocexTableAttr se ajusta en 32 bits e incluye la información de intervalo de filas y columnas y ámbito de encabezado de una celda de tabla.

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;
};

Los miembros de la estructura MsoDocexTableAttr son los siguientes:

  • MaxSpanBits Especifica el número de bits disponibles para los valores rowSpan y colSpan, que es 15.

  • MaxSpanValue Especifica el valor máximo que se puede especificar para rowSpan y colSpan.

  • rowSpan Especifica el número de filas que abarca una celda de tabla.

  • fRowScope Especifica si el encabezado es Row/Both o Column.

  • colSpan Especifica el número de columnas que abarca una celda de tabla.

  • fColScope Especifica si el encabezado es Column/Both o Row.

MsoDocexListAttr

La estructura MsoDocexListAttr incluye información para una lista.

struct MsoDocexListAttr
{
    int iListLevel;
    long cpLim;
};

Los miembros de la estructura MsoDocexListAttr son los siguientes:

  • iListLevel Especifica el orden de anidamiento de la lista.

  • cpLim Especifica la posición en el documento donde finaliza la lista.

Sugerencias posteriores al procesamiento

En algunos casos, los nodos deben procesarse posteriormente para lograr los resultados deseados.

Postprocesamiento de notas al pie o notas al final

Durante la exportación, los vínculos de notas al pie o notas al final se etiquetarán como msodocexStructTypeIntLinkNoteRef. Los cuerpos de notas al pie o notas al final se etiquetarán como msodocexStructTypeFootnote y msodocexStructTypeEndnote respectivamente, y siempre serán nodos de nivel superior en el nodo msodocexStructTypeDocument. El nodo msodocexStructTypeIntLinkNoteRef y el nodo msodocexStructTypeFootnote/msodocexStructTypeEndnote correspondiente tendrán el mismo valor cpNoteRef. Esto se puede usar para mover nodos de notas al pie o notas al final en sus nodos de vínculo correspondientes para mantener un orden de lectura lógico.

Postprocesamiento de comentarios

Durante la exportación, cada delimitador de comentario se etiquetará como msodocexStructTypeCommentAnchor. Los cuerpos de comentario se etiquetarán como msodocexStructTypeAnnot y siempre serán nodos de nivel superior en el nodo msodocexStructTypeDocument. El nodo msodocexStructTypeCommentAnchor y el nodo msodocexStructTypeAnnot correspondiente tendrán el mismo valor cpXchAtnMainDod. Esto se puede usar para mover nodos de anotación en sus nodos delimitadores de comentario correspondientes para mantener un orden de lectura lógico.

Posprocesamiento de tablas de diseño

Durante la exportación si detectamos que una tabla es una tabla de diseño, la etiquetaremos como msodocexStructTypeTable, pero estableceremos el cpLim del nodo en -2 (nuestro valor constante para indicar que se trata de una tabla de diseño). A continuación, este valor se puede usar para determinar si los nodos de tabla deben volver a etiquetarse como nodos de párrafo.

Nodos que abarcan páginas posteriores al procesamiento (párrafos, listas, tablas)

En el caso de los párrafos, se pueden comprobar los valores idPara de dos nodos para para para determinar si representan el mismo párrafo entre páginas. En el caso de las tablas, los valores cpLim se pueden comprobar para ver si son los mismos.

En el caso de las listas, agregamos una nueva clase a MsoDocexStructNode, MsoDocexListAttr, que contiene el cpLim de una lista. Esto se puede usar para comprobar si dos nodos de lista tienen el mismo cpLim, lo que significa que ambos representan la misma lista en el documento.

Para los nodos de estructura de tabla, la unión se interpreta como una ordenación de los extremos de la tabla en relación con otras tablas mediante cpLim, que se puede usar para determinar el orden de anidamiento de las tablas dentro de las tablas.

En el contexto de la DocExComment_BeginStructNode, el complemento puede omitir el miembro pwchActualText de esta unión.

El miembro pwchAltText especifica texto alternativo para el nodo de estructura.

El parámetro fNoEndNode en HrBeginStructNode especifica si Publisher llama al método HrEndStructNode para marcar el final del nodo de estructura. Si fNoEndNode es false, Publisher llama a HrEndStructNode para cerrar el contenido delimitado por el nodo. Si este parámetro tiene un valor true , el nodo no enlaza ningún contenido.

El parámetro fNoEndNode afecta a la interpretación del valor del identificador primario de los nodos posteriores. Si fNoEndNode es false, los nodos insertados entre esta llamada a HrBeginStructNode y la llamada posterior a HrEndStructNode, y que tienen un identificador primario de -1, son elementos secundarios de este nodo. Sin embargo, si fNoEndNode es true, los nodos insertados después de esta llamada a HrBeginStructNode y que tienen un identificador primario de -1, no son elementos secundarios de este nodo, sino que son elementos secundarios del nodo especificado más recientemente que tiene fNoEndNode igual a false.

Los nodos de estructura de documentos se pueden anidar a una profundidad arbitraria.

Los nodos especificados por HrBeginStructNode y los especificados por DocExComment_BeginStructNode comparten el mismo espacio de identificador y existen en el mismo árbol de estructura de documentos. HrBeginStructNode y DocExComment_BeginStructNode son dos formas alternativas de agregar nodos a este árbol. Por ejemplo, si hrBeginStructNode abrió el nodo más recientemente abierto y el siguiente nodo encontrado procede de un DocExComment_BeginStructNode EMFcommentrecord con idNodeParent igual a -1, significa que el nodo de HrBeginStructNode es el elemento primario del nodo del registro de DocExComment_BeginStructNode .

HrEndStructNode

Publisher llama al método HrEndStructNode para especificar el final de un nodo de estructura de documento para el contenido que abarca varias páginas del documento. El nodo de estructura finalizado por HrEndStructNode se inició anteriormente mediante una llamada al método HrBeginStructNode . Para obtener más información, vea HrBeginStructNode en este artículo.

HRESULT HrEndStructNode();

HrCreateDoc

Publisher llama al método HrCreateDoc para especificar la creación de un nuevo documento de formato fijo vacío.

HRESULT HrCreateDoc(
    const WCHAR* wzDocExFile
);

Publisher llama al método HrCreateDoc al principio del proceso de exportación de formato fijo para especificar la creación de un documento de formato fijo vacío. El parámetro wzDocExFile especifica un nombre para el archivo de salida en el que se va a escribir el documento de formato fijo.

Para una implementación de complemento, Publisher llama a HrCreateDoc con el nombre de archivo que el complemento proporcionó en la llamada al método ExportToFixedFormat en el modelo de objetos de Microsoft Office. Sin embargo, dado que los complementos suelen proporcionar la interfaz de usuario de configuración para permitir al usuario especificar un nombre de archivo de salida, el complemento podría omitir este nombre de archivo durante el proceso de exportación.

Para las aplicaciones de Microsoft Office que requieren que el complemento pagina el documento, se llama a HrCreateDoc dos veces, una al principio de la secuencia de llamadas a la paginación y otra vez después de que el complemento haya paginado el documento. Para obtener más información, vea las descripciones del método HrSetPageHeightForPagination y el método HrGetPageBreaks.

HrSetDefaultLcid

Publisher llama al método HrSetDefaultLcid para especificar el identificador de configuración regional (LCID) predeterminado para el contenido que se va a exportar.

HRESULT HrSetDefaultLcid(
    DWORD lcid
);

Para obtener una lista de LCID válidos, vea Lista de valores de identificador de configuración regional (LCID) como asignados por Microsoft.

HrAddPageFromEmf

Publisher llama al método HrAddPageFromEmf para pasar el complemento a un identificador EMF en memoria que representa el contenido del documento que se va a exportar.

HRESULT HrAddPageFromEmf(
    HENHMETAFILE hemf
);

El EMF pasado por Microsoft Office al complemento es el origen principal del contenido que el complemento exporta como un archivo de formato fijo. Microsoft Office llama a HrAddPageFromEmf una vez para cada página de contenido del documento de origen de la aplicación.

Los comentarios de EMF transmiten información semántica

Un EMF es una secuencia de comandos de dibujo (comandos GDI y GDI+) que especifican cómo representar los elementos visuales del documento. Emf no contiene ninguna información más allá de estos comandos (por ejemplo, "dibujar una imagen aquí" o "dibujar una línea por ahí"). En concreto, emf convencional no admite aspectos semánticos del documento, como hipervínculos, información de configuración regional e información de accesibilidad. Para conservar la información semántica en el documento exportado, Publisher inserta registros especiales en emf. Estos registros contienen la información semántica.

Los registros que representan la información semántica se implementan como comentarios EMF con formato especial. El formato EMF permite tipos de registro de comentarios que el motor de representación omite para la interfaz de dispositivo gráfico (GDI), pero que pueden contener información arbitraria.

Por ejemplo, considere un documento que contiene texto alternativo. (Los lectores de documentos usan texto alternativo para describir imágenes para usuarios con discapacidades visuales). Publisher inserta comentarios emf antes y después de representar la imagen, y estos comentarios emf especifican el texto alternativo para la imagen. El complemento interpreta los comentarios y escribe la información en el archivo de exportación de formato fijo.

En la tabla siguiente se muestran los tipos de registros semánticos compatibles con la característica de exportación de formato fijo de Microsoft Office. Estos tipos se enumeran mediante la enumeración MSODOCEXSTRUCTTYPE . Cada tipo corresponde a un tipo de estructura que describe el formato del registro.

Tabla 6. Tipos de registros semánticos compatibles con la exportación de formato fijo

Valor de comentario

Tipo de estructura

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 estructura DocExComment_ExternalHyperlink(Rctfv) describe un hipervínculo que se vincula a fuera del documento, por ejemplo, a un sitio web en 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];
};

Los miembros de la estructura DocExComment_ExternalHyperlink(Rctfv) son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentExternalHyperlink o msodocexcommentExternalHyperlinkRctfv.

  • rcdvRegion y rctfvRegion Unión que especifica la región de la página que es la ubicación de origen del hipervínculo. La región se puede representar como un tipo RECT (rcdvRegion) que usa píxeles de dispositivo como unidad de medida, o como una estructura que contiene coordenadas de punto flotante (rctfvRegion), en cuyo caso la unidad de medida es points.

    Si el miembro iComment es igual a msodocexcommentExternalHyperlink, el complemento debe usar rcdvRegion. En este caso, el complemento debe aplicar la matriz de transformación EMF actual a rcdvRegion para convertirlo en el espacio de páginas.

    Si el miembro iComment es igual a msodocexcommentExternalHyperlinkRctfv, el complemento debe usar rctfvRegion. En este caso, rctfvRegion ya está en el espacio de páginas, por lo que no se necesita ninguna transformación.

  • wzLink[MAX_PATH] Especifica la dirección URL de destino de este hipervínculo.

DocExComment_InternalHyperlink(Rctfv)

La estructura DocExComment_InternalHyperlink(Rctfv) describe un hipervínculo que vincula a una ubicación dentro del documento. Tenga en cuenta que, aunque Publisher pasa una EMF independiente para cada página del documento, el destino del hipervínculo especificado por DocExComment_InternalHyperlink(Rctfv) podría estar en una página diferente a la ubicación de origen.

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 {};
};

Los miembros de la estructura DocExComment_InternalHyperlink(Rctfv) son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentInternalHyperlink o msodocexcommentInternalHyperlinkRctfv.

  • rcdvRegion y rctfvRegion Al igual que con la estructura DocExComment_ExternalHyperlink , este miembro es una unión que especifica la región de la página que es la ubicación de origen del hipervínculo. La región se puede representar como un tipo RECT (rcdvRegion) que usa píxeles de dispositivo como unidad de medida, o como una estructura que contiene coordenadas de punto flotante (rctfvRegion), en cuyo caso la unidad de medida es points.

    Si el miembro iComment es igual a msodocexcommentInternalHyperlink, el complemento debe usar rcdvRegion. En este caso, el complemento debe aplicar la matriz de transformación EMF actual a rcdvRegion para convertirlo en el espacio de páginas.

    Si el miembro iComment es igual a msodocexcommentInternalHyperlinkRctfv, el complemento debe usar rctfvRegion. En este caso, rctfvRegion ya está en el espacio de páginas, por lo que no se necesita ninguna transformación.

  • iTargetPage Especifica el número de página de la página de destino dentro del documento.

  • xtfvTarget Especifica la coordenada x de la ubicación de destino en la página de destino. La unidad de medida de este valor es points.

  • ytfvTarget Especifica la coordenada y de la ubicación de destino en la página de destino. La unidad de medida de este valor es points.

  • dytfTargetPage Alto de la página de destino en puntos. El desplazamiento especificado por el miembro ytfvTarget es relativo a la esquina superior izquierda de la página. Sin embargo, algunos tipos de formato fijo usan un sistema de coordenadas relativo a la esquina inferior izquierda de la página. Para estos tipos de documentos, el alto de la página es necesario para convertir el desplazamiento.

DocExComment_ColorInfo

La estructura DocExComment_ColorInfo especifica información de estado de color para emf. Para obtener más información sobre esta estructura, consulte la sección Compatibilidad con colores extendidos.

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

Los miembros de la estructura DocExComment_ColorInfo son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentColorInfo.

  • Clr Especifica un identificador de color que representa un estado de color actual en emf.

  • fForeColor Especifica si el identificador de color del miembro clr representa un color de primer plano o un color de fondo. Si este miembro tiene un valor true, el identificador de color representa un color de primer plano. Si este miembro tiene un valor false, el identificador de color representa un color de fondo.

DocExComment_ColorEnable

La estructura DocExComment_ColorEnable especifica si la asignación de colores está habilitada para el contenido posterior en emf. Para obtener más información sobre esta estructura, consulte la sección Compatibilidad con colores extendidos.

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

Los miembros de la estructura DocExComment_ColorEnable son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentColorMapEnable.

  • fEnable Especifica si la asignación de colores está habilitada para el contenido posterior. Un valor de true indica que la asignación de colores está habilitada. Un valor de false indica que la asignación de colores está deshabilitada.

DocExComment_BeginStructNode

La estructura DocExComment_BeginStructNode marca el inicio de un nodo de estructura de documento. Los nodos de estructura tienen uno de los dos propósitos posibles:

  • Los nodos de estructura pueden identificar el tipo de contenido que contienen y especificar la relación jerárquica entre ese contenido y otro contenido del documento.

  • Los nodos de estructura pueden especificar texto alternativo para los elementos del documento.

Si el miembro fContentNode tiene un valor true, un DocExComment_EndStructNode seguirá el DocExComment_BeginStructNode más adelante en el documento. El DocExComment_EndStructNode marca el final del contenido encapsulado por la información del DocExComment_BeginStructNode.

La colección de nodos de estructura dentro del documento forma un árbol; cada nodo tiene un nodo primario y también puede tener nodos del mismo nivel. Los miembros idNodeParent e iSortOrder describen la estructura de este árbol. Tenga en cuenta que un nodo secundario puede aparecer o no entre las estructuras DocExComment_BeginStructNode y DocExComment_EndStructNode del nodo primario en emf.

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

Los miembros de la estructura DocExComment_BeginStructNode son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentBeginStructNode.

  • idNodeParent Especifica el identificador del nodo primario. Un valor de 0 especifica el nodo raíz. Un valor de -1 especifica el nodo de estructura actualmente abierto, es decir, el nodo de estructura envolvente .

  • iSortOrder Especifica el criterio de ordenación del nodo de estructura entre sus nodos del mismo nivel. El criterio de ordenación permite al complemento ordenar el contenido correctamente en el documento exportado.

    No hay dos nodos que puedan tener el mismo criterio de ordenación. Sin embargo, no es necesario que el conjunto de enteros que constituyen el criterio de ordenación sea contiguo.

    Un valor de -1 indica que el orden del mismo nivel es el mismo orden en el que aparecen los nodos en los comentarios de EMF. Tenga en cuenta que el orden en el que el contenido aparece en la EMF no es necesariamente el orden en el que un usuario del documento consume el contenido.

  • desn Especifica una estructura MSODOCEXSTRUCTTYPE , que se definió anteriormente en el documento.

El miembro idNode especifica el identificador del nodo. Es posible que este miembro no tenga un valor de 0. Un valor de -1 indica que los nodos secundarios no usan el miembro idNodeParent para especificar este nodo como su elemento primario. En su lugar, este nodo solo puede ser primario si incluye nodos secundarios en emf. Varios nodos pueden tener un identificador de -1. Si el identificador no es -1, el valor es único en todo el documento.

El tipo de nodo especifica el tipo de nodo de estructura. Este miembro es igual a uno de los valores del tipo de enumeración MSODOCEXSTRUCTTYPE . En la tabla siguiente se enumeran ejemplos de tipos de nodo de estructura de documentos.

Tabla 7. Tipos de nodo de estructura de documentos

Valor de tipo

Descripción

msodocexStructTypePara

Bloque de texto dentro de un artículo. Su nodo primario debe ser un artículo.

msodocexStructTypeFigure

Elemento gráfico (por ejemplo, una imagen o colección de formas) que tiene una representación textual. La representación textual es el texto alternativo que se usa para leer o buscar en el documento.

msodocexStructTypeArticle

Un grupo de nodos que forman un único flujo de texto que se debe leer o buscar como un bloque contiguo de contenido. Algunos documentos tienen un solo artículo y otros tienen varios artículos.

msodocexStructTypeHeading

Encabezado en el texto.

msodocexStructTypeTable

Bloque de texto que forma una tabla.

msodocexStructTypeTR

Bloque de texto que forma una sola fila de una tabla.

msodocexStructTypeTD

Bloque de texto que forma una sola celda en una fila de tabla.

msodocexStructTypeTH

Bloque de texto que forma una sola celda de encabezado en una fila de tabla.

msodocexStructTypeList

Bloque de texto que forma una lista.

msodocexStructTypeListItem

Bloque de texto que forma un elemento de lista.

msodocexStructTypeListBody

Bloque de texto que forma el cuerpo de un elemento de lista.

msodocexStructTypeDocument

Un documento.

msodocexStructTypePage

Página del documento.

msodocexStructTypeTOC

Una tabla de contenido.

msodocexStructTypeTOCI

Elemento de una tabla de contenido.

msodocexStructTypeExtLink

Vínculo a un recurso externo.

msodocexStructTypeIntLink

Vínculo a un recurso interno.

msodocexStructTypeFootnote

Una nota al pie.

msodocexStructTypeEndnote

Una nota al final.

msodocexStructTypeTextbox

Cuadro de texto.

msodocexStructTypeHeader

Bloque de texto que forma un encabezado.

msodocexStructTypeFooter

Pie de página.

msodocexStructInlineShape

Forma insertada.

msodocexStructAnnotation

Anotación.

msodocexStructTypeSpanBlock

Bloque de texto.

msodocexStructTypeWorkbook

Un libro.

msodocexStructTypeWorksheet

Hoja de cálculo.

msodocexStructTypeMacrosheet

Hoja de macros.

msodocexStructTypeChartsheet

Hoja de gráficos.

msodocexStructTypeDialogsheet

Una hoja de diálogo.

msodocexStructTypeSlide

Una diapositiva.

msodocexStructTypeChart

Un gráfico.

msodocexStructTypeDiagram

Un diagrama de SmartArt.

msodocexStructTypeBulletText

Texto buller.

msodocexStructTypeTextLine

Línea de texto.

msodocexStructTypeDropCap

Un capuchón.

msodocexStructTypeSection

Una sección.

msodocexStructTypeAnnotationBegin

El principio de una anotación.

msodocexStructTypeAnnotationEnd

Final de una anotación.

msodocexStructTypeParaRTLAttr

Bloque de texto dentro de un artículo con diseño de derecha a izquierda.

msodocexStructTypeTableRTLAttr

Bloque de texto que forma una tabla con diseño de derecha a izquierda.

msodocexStructTypeHeadingRTLAttr

Encabezado del texto con diseño de derecha a izquierda.

msodocexStructTypeListItemRTLAttr

Bloque de texto que forma un elemento de lista con diseño de derecha a izquierda.

msodocexStructTypeParaUnannotatableAttr

Bloque de texto dentro de un artículo que no es annotable.

msodocexStructTypeTHead

Área de fila de encabezado de una tabla.

msodocexStructTypeTBody

Área del cuerpo de una tabla, es decir, la parte entre THead y TFoot.

msodocexStructTypeLabel

Una etiqueta.

msodocexStructTypeEquation

Una ecuación.

msodocexStructTypeIntLinkNoteRef

Vínculo de marca de referencia de nota al pie o nota al final.

msodocexStructTypeTFoot

Área de fila de pie de página de una tabla.

msodocexStructTypeTitle

Un título en el texto.

msodocexStructTypeBlockQuote

Una cita de párrafo o una cita intensa.

msodocexStructTypeCommentAnchor

Texto vinculado a un comentario.

msodocexStructTypeAnnot

Contenido de un solo comentario.

msodocexStructTypeQuote

Una cita insertada.

msodocexStructTypeCaption

Un subtítulo para una ecuación, figura o tabla.

Nota: msodocexStructTypeTitle, msodocexStructTypeBlockQuote, msodocexStructTypeCommentAnchor, msodocexStructTypeAnnot, msodocexStructTypeQuote y msodocexStructTypeCaption están disponibles cuando Word. Se llama a Document.ExportAsFixedFormat3 con ImproveExportTagging = true. La versión mínima necesaria es el canal beta de Microsoft 365 16.0.18720.20000.

fContentNode Especifica si una estructura DocExComment_EndStructNode marca el final de este nodo de estructura. Si fContentNode es true, una estructura DocExComment_EndStructNode cierra el contenido delimitado por el nodo. Si este fContentNode tiene un valor false , el nodo no enlaza ningún contenido.

El miembro fContentNode afecta a la interpretación del valor del identificador primario de los nodos posteriores. Si fContentNodees true, los nodos que se insertan entre este DocExComment_BeginStructNode y un DocExComment_EndStructNode posterior, y que tienen un identificador primario de -1, son elementos secundarios de este nodo. Sin embargo, si fContentNode es true, los nodos insertados después de este DocExComment_BeginStructNode y que tienen un identificador primario de -1, no son secundarios de este nodo. Son elementos secundarios del nodo especificado más recientemente que tiene fContentNode igual a false.

Puede anidar nodos de estructura de documentos a una profundidad arbitraria.

cwchAltText Especifica el número de caracteres Unicode en el bloque de texto alternativo que sigue a la estructura. Esta cadena Unicode especifica texto alternativo para el nodo (por ejemplo, texto alternativo para una imagen).

DocExComment_EndStructNode

La estructura DocExComment_EndStructNode marca el final del contenido que se decora con la información de la DocExComment_BeginStructNode.

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

Los miembros de la estructura DocExComment_EndStructNode son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentEndStructNode.

DocExComment_BeginTextRun

La estructura DocExComment_BeginTextRun identifica el idioma de una secuencia de texto en el documento y proporciona los puntos de código Unicode para el texto.

Aunque algunos registros EMF de representación de texto usan Unicode como representación de texto, otros usan los glifos que se dibujan en la pantalla, en lugar del texto de origen original. Un glifo es el índice de una forma determinada en la fuente, que puede ser diferente de la fuente a la fuente.

Puede haber casos en los que varios puntos de código Unicode se combinan en un solo glifo o donde un único punto de código Unicode se divide en varios glifos. Dado que la asignación de puntos de código a glifos depende del contexto, un usuario no puede realizar búsquedas de texto ni copiar o pegar en un documento que contenga solo glifos. Por lo tanto, Publisher a veces proporciona el texto Unicode, así como los glifos.

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

Los miembros de la estructura DocExComment_BeginTextRun son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentBeginTextRun.

  • lcid Especifica el LCID de la secuencia de texto.

  • cGlyphIndex Especifica el tamaño de una matriz que sigue a esta estructura. Esta matriz implementa una tabla de índice de glifos que asigna puntos de código Unicode en el texto real a los glifos correspondientes en emf. Cada elemento de la matriz corresponde a un punto de código en el texto. El valor de ese elemento especifica el primer glifo usado para representar ese punto de código en emf. Dos o más puntos de código adyacentes pueden tener el mismo valor en la matriz, lo que significa que ambos se resuelven en el mismo glifo. El valor también puede ser 0, lo que significa que este punto de código no se asigna a ningún glifo.

  • cwchActualText Especifica el tamaño de la secuencia de puntos de código Unicode que siguen la tabla de índice de glifos. Este es el texto que un consumidor del documento puede usar para buscar, copiar o pegar y accesibilidad. El valor de este miembro puede ser 0, lo que significa que no se proporciona texto Unicode.

DocExComment_EndTextRun

La estructura DocExComment_EndTextRun marca el final de una secuencia de texto, cuyo principio estaba marcado por una estructura de DocExComment_BeginTextRun .

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

Los miembros de la estructura DocExComment_EndTextRun son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentEndTextRun.

DocExComment_UnicodeForNextTextOut

La estructura DocExComment_UnicodeForNextTextOut funciona de forma similar a las estructuras DocExComment_BeginTextRun y DocExComment_EndTextRun . Sin embargo, DocExComment_UnicodeForNextTextOut especifica puntos de código Unicode solo para el siguiente registro De texto EMF, en lugar de para un bloque de contenido EMF delimitado por estructuras iniciales y finales.

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

Los miembros de la estructura DocExComment_UnicodeForNextTextOut son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentUnicodeForNextTextOut.

  • cGlyphIndex Especifica el tamaño de una matriz que sigue a esta estructura. Esta matriz implementa una tabla de índice de glifos que asigna puntos de código Unicode en el texto real a los glifos correspondientes en emf. Cada elemento de la matriz corresponde a un punto de código en el texto. El valor de ese elemento especifica el primer glifo usado para representar ese punto de código en emf. Dos o más puntos de código adyacentes pueden tener el mismo valor en la matriz, lo que significa que ambos se resuelven en el mismo glifo.

  • cwchActualText Especifica el tamaño de la secuencia de puntos de código Unicode que siguen la tabla de índice de glifos. Este es el texto que un consumidor del documento puede usar para buscar, copiar o pegar y accesibilidad.

DocExComment_EPSColor

La estructura DocExComment_EPSColor especifica información de color para un archivo PostScript encapsulado (EPS) incrustado en emf. Para obtener más información sobre esta estructura, consulte la sección Compatibilidad con colores extendidos.

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

Los miembros de la estructura DocExComment_EPSColor son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentEPSColor.

  • colorInfo[] Especifica la información de color del archivo EPS. El complemento debe pasar esta información al publicador mediante el método IMsoDocExporterSite::SetEPSInfo .

DocExComment_EPSColorCMYKJPEG

La estructura DocExComment_EPSColorCMYKJPEG especifica el inicio, en emf, de un objeto binario que es un flujo de archivo CMYKJPEG. Para obtener más información sobre esta estructura, consulte la sección Compatibilidad con colores extendidos.

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

Los miembros de la estructura DocExComment_EPSColorCMYKJPEG son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentEPSCMYKJPEG;

DocExComment_EPSColorSpotImage

La estructura DocExComment_EPSColorSpotImage proporciona información de color puntual para la imagen RGB posterior. Para obtener más información sobre esta estructura, consulte la sección Compatibilidad con colores extendidos.

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

Los miembros de la estructura DocExComment_EPSColorSpotImage son los siguientes:

  • Ident Especifica el valor constante, msodocexsignature, que identifica este comentario emf como que contiene información semántica.

  • iComment Especifica el valor MSODOCEXCOMMENT, msodocexcommentEPSSpotImage.

  • cmykAlt Especifica un identificador de color CMYK.

  • rgbAlt Especifica un identificador de color RGB.

  • flTintMin Especifica el tono mínimo.

  • flTintMax Especifica el tono máximo.

  • szSpotName[1] Especifica una cadena de longitud variable terminada en cero que contiene el nombre de spot.

Compatibilidad con colores extendidos

Para admitir espacios de color extendidos en Publisher, se necesitan registros semánticos e interfaces emf adicionales, ya que EMF solo admite colores RGB (rojo-verde-negro). Los espacios de color extendidos incluyen CMYK (cyan-magenta-yellow-black) y el espacio de color puntual, que se usan normalmente en la impresión comercial.

Publisher usa la asignación de colores para representar colores extendidos en el documento EMF. Publisher crea una tabla de colores para todos los colores usados en el documento y reemplaza los colores reales por identificadores de color en emf. El tipo del identificador de color es COLORREF, que es el mismo tipo que se usa para el color RGB. Para obtener información sobre la estructura COLORREF, vea COLORREF.

Para resolver los identificadores de color en emf de nuevo al espacio de color de extensión, el complemento vuelve a llamar a Publisher a través del método HrResolveColor de la interfaz IMsoDocExporterSite . El complemento pasa a Publisher un puntero de interfaz a una interfaz IDOCEXCOLOR como uno de los parámetros de HrResolveColor. Publisher toma los identificadores de color, también especificados en la llamada a HrResolveColor, los convierte en color extendido (RGB, CMYK o color puntual) y los pasa al complemento a través de los métodos de la interfaz IDOCEXCOLOR .

Color vectorial e imágenes recoloradas

Los colores vectoriales son los valores COLORREF que el complemento recibe del publicador. Por ejemplo, el color del texto, el color del trazo de línea y el color para volver a colorear el metarchivo. Cuando la asignación de colores está habilitada, Publisher usa un identificador de color para COLORREF en lugar de un valor de color RGB real. Si Publisher proporciona al complemento un puntero de interfaz IMsoDocExporterSite llamando al método SetDocExporterSite de la interfaz IMsoDocExporter , el complemento siempre debe llamar al método IMsoDocExporterSite::HrResolveColor para convertir colorREF en un color extendido, que el complemento recibe a través de los métodos de la interfaz IDOCEXCOLOR .

Para admitir la asignación de color vectorial, el complemento debe hacer lo siguiente:

  • Implemente la compatibilidad con clases para una interfaz IDOCEXCOLOR . Los métodos de esta interfaz permiten que Publisher devuelva el color extendido al complemento.

  • Almacene en caché los siguientes valores de estado de color de los registros semánticos de EMF.

  • Establezca el color de primer plano para volver a colorear. Esto se establece a través de la estructura DocExComment_ColorInfo .

  • Establezca el color de fondo para volver a colorear. Esto se establece a través de la estructura DocExComment_ColorInfo .

  • Determine cuándo está habilitada la asignación de colores. Esto se establece a través de la estructura DocExComment_ColorEnable .

  • Para un color vectorial, cree una interfaz IDOCEXCOLOR con el identificador de color para que IDOCEXCOLOR::GetUnresolvedRGB devuelva el identificador de color. El complemento debe llamar al método IMsoDocExporterSite::HrResolveColor con la interfaz IDOCEXCOLOR y los estados de color almacenados en caché. Publisher llama a los métodos de interfaz IDOCEXCOLOR con el color final, que puede ser RGB, CMYK, spot o matiz de registro.

  • Cuando se especifica el color de primer plano o el color de fondo para volver a colorear desde un registro semántico EMF, el complemento debe volver a colorear las imágenes en el complemento (por ejemplo, metarchivos o imágenes ráster).

Imágenes no recoloradas

EMF admite imágenes CMYK mediante GDI+. Por lo tanto, las imágenes del EMF pueden ser RGB o CMYK. Si la imagen es una imagen CMYK, el complemento debe convertir la imagen en el espacio de color de destino.

Publisher mantiene un espacio de color de destino para el documento. El complemento puede usar este espacio de color de destino llamando al método IMsoDocExporterSite::HrConvertImageColorSpace con el espacio de color de la imagen.

Color de los archivos EPS

Postscript encapsulado (EPS) es un tipo de metarchivo que admite espacios de color extendidos. El usuario que inserta imágenes EPS en un documento del publicador espera que la información de color se use en la salida de formato fijo. Dentro de Publisher, el EPS se convierte en un EMF con registros semánticos relacionados con EPS. A continuación, este EMF se inserta en el archivo EMF de página que la aplicación pasa al complemento.

Para admitir el color en archivos EPS, el complemento debe hacer lo siguiente:

  • Llame al método IMsoDocExporterSite::SetEPSInfo para DocExComment_EPSColor registros encontrados en emf.

  • Extraiga la imagen cmyk del registro de DocExComment_EPSColorCMYKJPEG en emf. Este registro contiene un objeto binario que es la secuencia de archivos JPEG de CMYK real. Úsela para reemplazar la imagen RGB especificada en la llamada posterior a la función StretchDIBits .

  • El registro DocExComment_EPSColorSpotImage proporciona información de color puntual para la imagen RGB posterior, que siempre es una imagen de índice. El complemento debe convertir la imagen puntual en el espacio de color de destino.

  • Opcionalmente, el complemento puede llamar al método IMsoDocExporterSite:: HrGetSpotRecolorInfo para obtener el color de destino del documento de Publisher. A continuación, el complemento puede volver a colorear la imagen RGB posterior mediante la asignación de colores de la paleta de la imagen RGB a los tonos flTintMin y flTintMax especificados en el registro de DoxExComment_EPSColorSpotImage . La luminosidad de cada color de la paleta se usa para la asignación.

Tenga en cuenta que el registro de DocExComment_EPSStart solo es informativo. El complemento puede omitir este registro.

SetDocExporterSite

Publisher llama a SetDocExporterSite para proporcionar al complemento un puntero a una interfaz IMsoDocExporterSite . La interfaz IMsoDocExporterSite expone métodos que habilitan la compatibilidad con colores extendida.

void SetDocExporterSite(
    IMsoDocExporterSite* pDocExporterSite
);

El parámetro pDocExporterSite especifica el puntero de interfaz a la interfaz IMsoDocExporterSite .

HrSetPageHeightForPagination

Una aplicación puede llamar al método HrSetPageHeightForPagination para especificar el alto de página en puntos.

HRESULT HrSetPageHeightForPagination(
    float dytfPageHeight
);

Algunas aplicaciones mantienen el documento del usuario en un formato no paginado. En estos casos, el complemento pagina el documento con el alto de página especificado por la aplicación en la llamada a HrSetPageHeightForPagination. El parámetro dytfPageHeight especifica el alto de la página en puntos.

Después de especificar la información de alto de página, la aplicación pasa el complemento todo el documento como un único archivo EMF en memoria en una llamada a HrAddPageFromEmf. A continuación, el complemento usa el alto de página y el archivo EMF para paginar el documento.

El complemento devuelve la información de paginación a la aplicación en llamadas posteriores al método HrGetPageBreaks .

HrGetPageBreaks

Una aplicación puede llamar al método HrGetPageBreaks para obtener el número y la ubicación de los saltos de página de los documentos paginados por el complemento.

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

Después de que el complemento pagina un documento con el alto de página especificado por el método HrSetPageHeightForPagination , devuelve la información de paginación en llamadas posteriores que la aplicación realiza al método HrGetPageBreaks .

El parámetro rgdytfPageBreaks es un puntero a una matriz de valores float que especifican las ubicaciones de los saltos de página en puntos. El primer elemento de la matriz (índice 0) es la ubicación del primer salto de página, el segundo elemento es la ubicación del segundo salto de página, etc. Por lo tanto, los valores de estos elementos aumentan sucesivamente.

El parámetro pcchPageBreaks es un puntero a un valor entero que especifica el número de saltos de página en el documento.

El parámetro pfCanTrustLastBreakIsEndOfDocument especifica si la ubicación del último salto de página es el final del documento o el principio de la última página del documento. Un valor true indica que el último salto de página es el final del documento.

La aplicación llama a HrGetPageBreaks dos veces para obtener la información de paginación. En la primera llamada, la aplicación llama a HrGetPageBreaks para obtener el número de saltos de página.

HrGetPageBreaks(NULL, &nPageBreaks, NULL);

A continuación, la aplicación llama a HrGetPageBreaks una segunda vez para obtener las ubicaciones reales. En la segunda llamada, la aplicación pasa un búfer de tamaño suficiente para contener la matriz de ubicaciones de salto de página.

HrGetPageBreaks(rgPageBreaks, &nPageBreaks, fCanStopAtLastPageBreak);

Después de recibir la información de salto de página del complemento, la aplicación vuelve a iniciar el proceso de exportación de formato fijo, empezando por una llamada al método HrCreateDoc , seguida de una llamada a HrAddPageFromEmf para cada una de las páginas proporcionadas por la información de salto de página.

HrAddOutlineNode

Publisher llama al método HrAddOutlineNode para pasar el complemento a una estructura que describe un nodo dentro de un esquema navegable por el usuario para el documento exportado.

HRESULT HrAddOutlineNode(
    int idNodeParent 
    const MSODOCEXOUTLINENODE* pNode
);    

El código de exportación de formato fijo puede usar la información pasada por el método HrAddOutlineNode para construir un esquema navegable por el usuario del documento de exportación. Desde la perspectiva del usuario, cada nodo del esquema se representa mediante un texto de título que se asigna a una ubicación determinada dentro del documento.

Cada llamada a HrAddOutlineNode especifica información para un solo nodo en este esquema. Cada nodo se identifica mediante un identificador de nodo que es único dentro del esquema. Se reserva un identificador de 0 para el nodo raíz. El esquema es jerárquico, es decir, tiene una estructura de árbol en la que cada nodo tiene un único elemento primario y cero o más nodos secundarios.

El primer parámetro de HrAddOutlineNode proporciona el identificador del nodo que es el elemento primario del nodo que se pasa.

Publisher siempre llama a HrAddOutlineNode para un nodo primario antes de llamar al método para cualquiera de los elementos secundarios del nodo primario. En otras palabras, el código de exportación está seguro de que ya tiene la información del nodo para el nodo identificado por el parámetro idNodeParent . La única excepción es la llamada inicial a HrAddOutlineNode que especifica el nodo raíz. Para esta llamada, el valor de idNodeParent es 0.

HrAddOutlineNode pasa información adicional que el código de exportación necesita para cada nodo en una estructura MSODOCEXOUTLINENODE a la que apunta el parámetro pNode.

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

Los miembros de MSODOCEXOUTLINENODE se describen de la siguiente manera:

  • idNode Identificador del nodo. Un valor de -1 indica que este nodo no puede tener nodos secundarios en el esquema. De lo contrario, este miembro tiene un valor que es único en todo el documento.

  • rgwchNodeText Cadena Unicode que representa el texto del título de cada nodo. No es necesario que este texto sea único en todo el esquema.

  • iDestPage Número de página de la página que contiene la ubicación de destino dentro del documento.

  • dytfvDestPage Alto de la página de destino en puntos. El desplazamiento especificado por el miembro dytfvDestOffset es relativo a la esquina superior izquierda de la página. Sin embargo, algunos tipos de formato fijo usan un sistema de coordenadas relativo a la esquina inferior izquierda de la página. Para estos tipos de documentos, el alto de la página es necesario para convertir el desplazamiento.

  • dxtfvDestOffset Desplazamiento horizontal de la ubicación de destino en la página de destino.

  • dytfvDestOffset Desplazamiento vertical de la ubicación de destino en la página de destino.

HrAddDocumentMetadataString

Publisher llama al método HrAddDocumentMetadataString para especificar los metadatos del documento en forma de cadena Unicode.

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

El parámetro metadatatype especifica el tipo de metadatos representado por la cadena. El parámetro metadatatype debe ser uno de los siguientes valores del tipo de enumeración MSODOCEXMETADATA.

Tabla 8. Valores enumerados de MSODOCEXMETADATA

Valor

Descripción

msodocexMetadataTitle

El título del documento.

msodocexMetadataAuthor

Autor del documento

msodocexMetadataSubject

Cadena que describe el objeto del documento (por ejemplo, la empresa o la ciencia).

msodocexMetadataKeywords

Palabra clave relevante para el contenido del documento.

msodocexMetadataCreator

El creador del documento, posiblemente distinto del autor.

msodocexMetadataProducer

El productor del documento, posiblemente distinto del autor o creador.

msodocexMetadataCategory

Cadena que describe el tipo de documento (por ejemplo, memo, artículo o libro).

msodocexMetadataStatus

Estado del documento. Este campo puede reflejar dónde se encuentra el documento en el proceso de publicación (por ejemplo, borrador o final).

msodocexMetadataComments

Comentarios varios relevantes para el documento.

Para un documento determinado, cada tipo de metadatos solo puede tener asociada una cadena. Por ejemplo, si el documento tiene varias palabras clave, se pasan al complemento como una cadena concatenada.

El parámetro pwchValue especifica una cadena Unicode que contiene los propios metadatos.

La forma en que el complemento incorpora los metadatos de cadena de texto en el documento exportado depende de los detalles de implementación del código de exportación y del tipo de formato fijo utilizado en el documento exportado.

HrAddDocumentMetadataDate

Publisher llama al método HrAddDocumentMetadataDate para especificar los metadatos del documento en forma de estructura FILETIME.

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

El parámetro metadatatype especifica el tipo de metadatos representado por la estructura FILETIME . El parámetro metadatatype debe ser uno de los siguientes valores del tipo de enumeración MSODOCEXMETADATA.

Tabla 9. Valores enumerados de MSODOCEXMETADATA

Valor

Descripción

msodocexMetadataCreationDate

Fecha de creación del documento.

msodocexMetadataModDate

Fecha de última modificación del documento.

El parámetro pftLocalTime especifica un puntero a una estructura FILETIME que contiene la información de fecha y hora de los metadatos. El siguiente fragmento de código muestra cómo extraer esta información de la estructura.

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 forma en que el complemento incorpora los metadatos de fecha y hora en el documento exportado depende de los detalles de implementación del código de exportación y del tipo de formato fijo utilizado en el documento exportado.

HrFinalize

Publisher llama al método HrFinalize al final del proceso de exportación de documentos.

HRESULT HrFinalize();

El código que implementa la exportación de formato fijo debe usar HrFinalize para realizar tareas como vaciar búferes de datos, escribir los datos restantes en el disco y liberar memoria y otros recursos.

Conclusión

Puede ampliar la característica de exportación de formato fijo de las aplicaciones de Office implementando la interfaz IMsoDocExporter . Los métodos de esta interfaz proporcionan un canal para que las aplicaciones de Office se comuniquen con el complemento el contenido visual y la información semántica del documento que se va a exportar. El contenido visual del documento se proporciona al complemento como uno o varios metarchivos mejorados en memoria. La información semántica se proporciona como registros de comentarios con formato especial dentro de este EMF. Los métodos adicionales de la interfaz permiten a las aplicaciones de Office comunicar metadatos e información estructural sobre el documento.

Recursos adicionales

Para obtener más información, consulte los recursos siguientes: