Navegación por el OM de XPS

En este tema se describe cómo navegar por un OM XPS y acceder a diferentes partes del documento en memoria.

La organización de la API de documentos XPS refleja la organización de un documento XPS. En la tabla siguiente se muestra cómo se relacionan las interfaces de la API de documentos XPS con los componentes de un documento XPS.

Componente de documento XPS Interfaz de LA API de documentos XPS Método para llamar al siguiente nivel hacia abajo en la jerarquía
Archivo de documento XPS (contiene el paquete OPC)
IXpsOMPackage
GetDocumentSequence
Elemento FixedDocumentSequence
IXpsOMDocumentSequence
GetDocuments
Elemento FixedDocument
IXpsOMDocument
GetPageReferences
Elemento PageContent en el marcado FixedDocument
IXpsOMPageReference
GetPage
CollectPartResources
Elemento FixedPage
IXpsOMPage
GetVisuals
Elemento Canvas en el marcado FixedPage
IXpsOMCanvas
GetVisuals
Elemento Path en el marcado FixedPage
IXpsOMPath
Fin de la jerarquía de documentos.
Elemento Glyphs del marcado FixedPage
IXpsOMGlyphs
Fin de la jerarquía de documentos.
Elemento de fuente
IXpsOMFontResource
Fin de la jerarquía de documentos.
Elemento de imagen
IXpsOMImageResource
Fin de la jerarquía de documentos.

Antes de usar los siguientes ejemplos de código en el programa, lea la declinación de responsabilidades en Common XPS Document Programming Tasks.

Ejemplo de código

En el ejemplo de código siguiente se supone la existencia de un OM XPS inicializado y el paquete apunta a una interfaz IXpsOMPackage que representa ese OM XPS. Para obtener información sobre cómo crear un OM XPS, vea Leer un documento XPS en un OM XPS o Crear un OM XPS en blanco.

    HRESULT                        hr = S_OK;

    IXpsOMDocumentSequence         *docSeq = NULL;
    IXpsOMDocumentCollection       *docs = NULL;
    IXpsOMDocument                 *doc = NULL;
    IXpsOMPageReferenceCollection  *pages = NULL;
    IXpsOMPageReference            *pageRef = NULL;
    IXpsOMPage                     *page = NULL;
    IXpsOMCanvas                   *canvas = NULL;
    IXpsOMPath                     *path = NULL;
    IXpsOMPartResources            *pageParts = NULL;
    IXpsOMGlyphs                   *glyphs = NULL;
    IXpsOMFontResourceCollection   *fonts = NULL; 
    IXpsOMFontResource             *font = NULL;
    IXpsOMImageResourceCollection  *images = NULL;
    IXpsOMImageResource            *image = NULL;
    IXpsOMVisualCollection         *visuals = NULL;
    IXpsOMVisual                   *visual = NULL;

    UINT32  numDocs = 0;
    UINT32  thisDoc = 0;

    UINT32  numPageRefs = 0;
    UINT32  thisPageRef = 0;

    UINT32  numVisuals = 0;
    UINT32  thisVisual = 0;

    UINT32  numFonts = 0;
    UINT32  thisFont = 0;

    UINT32  numImages = 0;
    UINT32  thisImage = 0;

    XPS_OBJECT_TYPE  visualType;
 
    // package points to the IXpsOMPackage interface to walk.

    // Get the fixed document sequence of the package.
    hr = package->GetDocumentSequence(&docSeq);

    // Get the fixed documents in the fixed document sequence.
    hr = docSeq->GetDocuments(&docs);

    // Walk the collection of documents.
    hr = docs->GetCount(&numDocs);
    thisDoc = 0;
    while (thisDoc < numDocs) {
        hr = docs->GetAt(thisDoc, &doc);
        
        // Get the doc contents.
        hr = doc->GetPageReferences(&pages);
        
        // Walk the collection of page references
        hr = pages->GetCount(&numPageRefs);
        thisPageRef = 0;
        while (thisPageRef < numPageRefs) {
            // Get this page reference.
            hr = pages->GetAt(thisPageRef, &pageRef);

            // Get the page content of this page reference.
            {
                hr = pageRef->GetPage (&page);

                // Get the visual tree of this page.
                hr = page->GetVisuals (&visuals);
                
                // Walk the visuals.
                hr = visuals->GetCount (&numVisuals);
                thisVisual = 0;
                while (thisVisual < numVisuals) {
                    hr = visuals->GetAt (thisVisual, &visual);
                    // Get visual type.
                    hr = visual->GetType( &visualType );
                    
                    // Do other stuff with the visual.

                    // Release the visual.
                    if (NULL != visual) {visual->Release(); visual = NULL;}
                    thisVisual++; // Get next visual in collection.
                }
                if (NULL != visuals) {visuals->Release(); visuals = NULL;}
                if (NULL != page) {page->Release(); page = NULL;}
            }
            // Get the part resources used by this page.
            hr = pageRef->CollectPartResources (&pageParts);

            // Get the font resources.
            {
                hr = pageParts->GetFontResources (&fonts);
                
                // Walk the fonts.
                hr = fonts->GetCount (&numFonts);
                thisFont = 0;
                while (thisFont < numFonts) {
                    hr = fonts->GetAt(thisFont, &font);
                    if (NULL != font) {font->Release(); font = NULL;}

                    thisFont++; // Get the next font in collection.
                }
                if (NULL != fonts) {fonts->Release(); fonts = NULL;}
            }

            // Get the image resources.
            {
                hr = pageParts->GetImageResources (&images);

                // walk the images
                hr = images->GetCount (&numImages);
                thisImage = 0;
                while (thisImage < numImages) {
                    hr = images->GetAt(thisImage, &image);
                    thisImage++;
                    if (NULL != image) {image->Release(); image = NULL;}
                }
                if (NULL != images) {images->Release(); images = NULL;}
            }
            if (NULL != pageRef) {pageRef->Release(); pageRef = NULL;}
            thisPageRef++; // Get next page in doc.
        }
        if (NULL != pages) {pages->Release(); pages = NULL;}
        if (NULL != doc) {doc->Release(); doc = NULL;}
        thisDoc++; // Get next doc in collection.
    }

    // Release interface pointers.
    if (NULL != docs) docs->Release();
    if (NULL != docSeq) docSeq->Release();

Pasos siguientes

Escribir texto en un OM XPS

Dibujar gráficos en un OM XPS

Colocar imágenes en un OM XPS

Se usa en esta página

IXpsOMDocument

IXpsOMDocumentCollection

IXpsOMDocumentSequence

IXpsOMFontResource

IXpsOMFontResourceCollection

IXpsOMImageResource

IXpsOMImageResourceCollection

IXpsOMPackage

IXpsOMPage

IXpsOMPageReference

IXpsOMPageReferenceCollection

IXpsOMVisual

IXpsOMVisualCollection

Para obtener más información

Inicialización de un OM XPS

Leer un documento XPS en un OM XPS

Creación de un OM XPS en blanco

API de empaquetado

Referencia de LA API de documentos XPS

XML Paper Specification