最近、会社を変わったらPCの制限が厳しくて管理者権限がありません。そうなるとフォントも自由にインストールできません。
フォントやソフトウェアは作業性に大きく影響するので、管理者権限が無いなりにも、解決策を講じようと努力したメモです。私がやったのは、exerb に特化した部分を ocra 対応に手直ししただけです。ですので、以下は私自身のためのメモです。
基本的にWin32APIでフォントを追加します。これをrubyから実行させるということです。 Windows の管理者権限ないけどフォント追加し鯛 のコードそのままですが、ソースが複数のページにまたがっているので一つにまとめてあります。
ただし、オリジナルはexerbでexe化しているようですが、ocraではそのままで上手く動きません。
myName = (defined?(ExerbRuntime))? ExerbRuntime.filepath: $0
の部分を
myName = ENV['OCRA_EXECUTABLE'] || $0
に変更します。(参考: ocra-1.2.0 Documentation , Ocraの豆知識 [環境変数:OCRA_EXECUTABLE 編] (巳2已己のメモ帳))。
これをocraでexe化して、個人的にフォントを格納してあるフォルダにコピーします。その状態からショートカットを作成して、スタートアップ(c:\Users\XXXX\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup XXXXはアカウント名)にそのショートカットをコピーか移動します。これでPC起動後ログインするとフォントが使用可能になります。
以下に完全なコードの写しを貼り付けておきます:
#!/usr/bin/ruby require 'Win32API' fontPath = String.new # if font-path is not specified as an argument, use the path where this script resides if ARGV.size != 0 fontPath = ARGV.shift else # retrieve my own name depends on whether I am .rb or .exe... # myName = (defined?(ExerbRuntime))? ExerbRuntime.filepath: $0 myName = ENV['OCRA_EXECUTABLE'] || $0 fontPath = File.dirname(myName) end objAddFontResource = Win32API.new('GDI32.DLL', 'AddFontResource', %w(p), 'i') text = String.new Dir.chdir(fontPath) { Dir.glob("*.{fon,fnt,ttf,ttc,fot,otf}", File::FNM_CASEFOLD) {|entry| if /cygwin/ =~ RUBY_PLATFORM font = `cygpath -aw #{fontPath}/#{entry}`.chomp! else font = "#{fontPath}\\#{entry}" end if File.file?(font) ret = objAddFontResource.call(font) if ret != 0 text << "%d font(s) added from #{entry}.\n" % ret else text << "adding #{entry} failed.\n" end end } } objMessageBox = Win32API.new('user32', 'MessageBox', %w(p p p i), 'i') # args: window, text, caption, type if text.size > 0 objMessageBox.call(0, text, "#{myName}", 0) # MB_OK=0 else objMessageBox.call(0, "No font specified...", "#{myName}", 0) # type = MB_OK = 0 end ########## font files with following extensions are added ## .fon ## .fnt ## .ttf ## .ttc ## .fot ## .otf ########## font files with following extensions are not added ## .mmm ## .pfb ## .pfm