Condividi tramite


Esplorare XPS OM

In questo argomento viene descritto come spostarsi in un file XPS OM e accedere a parti diverse del documento in memoria.

L'organizzazione dell'API documento XPS rispecchia l'organizzazione di un documento XPS. Nella tabella seguente viene illustrato il modo in cui le interfacce dell'API documento XPS sono correlate ai componenti di un documento XPS.

Componente documento XPS Interfaccia DELL'API documento XPS Metodo per chiamare il livello successivo verso il basso nella gerarchia
File di documento XPS (contiene il pacchetto OPC)
IXpsOMPackage
GetDocumentSequence
Parte FixedDocumentSequence
IXpsOMDocumentSequence
GetDocuments
Parte FixedDocument
IXpsOMDocument
GetPageReferences
Elemento PageContent nel markup FixedDocument
IXpsOMPageReference
GetPage
CollectPartResources
Parte FixedPage
IXpsOMPage
GetVisuals
Elemento Canvas nel markup FixedPage
IXpsOMCanvas
GetVisuals
Elemento Path nel markup FixedPage
IXpsOMPath
Fine della gerarchia dei documenti.
Elemento Glyphs nel markup FixedPage
IXpsOMGlyphs
Fine della gerarchia dei documenti.
Parte tipo di carattere
IXpsOMFontResource
Fine della gerarchia dei documenti.
Parte immagine
IXpsOMImageResource
Fine della gerarchia dei documenti.

Prima di usare gli esempi di codice seguenti nel programma, leggere la dichiarazione di non responsabilità nelle attività comuni di programmazione documenti XPS.

Esempio di codice

Nell'esempio di codice seguente si presuppone l'esistenza di un file XPS OM inizializzato e il pacchetto punta a un'interfaccia IXpsOMPackage che rappresenta tale OM XPS. Per informazioni sulla creazione di un file XPS OM, vedere Leggere un documento XPS in un XPS OM o Creare un XPS OM vuoto.

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

Passaggi successivi

Scrivere testo in un file XPS OM

Disegnare grafica in un file XPS OM

Inserire immagini in un file XPS OM

Utilizzato in questa pagina

IXpsOMDocument

IXpsOMDocumentCollection

IXpsOMDocumentSequence

IXpsOMFontResource

IXpsOMFontResourceCollection

IXpsOMImageResource

IXpsOMImageResourceCollection

IXpsOMPackage

IXpsOMPage

IXpsOMPageReference

IXpsOMPageReferenceCollection

IXpsOMVisual

IXpsOMVisualCollection

Ulteriori informazioni

Inizializzare un file XPS OM

Leggere un documento XPS in un file XPS OM

Creare un file XPS OM vuoto

API per la creazione di pacchetti

Informazioni di riferimento sulle API documento XPS

Specifica di carta XML