Difference between revisions of "Fonts"

From WPKG | Open Source Software Deployment and Distribution
Jump to: navigation, search
(Example using a VBscript)
(Example using a VBscript)
Line 68: Line 68:
 
</source>
 
</source>
  
Or, to install all .ttf files from the folder containing your FontInstall.vbs script:
+
Or, to install all .ttf, .otf, .pfm, .fon files from the folder containing your FontInstall.vbs script:
  
 
<source lang="vb">
 
<source lang="vb">
Const FONTS = &H14&
+
Const FONTS = &H14&
 
+
Set objShell = CreateObject("Shell.Application")
+
Set objShell = CreateObject("Shell.Application")
Set ofso     = CreateObject("Scripting.FileSystemObject")
+
Set ofso = CreateObject("Scripting.FileSystemObject")
 
+
SourceFolder = ofso.GetParentFolderName(Wscript.ScriptFullName)
+
SourceFolder = ofso.GetParentFolderName(Wscript.ScriptFullName)
Set oSource   = objShell.Namespace(SourceFolder)
+
Set oSource = objShell.Namespace(SourceFolder)
Set oWinFonts = objShell.Namespace(FONTS)
+
Set oWinFonts = objShell.Namespace(FONTS)
 
+
' 4 f*ing lines instead of just "if (/\.ttf$/i)". I hate VBscript!!!
+
Set rxTTF = New RegExp
+
rxTTF.IgnoreCase = True
+
rxTTF.Pattern = "\.ttf$"
+
  
 +
Set regEx = New RegExp
 +
regEx.IgnoreCase = True
 +
regEx.Pattern = "([A-Za-z0-9\s]+_*?)(_[^_]*)?(\.(ttf|otf|pfm|fon))$"
 +
 
FOR EACH FontFile IN oSource.Items()
 
FOR EACH FontFile IN oSource.Items()
    ' FontFile may be without .ttf extension! Use FontFile.Path
+
fontFileName = ofso.GetFileName(FontFile.Path)
    IF rxTTF.Test(FontFile.Path) THEN
+
IF regEx.Test(fontFileName) THEN
        oWinFonts.CopyHere FontFile.Path
+
Set objMatch = regEx.Execute(fontFileName)
    END IF
+
win7FontFileName = objMatch.Item(0).Submatches(0) & objMatch.Item(0).Submatches(2)
 +
localFontPath = oWinFonts.Self.Path & "\" & fontFileName
 +
win7LocalFontPath = oWinFonts.Self.Path & "\" & win7FontFileName
 +
IF NOT ofso.FileExists(localFontPath) AND NOT ofso.FileExists(win7LocalFontPath) THEN
 +
oWinFonts.CopyHere FontFile.Path
 +
END IF
 +
END IF
 
NEXT
 
NEXT
 
</source>
 
</source>

Revision as of 19:46, 7 October 2011

This is a silent installer for distributing additional fonts. Always be sure to be entitled to use the fonts you are distributing.

Batch File Method

Basic info

To install new fonts on a Windows machine, you have to do two things:

  • copy the font file to %WINDIR%\Fonts\ directory,
  • add a registry entry.

Example Batch file

An example.bat file would look like this:

%COMSPEC% /c copy /Y "%SOFTWARE%\Fonts\*.TTF" "%WINDIR%\Fonts\"
regedit /s "%SOFTWARE%\Fonts\add-fonts.reg"


Example Registry file

An example registry file would look like this:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"Frankfurt Gothic (TrueType)"="FRANKGON.TTF"


Example XML install file for WPKG

<?xml version="1.0" encoding="UTF-8"?>
<packages>
<package id="additional-fonts" name="Additional fonts" revision="1" reboot="false" priority="950" execute="once">

  <install cmd='"%SOFTWARE%\Fonts\add-fonts.bat"' />

</package>
</packages>

VBScript Method

Example using a VBscript

The Microsoft Scripting Guys provide a .vbs solution that does not require a restart, as it copies the fonts using the shell object so windows automatically installs the new fonts.

<package id="additional-fonts" name="Additional fonts" revision="1" reboot="false" priority="950" execute="once">
  <install cmd='wscript.exe "%SOFTWARE%\Packages\Fonts\FontInstall.vbs"' />
</package>

FontInstall.vbs:

