可以通过函数 NewTextAnnotation 在图像显示上创建文本注释,然后通过 ComponentSetFontFaceName 方法更改字体。然而,要成功地做到这一点,必须将所需字体的全名作为字符串提供,并且必须已经知道它在当前系统上可用。如果指定了不可用的字体,则似乎选择了一些默认字体,并且不会发布异常或错误消息。
有没有办法在 DM 脚本中获取可用字体列表或确定特定命名字体是否实际可用?
可以通过函数 NewTextAnnotation 在图像显示上创建文本注释,然后通过 ComponentSetFontFaceName 方法更改字体。然而,要成功地做到这一点,必须将所需字体的全名作为字符串提供,并且必须已经知道它在当前系统上可用。如果指定了不可用的字体,则似乎选择了一些默认字体,并且不会发布异常或错误消息。
有没有办法在 DM 脚本中获取可用字体列表或确定特定命名字体是否实际可用?
有趣的任务!
没有实际的脚本命令来执行此操作,安装的字体名称列表由操作系统填充。
但是,使用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。但一个问题是,这样做可能会丢失一些字符,并且可能需要仔细检查输出字体列表。