Freigeben über


Navigieren im XPS-OM

In diesem Thema wird beschrieben, wie Sie in einem XPS-OM navigieren und auf verschiedene Teile des Speicherdokuments zugreifen können.

Die Organisation der XPS-Dokument-API spiegelt die Organisation eines XPS-Dokuments wieder. In der folgenden Tabelle wird veranschaulicht, wie sich die Schnittstellen der XPS-Dokument-API auf die Komponenten eines XPS-Dokuments beziehen.

XPS-Dokumentkomponente XPS-Dokument-API-Schnittstelle Methode zum Aufrufen der nächsten Ebene in der Hierarchie
XPS-Dokumentdatei (enthält OPC-Paket)
IXpsOMPackage-
GetDocumentSequence-
FixedDocumentSequence-Teil
IXpsOMDocumentSequence
GetDocuments-
FixedDocument-Teil
IXpsOMDocument-
GetPageReferences-
PageContent--Element im FixedDocument-Markup
IXpsOMPageReference
GetPage-
CollectPartResources-
FixedPage-Webpart
IXpsOMPage-
GetVisuals-
Canvas--Element im FixedPage-Markup
IXpsOMCanvas
GetVisuals-
Path-Element im FixedPage-Markup
IXpsOMPath-
Ende der Dokumenthierarchie.
Glyphen Element im FixedPage-Markup
IXpsOMGlyphen
Ende der Dokumenthierarchie.
Schriftartteil
IXpsOMFontResource-
Ende der Dokumenthierarchie.
Bildteil
IXpsOMImageResource-
Ende der Dokumenthierarchie.

Bevor Sie die folgenden Codebeispiele in Ihrem Programm verwenden, lesen Sie den Haftungsausschluss in Common XPS Document Programming Tasks.

Codebeispiel

Im folgenden Codebeispiel wird davon ausgegangen, dass ein initialisiertes XPS-OM vorhanden ist, und Paket- verweist auf eine IXpsOMPackage Schnittstelle, die xpS OM darstellt. Informationen zum Erstellen eines XPS-OM finden Sie unter Lesen eines XPS-Dokuments in einem XPS-OM- oder Erstellen eines leeren XPS-OM-.

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

Nächste Schritte

Schreiben von Text in ein XPS-OM-

Zeichnen von Grafiken in einem XPS OM-

Platzieren von Bildern in einem XPS OM-

auf dieser Seite

IXpsOMDocument-

IXpsOMDocumentCollection-

IXpsOMDocumentSequence

IXpsOMFontResource-

IXpsOMFontResourceCollection-

IXpsOMImageResource-

IXpsOMImageResourceCollection-

IXpsOMPackage-

IXpsOMPage-

IXpsOMPageReference

IXpsOMPageReferenceCollection-

IXpsOMVisual-

IXpsOMVisualCollection-

Weitere Informationen

Initialisieren eines XPS-OM-

Lesen eines XPS-Dokuments in ein XPS OM-

Erstellen eines leeren XPS-OM-

Verpackungs-API-

XPS-Dokument-API-Referenz

XML Paper Specification