Freigeben über


Navigieren im XPS-OM

In diesem Thema wird beschrieben, wie Sie durch ein XPS-OM navigieren und auf verschiedene Teile des In-Memory-Dokuments zugreifen.

Die organization der XPS-Dokument-API spiegelt die organization 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-Teil
IXpsOMPage
GetVisuals
Canvas-Element im FixedPage-Markup
IXpsOMCanvas
GetVisuals
Path-Element im FixedPage-Markup
IXpsOMPath
Ende der Dokumenthierarchie.
Glyphenelement 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 unter Allgemeine XPS-Dokumentprogrammierungsaufgaben.

Codebeispiel

Im folgenden Codebeispiel wird davon ausgegangen, dass eine initialisierte XPS-OM vorhanden ist, und das Paket verweist auf eine IXpsOMPackage-Schnittstelle , die diese XPS OM darstellt. Informationen zum Erstellen eines XPS-OM finden Sie unter Lesen eines XPS-Dokuments in ein 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();

Next Steps

Schreiben von Text in ein XPS-OM

Zeichnen von Grafiken in einem XPS-OM

Platzieren von Bildern in einem XPS-OM

Wird auf dieser Seite verwendet

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

Verpacken von APIs

XPS-Dokument-API-Referenz

XML Paper Specification