Naviguer dans le modèle d’objet XPS

Cette rubrique explique comment naviguer dans un modèle OM XPS et accéder aux différentes parties du document en mémoire.

L’organisation de l’API de document XPS reflète l’organisation d’un document XPS. Le tableau suivant illustre la relation entre les interfaces de l’API de document XPS et les composants d’un document XPS.

Composant document XPS Interface de l’API de document XPS Méthode à appeler pour le niveau supérieur suivant dans la hiérarchie
Fichier de document XPS (contient le package OPC)
IXpsOMPackage
GetDocumentSequence
Partie FixedDocumentSequence
IXpsOMDocumentSequence
GetDocuments
FixedDocument, partie
IXpsOMDocument
GetPageReferences
Élément PageContent dans le balisage FixedDocument
IXpsOMPageReference
GetPage
CollectPartResources
FixedPage, partie
IXpsOMPage
GetVisuals
Élément Canvas dans le balisage FixedPage
IXpsOMCanvas
GetVisuals
Élément path dans le balisage FixedPage
IXpsOMPath
Fin de la hiérarchie des documents.
Élément Glyphs dans le balisage FixedPage
IXpsOMGlyphs
Fin de la hiérarchie des documents.
Partie de la police
IXpsOMFontResource
Fin de la hiérarchie des documents.
Partie de l’image
IXpsOMImageResource
Fin de la hiérarchie des documents.

Avant d’utiliser les exemples de code suivants dans votre programme, lisez l’exclusion de responsabilité dans les tâches de programmation de document XPS courantes.

Exemple de code

L’exemple de code suivant suppose l’existence d’un modèle d’objet XPS initialisé, et le package pointe vers une interface IXpsOMPackage qui représente ce modèle d’objet XPS. Pour plus d’informations sur la création d’un modèle d’objet XPS, consultez lire un document XPS dans un modèle d’objet XPS ou créer un modèle d’objet XPS vide.

    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();

Next Steps

Écrire du texte dans un modèle d’objet XPS

Dessiner des graphiques dans un modèle d’objet XPS

Placer des images dans un modèle d’objet XPS

Utilisé dans cette page

IXpsOMDocument

IXpsOMDocumentCollection

IXpsOMDocumentSequence

IXpsOMFontResource

IXpsOMFontResourceCollection

IXpsOMImageResource

IXpsOMImageResourceCollection

IXpsOMPackage

IXpsOMPage

IXpsOMPageReference

IXpsOMPageReferenceCollection

IXpsOMVisual

IXpsOMVisualCollection

Pour plus d’informations

Initialiser un modèle d’objet XPS

Lire un document XPS dans un modèle d’objet XPS

Créer un modèle d’objet XPS vide

API d’empaquetage

Informations de référence sur l’API de document XPS

XML Paper Specification