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();
Rubriques connexes
-
Next Steps
-
Utilisé dans cette page
-
Pour plus d’informations