Const FONTS = &H14&

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(FONTS)
MyDir = left(Wscript.ScriptFullName,len(Wscript.ScriptFullName)- len(Wscript.ScriptName)-1)

objFolder.CopyHere MyDir &"\MyNewFont.ttf"

Or, to install all .ttf, .otf, .pfm, .fon files from the folder containing your FontInstall.vbs script:

Const FONTS	= &H14&
 
Set objShell	= CreateObject("Shell.Application")
Set ofso	= CreateObject("Scripting.FileSystemObject")
 
SourceFolder	= ofso.GetParentFolderName(Wscript.ScriptFullName)
Set oSource	= objShell.Namespace(SourceFolder)
Set oWinFonts	= objShell.Namespace(FONTS)

Set regEx	= New RegExp
regEx.IgnoreCase = True
regEx.Pattern	= "([A-Za-z0-9\s]+_*?)(_[^_]*)?(\.(ttf|otf|pfm|fon))$"
 
FOR EACH FontFile IN oSource.Items()
	fontFileName = ofso.GetFileName(FontFile.Path)
	IF regEx.Test(fontFileName) THEN
		Set objMatch = regEx.Execute(fontFileName)
		win7FontFileName = objMatch.Item(0).Submatches(0) & objMatch.Item(0).Submatches(2)
		localFontPath = oWinFonts.Self.Path & "\" & fontFileName
		win7LocalFontPath = oWinFonts.Self.Path & "\" & win7FontFileName
		IF NOT ofso.FileExists(localFontPath) AND NOT ofso.FileExists(win7LocalFontPath) THEN
			oWinFonts.CopyHere FontFile.Path
		END IF
	END IF
NEXT

Inno Method

Example Inno Setup Script

Because I had problems with the registry setting I found another way to install fonts by writing an installer. Inno Setup makes this easy and a script like the following will package a number of fonts into a pseudo-application.

[Files]
Source: C:\WINDOWS\Fonts\CALIBRI.TTF; DestDir: {fonts}; FontInstall: Calibri; Flags: onlyifdoesntexist uninsneveruninstall
Source: C:\WINDOWS\Fonts\FuturaStd-Book.otf; DestDir: {fonts}; FontInstall: FuturaStd-Book (OpenType); Flags: onlyifdoesntexist uninsneveruninstall fontisnttruetype
...

[Setup]
AppName=Font Installer
AppVerName=Font Installer 1.0
CreateAppDir=false
DisableProgramGroupPage=true
ShowLanguageDialog=no

The package definition would be

<package id="additional-fonts" name="Additional fonts" revision="10" reboot="false" priority="950">
  <check type="uninstall" condition="exists" path="Font Installer 1.0" />
  <install cmd='%SOFTWARE%\font-setup.exe /sp- /silent /norestart' />
  <upgrade cmd='%SOFTWARE%\font-setup.exe /sp- /silent /norestart' />
</package>

Example Inno Setup Script PS Type 1 Fonts

I tested this with success on Windows XP Machines with PS Type 1 Fonts. Copy the font and add the registry entry in the right section. After a reboot the font is fully installed. Adopt the silent install script for WPKG from above.

[Setup]
AppName=Font Installer
AppVerName=Font Installer 1.0
CreateAppDir=false
DisableProgramGroupPage=true
ShowLanguageDialog=no

[Files]
; FontInstall does not work with my SP3
Source: "BENSCNBL.PFB"; DestDir: "{fonts}"; Flags: onlyifdoesntexist
Source: "BENSCNBL.pfm"; DestDir: "{fonts}"; Flags: onlyifdoesntexist

[Registry]
; Create Registry entrys for the fonts
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Type 1 Installer\Type 1 Fonts"; ValueType: multisz; ValueName: "BentonSansCond Black"; ValueData: "T{break}BENSCNBL.pfm{break}BENSCNBL.PFB"; Flags: uninsdeletevalue

MS fontinst.exe Method

Microsoft has a very underused app called fontinst.exe. You can pass a .inf file as parameter to fontinst.exe and it will install a list of fonts for you.

The .inf file is formatted like this:

[fonts]
font01.TTF
font02.TTF
font03.TTF

Just pop the exe, ttf's and the inf in a folder and call it like this:

fontinst.exe /F MyFontName.inf

However, fontinst.exe appears to be a 16bit application, and will not run on an x64 system.