1

可以通过函数 NewTextAnnotation 在图像显示上创建文本注释,然后通过 ComponentSetFontFaceName 方法更改字体。然而,要成功地做到这一点,必须将所需字体的全名作为字符串提供,并且必须已经知道它在当前系统上可用。如果指定了不可用的字体,则似乎选择了一些默认字体,并且不会发布异常或错误消息。

有没有办法在 DM 脚本中获取可用字体列表或确定特定命名字体是否实际可用?

4

1 回答 1

2

有趣的任务!

没有实际的脚本命令来执行此操作,安装的字体名称列表由操作系统填充。

但是,使用Powershell和脚本命令LaunchExternal()可以构建一种解决方法

经过反复试验,我想我可以通过以下脚本使其工作:

void WriteFontListToDisk( string fileName )
{
    String PSscript
    PSscript += "[System.Reflection.Assembly]::LoadWithPartialName('System.Drawing');"
    PSscript += "(New-Object System.Drawing.Text.InstalledFontCollection).Families "
    PSscript += " | out-file -encoding ASCII " + fileName           // Need to specify ASCII here!

    String callString
    callString += "powershell"
    //callString += " -NoExit"          // Keep Powershell open
    callString += " -Command &{ "
    callString += PSscript
    callString += " }"
    LaunchExternalProcess( callString, 5 )
}

TagGroup ReadFontListFromFile( string fileName )
{
    TagGroup tg = NewTagList()
    if ( !DoesFileExist( fileName ) ) Throw( "Font list file not found:\n" + fileName )
    number fileID = OpenFileForReading( fileName )
    object fileStream = NewStreamFromFileReference( fileID, 1 )
    result("\n SIZE:" + fileStream.StreamGetSize()  )
    // Output format is
    //  #1:(empty)
    //  #2: Name                                                                           
    //  #3: ----
    //  #4+: FontNames
    string line
    for( number i=0;i<3;i++) fileStream.StreamReadTextLine( 0, line )

    number inc = 0
    while( fileStream.StreamGetPos() != fileStream.StreamGetSize() )
    {
        if ( !fileStream.StreamReadTextLine( 0, line ) ) break;
        tg.TagGroupInsertTagAsString( Infinity(), line )
        if ( ShiftDown() ) exit(0)
    }

    return tg
}

TagGroup GetFontList()
{
    TagGroup tg = NewTagGroup()
    string fileName = "C:\\FontNamesList.txt"
    if ( DoesFileExist( fileName ) ) DeleteFile( fileName )
    WriteFontListToDisk( fileName )
    tg = ReadFontListFromFile( fileName )
    if ( DoesFileExist( fileName ) ) DeleteFile( fileName )
    return tg
}

GetFontList().TagGroupOpenBrowserWindow( "Fonts" , 0 )

值得注意的是,默认情况下,PowerShell 将文本输出流式传输为 UNICODE,并且在 DM 中不能很好地使用文本导入。但是,这个问题很有帮助,上面的脚本将输出设置为 ASCII。但一个问题是,这样做可能会丢失一些字符,并且可能需要仔细检查输出字体列表。

于 2016-12-12T21:58:34.980 回答