Navegación por el OM de XPS
En este tema se describe cómo navegar por un OM XPS y acceder a diferentes partes del documento en memoria.
La organización de la API de documentos XPS refleja la organización de un documento XPS. En la tabla siguiente se muestra cómo se relacionan las interfaces de la API de documentos XPS con los componentes de un documento XPS.
Componente de documento XPS | Interfaz de LA API de documentos XPS | Método para llamar al siguiente nivel hacia abajo en la jerarquía |
---|---|---|
Archivo de documento XPS (contiene el paquete OPC) |
IXpsOMPackage |
GetDocumentSequence |
Elemento FixedDocumentSequence |
IXpsOMDocumentSequence |
GetDocuments |
Elemento FixedDocument |
IXpsOMDocument |
GetPageReferences |
Elemento PageContent en el marcado FixedDocument |
IXpsOMPageReference |
GetPage CollectPartResources |
Elemento FixedPage |
IXpsOMPage |
GetVisuals |
Elemento Canvas en el marcado FixedPage |
IXpsOMCanvas |
GetVisuals |
Elemento Path en el marcado FixedPage |
IXpsOMPath |
Fin de la jerarquía de documentos. |
Elemento Glyphs del marcado FixedPage |
IXpsOMGlyphs |
Fin de la jerarquía de documentos. |
Elemento de fuente |
IXpsOMFontResource |
Fin de la jerarquía de documentos. |
Elemento de imagen |
IXpsOMImageResource |
Fin de la jerarquía de documentos. |
Antes de usar los siguientes ejemplos de código en el programa, lea la declinación de responsabilidades en Common XPS Document Programming Tasks.
Ejemplo de código
En el ejemplo de código siguiente se supone la existencia de un OM XPS inicializado y el paquete apunta a una interfaz IXpsOMPackage que representa ese OM XPS. Para obtener información sobre cómo crear un OM XPS, vea Leer un documento XPS en un OM XPS o Crear un OM XPS en blanco.
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();
Temas relacionados
-
Pasos siguientes
-
Se usa en esta página
-
Para obtener más información