Встроенные шрифты в RTF

В соответствии со спецификациями rtf мы можем встроить шрифт в rtf-файл, используя управляющие слова \fontemb и \fontfile. Может кто-нибудь дать мне рабочий пример этого? Я хотел бы, чтобы файл RTF использовал шрифт, который находится в отдельном файле (т.е. файл.ttf)

1 ответ

Вы должны использовать функцию TTEmbedFont для создания данных встроенного шрифта. http://msdn.microsoft.com/en-us/library/windows/desktop/dd145145%28v=vs.85%29.aspx

Как это.

    //WRITEEMBEDPROC
    unsigned long WriteEmbedProc(void *lpvWriteStream, const void *lpvBuffer, const unsigned long cbBuffer)
    {
        BYTE *rgByte = new BYTE[cbBuffer];
        memcpy(rgByte, lpvBuffer, cbBuffer);

        //stream to store your font information
        std::ofstream *ofs = static_cast<std::ofstream*>(lpvWriteStream);

        //convert binary data to hexadeciaml, that rtf uses
        std::string byte_string = BinToHex(rgByte, cbBuffer);

        //Write formated data to your file (stream)
        for (int i = 0; i < byte_string.size(); ++i)
        {   
            *ofs << byte_string[i];
            if((i + 1) % 128 == 0)
            {
                *ofs << "\n";
            }
        }

        delete rgByte;
        return cbBuffer;
    }

   void EmbedFontWrap(HDC hdc)
   {
    ULONG ulPrivStatus = 0;
    ULONG ulStatus = 0;
    std::ofstream *lpvWriteStream = new std::ofstream("D:\\out.txt", std::ios::binary);
    USHORT *pusCharCodeSet;
    USHORT usCharCodeCount;
    USHORT usLanguage;
    LONG ret = TTEmbedFont(
        hdc,
        TTEMBED_RAW | TTEMBED_EMBEDEUDC,
        CHARSET_UNICODE,
        &ulPrivStatus,
        &ulStatus,
        WriteEmbedProc,
        lpvWriteStream,
        nullptr,
        0,
        0,
        nullptr);
    lpvWriteStream->close();
    delete lpvWriteStream;
}

Шрифт, который вы хотите встроить, должен быть установлен в качестве текущего для вашего устройства контекста с помощью функции SelectObject.

Другие вопросы по тегам