Naviguer dans le modèle d’administration XPS

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

Le organization de l’API document XPS reflète la organization d’un document XPS. Le tableau suivant montre comment les interfaces de l’API document XPS sont liées aux composants d’un document XPS.

Composant de document XPS Interface d’API de document XPS Méthode à appeler pour le niveau suivant vers le bas dans la hiérarchie
Fichier de document XPS (contient le package OPC)
IXpsOMPackage
GetDocumentSequence
Composant FixedDocumentSequence
IXpsOMDocumentSequence
GetDocuments
Composant FixedDocument
IXpsOMDocument
GetPageReferences
Élément PageContent dans le balisage FixedDocument
IXpsOMPageReference
GetPage
CollectPartResources
Composant FixedPage
IXpsOMPage
GetVisuals
Élément Canvas dans le balisage FixedPage
IXpsOMCanvas
GetVisuals
Élément Path dans le balisage FixedPage
IXpsOMPath
Fin de la hiérarchie de documents.
Élément Glyphes dans le balisage FixedPage
IXpsOMGlyphes
Fin de la hiérarchie de documents.
Partie police
IXpsOMFontResource
Fin de la hiérarchie de documents.
Partie Image
IXpsOMImageResource
Fin de la hiérarchie de documents.

Avant d’utiliser les exemples de code suivants dans votre programme, lisez la clause de non-responsabilité dans Tâches de programmation de documents XPS courantes.

Exemple de code

L’exemple de code suivant suppose l’existence d’un om XPS initialisé, et le package pointe vers une interface IXpsOMPackage qui représente ce modèle d’utilisation XPS. Pour plus d’informations sur la création d’un modèle d’utilisation XPS, consultez Lire un document XPS dans un om XPS ou Créer un modèle d’utilisation 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 XPS

Dessiner des graphiques dans un MODÈLE XPS

Placer des images dans un modèle d’exploitation 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’entreprise XPS

Lire un document XPS dans un modèle de gestion XPS

Créer un MODÈLE XPS vide

API d’empaquetage

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

XML Paper Specification