Для установки шрифтов типа 1 необходимо выполнить следующие действия:
- Зарегистрировать заголовок шрифта в разделе «Шрифты Type 1»
- Скопировать как PFM, так и PFB в окнакаталог шрифтов
- вызов метода AddFontResource
Зарегистрируйте заголовок шрифта в разделе «Тип 1 шрифтов»
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Type 1 Installer\Type 1 Fonts
Требуется заголовок шрифта. Вместо того, чтобы предоставлять его установщику, следующий фрагмент кода позволит вам прочитать заголовок шрифта из PFM.Он основан на информации, полученной из следующего источника:
http://partners.adobe.com/public/developer/en/font/5178.PFM.pdf
private static string GetType1FontName(string filename)
{
StringBuilder postscriptName = new StringBuilder();
FileInfo fontFile = new FileInfo(filename);
using (FileStream fs = fontFile.OpenRead())
{
using (StreamReader sr = new StreamReader(fs))
{
using (BinaryReader inStream = new BinaryReader(fs))
{
// PFM Header is 117 bytes
inStream.ReadBytes(117); // skip 117
short size = inStream.ReadInt16();
int extMetricsOffset = inStream.ReadInt32();
int extentTableOffset = inStream.ReadInt32();
inStream.ReadBytes(4); // skip 4
int kernPairOffset = inStream.ReadInt32();
int kernTrackOffset = inStream.ReadInt32();
int driverInfoOffset = inStream.ReadInt32();
fs.Position = driverInfoOffset;
while (inStream.PeekChar() != 0)
{
postscriptName.Append(inStream.ReadChar());
}
}
}
}
return postscriptName.ToString();
}
Скопируйте PFM и PFB в каталог шрифтов Windows
Согласно этому блогу http://www.atalasoft.com/cs/blogs/stevehawley/archive/2008/08/25/getting-the-fonts-folder.aspx правильный способ получить папку шрифтов Windows выглядит следующим образом:
[DllImport("shell32.dll")]
private static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken,
uint dwFlags, [Out] StringBuilder pszPath);
public static string GetFontFolderPath()
{
StringBuilder sb = new StringBuilder();
SHGetFolderPath(IntPtr.Zero, 0x0014, IntPtr.Zero, 0x0000, sb);
return sb.ToString();
}
Вызовите метод AddFontResource
Наконец, должен быть вызван метод AddFontResource, параметр lpFilename должен состоять из файлов pfm и pfb, разделенных символом канала '|'.В моем случае я поставил полный путь к папке шрифтов Windows, которая, кажется, работает.После вызова AddFontResource вам нужно вызвать PostMessage с параметром WM.FONTCHANGE (0x001D), чтобы сообщить другим окнам об изменении.
[DllImport("gdi32.dll")]
static extern int AddFontResource(string lpFilename);
// build the name for the api "<pfm>|<pfb>"
string apiValue = string.Format("{0}|{1}", PfmFileDestination, PfbFileDestination);
// Call the api to register the font
int retVal = AddFontResource(apiValue);
// Inform other windows of change
PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero);