1

我有一个项目需要从磁盘加载 Postscript 字体。我发现我可以使用“AddFontFile”。做一些研究,我发现我必须将两种字体http://msdn.microsoft.com/en-us/library/system.drawing.text.privatefontcollection.addfontfile.aspx放在一起,所以我尝试了:

fontCollection = new PrivateFontCollection();
fontCollection.AddFontFile(@"C:\Temp\Font\myfont.PFM|C:\Temp\Font\myfont.PFB");

我收到错误“路径中的非法字符”。我不确定我是否正确地使用了这两种字体。

任何帮助都会很棒,我应该提到我们仍然在 XP 上,不确定这是否会有所不同。

麦克风

4

2 回答 2

0

文件名中不能有竖线|字符。PrivateFontCollection.AddFontFile需要有效的文件路径。因此,您的“路径中的非法字符”异常。MSDN 的输入是A String that contains the file name of the font to add. 尝试一次传递一个文件 - 我不知道这个管道的想法..

至于您对 Postscript 的要求,备注部分指出OpenTypes的支持有限。

于 2013-09-24T17:11:26.440 回答
0

经过一番搜索,我让它工作了,我想分享一下我是如何解决这个问题的:AddFontFile 是错误的 API,我需要使用 AddFontResource 来代替

            String fontPath = @"C:\Temp\Font2\GXSTRA03.PFM|C:\Temp\Font2\GXSTRA03.PFB";
            int result = AddFontResource(fontPath);
            long msg = SendMessage(HWND_BROADCAST, WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero);

删除字体资源

RemoveFontResource(@"C:\Temp\Font2\GXSTRA03.PFM|C:\Temp\Font2\GXSTRA03.PFB");
long msg = SendMessage(HWND_BROADCAST, WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero);

如果有人不熟悉进行外部 WinApi 调用,这里是我使用的导入和导入 DLL 代码

using System.Runtime.InteropServices;

private static uint WM_FONTCHANGE = 0x1D;

        Import("gdi32.dll")]
        static extern int AddFontResource(string lpFilename);

        [DllImport("gdi32.dll")]
        static extern bool RemoveFontResource(string lpFileName);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

此字体现在显示在 word 和记事本等中。

于 2013-10-18T15:10:42.400 回答