Condividi tramite


Scrivere testo in un file XPS OM

In questo argomento viene descritto come scrivere testo in un file XPS OM.

Il testo viene inserito in un OM XPS creando e formattando un'interfaccia IXpsOMGlyphs e quindi aggiungendo l'interfaccia IXpsOMGlyphs all'elenco di oggetti visivi della pagina o dell'area di disegno. Ogni interfaccia IXpsOMGlyphs rappresenta un'esecuzione glifo, ovvero un'esecuzione continua di caratteri che condividono un formato comune. Quando un elemento di formato carattere (ad esempio tipo di carattere o dimensione) cambia o quando si interrompe una riga, è necessario creare e aggiungere una nuova interfaccia IXpsOMGlyphs all'elenco di oggetti visivi.

Alcune delle proprietà di un'esecuzione del glifo possono essere impostate usando i metodi dell'interfaccia IXpsOMGlyphs . Alcune proprietà, tuttavia, interagiscono con altri e devono essere impostate usando un'interfaccia IXpsOMGlyphsEditor .

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

Creare un glifo eseguito da una stringa

Un'esecuzione del glifo viene in genere creata in diversi passaggi che includono il caricamento delle risorse del tipo di carattere utilizzate dall'esecuzione del glifo, l'impostazione di un pennello di riempimento, la specifica della dimensione del carattere e la posizione iniziale e l'impostazione della stringa Unicode.

La sezione seguente dell'esempio di codice contiene una routine che accetta alcune variabili, incluse le dimensioni, il colore e la posizione del carattere e i caratteri da scrivere. Il codice crea quindi un'esecuzione del glifo e quindi la aggiunge a una pagina. Nell'esempio di codice si presuppone che si sia verificata l'inizializzazione descritta in Inizializzare un file XPS OM e che il documento abbia almeno una pagina. Per altre informazioni sulla creazione di un file XPS OM vuoto, vedere Creare un file XPS OM vuoto.

// Write Text to an XPS OM
HRESULT
WriteText_AddTextToPage(
            // A pre-created object factory
    __in    IXpsOMObjectFactory   *xpsFactory,
            // The font resource to use for this run
    __in    IXpsOMFontResource    *xpsFont,
            // The font size
    __in    float                 fontEmSize,
            // The solid color brush to use for the font
    __in    IXpsOMSolidColorBrush *xpsBrush,
            // The starting location of this glyph run
    __in    XPS_POINT             *origin,
            // The text to use for this run
    __in    LPCWSTR               unicodeString,
            // The page on which to write this glyph run
    __inout IXpsOMPage            *xpsPage        
)
{
    // The data type definitions are included in this function
    // for the convenience of this code example. In an actual
    // implementation they would probably belong in a header file.
    HRESULT                       hr = S_OK;
    XPS_POINT                     glyphsOrigin = {origin->x, origin->y};
    IXpsOMGlyphsEditor            *glyphsEditor = NULL;
    IXpsOMGlyphs                  *xpsGlyphs = NULL;
    IXpsOMVisualCollection        *pageVisuals = NULL;

    // Create a new Glyphs object and set its properties.
    hr = xpsFactory->CreateGlyphs(xpsFont, &xpsGlyphs);
    hr = xpsGlyphs->SetOrigin(&glyphsOrigin);
    hr = xpsGlyphs->SetFontRenderingEmSize(fontEmSize);
    hr = xpsGlyphs->SetFillBrushLocal(xpsBrush);

    // Some properties are inter-dependent so they
    //    must be changed by using a GlyphsEditor.
    hr = xpsGlyphs->GetGlyphsEditor(&glyphsEditor);
    hr = glyphsEditor->SetUnicodeString(unicodeString);
    hr = glyphsEditor->ApplyEdits();

    // Add the new Glyphs object to the page
    hr = xpsPage->GetVisuals(&pageVisuals);
    hr = pageVisuals->Append(xpsGlyphs);

    // Release interface pointers.
    if (NULL != xpsGlyphs) xpsGlyphs->Release();
    if (NULL != glyphsEditor) glyphsEditor->Release();
    if (NULL != pageVisuals) pageVisuals->Release();

    return hr;
}

Caricare e creare risorse

La creazione di un'interfaccia IXpsOMGlyphs richiede una risorsa carattere. In molti casi, un blocco di testo usa lo stesso tipo di carattere e lo stesso colore. Di conseguenza, questa sezione dell'esempio di codice creerà le interfacce delle risorse del tipo di carattere che verranno usate nelle chiamate che inserisce il testo nella pagina.

    // fontFileName is the name of the font file and it 
    //  is defined outside of this example.

    HRESULT                       hr = S_OK;

    GUID                          fontNameGuid;
    WCHAR                         guidString[128] = {0};
    WCHAR                         uriString[256] = {0};

    IStream                       *fontStream  = NULL;
    IOpcPartUri                   *fontUri = NULL;
    IXpsOMFontResource            *fontResource = NULL;
    IXpsOMVisualCollection        *pageVisuals = NULL;
    IXpsOMPage                    *page = NULL;
    IXpsOMVisual                  *canvasVisual = NULL;
    IXpsOMSolidColorBrush         *xpsTextColor = NULL;
    XPS_COLOR                     xpsColorBodyText;
 
    // Create font stream.
    hr = xpsFactory->CreateReadOnlyStreamOnFile ( 
        fontFileName, &fontStream );
    
    // Create new obfuscated part name for this resource using a GUID.
    hr = CoCreateGuid( &fontNameGuid );
    hr = StringFromGUID2( 
            fontNameGuid, 
            guidString, 
            ARRAYSIZE(guidString));

    // Create a URI string for this font resource that will place 
    //  the font part in the /Resources/Fonts folder of the package.
    wcscpy_s(uriString, ARRAYSIZE(uriString), L"/Resources/Fonts/");

    // Create the part name using the GUID string as the name and 
    //  ".odttf" as the extension GUID string start and ends with 
    //  curly braces so they are removed.
    wcsncat_s(uriString, ARRAYSIZE(uriString), 
        guidString + 1, wcslen(guidString) - 2); 
    wcscat_s(uriString, ARRAYSIZE(uriString), L".odttf");

    // Create the font URI interface.
    hr = xpsFactory->CreatePartUri(
        uriString,
        &fontUri);
    // Create the font resource.
    hr = xpsFactory->CreateFontResource(
        fontStream,
        XPS_FONT_EMBEDDING_OBFUSCATED,
        fontUri,
        FALSE,     // isObfSourceStream
        &fontResource);
    if (NULL != fontUri) fontUri->Release();

    // Create the brush to use for the font.
    xpsColorBodyText.colorType = XPS_COLOR_TYPE_SRGB;
    xpsColorBodyText.value.sRGB.alpha = 0xFF;
    xpsColorBodyText.value.sRGB.red = 0x00;
    xpsColorBodyText.value.sRGB.green = 0x00;
    xpsColorBodyText.value.sRGB.blue = 0x00;

    hr = xpsFactory->CreateSolidColorBrush( 
        &xpsColorBodyText,
        NULL, // This color type does not use a color profile resource.             
        &xpsTextColor);

    // xpsTextColor is released after it has been used.

Disegnare testo in una pagina

La sezione finale dell'esempio di codice crea l'esecuzione del glifo per ogni esecuzione di testo formattato in modo analogo. Per eseguire il codice in questa sezione finale, l'interfaccia xpsFactory e la risorsa carattere e un pennello di colore del testo sono necessari e devono essere state create e inizializzate. In questo esempio, la funzione descritta nella prima sezione viene usata per creare le esecuzioni del glifo e aggiungerle alla pagina.

    // The following interfaces are created outside of this example.

    // The page on which to place the text.
    IXpsOMPage                *page = NULL;

    // The object factory used by this program.
    IXpsOMObjectFactory       *xpsFactory = NULL;

    // The font resource created in the previous snippet.
    IXpsOMFontResource        *fontResource = NULL;

    // The color brush created in the previous snippet.
    IXpsOMSolidColorBrush     *xpsTextColor = NULL;

    // The following variables are defined outside of this example.

    // An array of pointers to the Unicode strings to write.
    LPCWSTR                   *textRuns = NULL;

    // An array of start points that correspond to the 
    //    strings in textRuns.
    XPS_POINT                 *startPoints = NULL;

    // The number of text runs to add to the page.
    UINT32                    numRuns = 0;            

    HRESULT                   hr = S_OK;

    FLOAT                     fontSize = 7.56f;
    UINT32                    thisRun;

    // Add all the text runs to the page.
    thisRun = 0;
    while (thisRun < numRuns) {  
        hr = WriteText_AddTextToPage(
            xpsFactory, 
            fontResource,
            fontSize,
            xpsTextColor,
            &startPoints[thisRun],
            textRuns[thisRun],
            page);
        thisRun++;
    }

Passaggi successivi

Esplorare XPS OM

Disegnare grafica in un file XPS OM

Inserire immagini in un file XPS OM

Scrivere un file XPS OM in un documento XPS

Stampare un file XPS OM

Usato in questa sezione

IOpcPartUri

IXpsOMFontResource

IXpsOMGlyphs

IXpsOMGlyphsEditor

IXpsOMObjectFactory

IXpsOMPage

IXpsOMSolidColorBrush

IXpsOMVisual

IXpsOMVisualCollection

Ulteriori informazioni

Inizializzare un file XPS OM

Informazioni di riferimento sulle API documento XPS

Specifica di carta XML