web-dev-qa-db-ja.com

PhantomJS(または任意のヘッドレスブラウザ)に代替フォントキャッシュを使用させる方法はありますか?

PhantomJS(またはヘッドレスブラウザ)に/usr/share/fonts/以外の代替フォントキャッシュを使用させる方法はありますか? PhantomJSでより多くのフォント(CJKフォントなど)を使用する1つの方法は、このディレクトリに install them することです。ただし、これは共有サーバーであり、実行できません。

CLIパラメータ が見つからないようです。これがばかげた質問なら許してください。

これはRedHatビルドであり、yumとrpmは無効になっています。

PhantomJSのスクリーンショット-フォントが読み込まれていません:

Failed font rendering

望ましい結果http://v1.jontangerine.com/silo/typography/web-fonts/ ):

Actual fonts rendering


解決済み:@grochmalは、ホームフォルダーにフォントをインストールできることを示しました。 fc-cache -vfを実行したところ、システムフォントと~/.fonts/TTFフォントがキャッシュされました。たとえば、fc-list "impact"を実行すると、Impactフォントが検索されます(個人使用のみ):

> fc-list impact
Impact:style=Regular,Normal,obyčejné,Standard,Κανονικά,Normaali,Normál,Normale,Standaard,Normalny,Обычный,Normálne,Navadno,Arrunta

@grochmalによって巧みに提案されたスタックトレースでこれを確認しました。

strace ./phantomjs ../examples/rasterize.js http://example.com img.jpg 2>&1 | grep font

そして、PhantomJSが実際に私のユーザーフォントディレクトリを探していることがわかりました

open("/home/user1/.fonts/TTF/verdana.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/AndaleMo.TTF", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/arial.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/cour.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/georgia.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/impact.ttf", O_RDONLY) = 11
...
7
Drakes

PhantomJSはfontconfigディレクトリを尊重し、古いfont.dir/font.scale postscriptフォント設定も尊重します。たとえば、私は古いType 1フォントを持っています:

$ find ~/.fonts/Type1/
/home/grochmal/.fonts/Type1/
/home/grochmal/.fonts/Type1/augie___.pfb
/home/grochmal/.fonts/Type1/fonts.scale
/home/grochmal/.fonts/Type1/fonts.dir

(これはol 'X11 mkfontdirで作成されました)

そして、より良い例として、fotnconfigフォントをホームディレクトリにコピーします。

$ mkdir -p ~/.local/share/fonts/TTF
$ cp /usr/share/fonts/TTF/HomemadeApple.ttf ~/.local/share/fonts/TTF
$ fc-cache  # just in case

次に、PhantomJSがそれらをどのように使用するかを見てみましょう(PhantomJS githubの古典的な例を使用)。

$ wget https://raw.githubusercontent.com/ariya/phantomjs/master/examples/rasterize.js

straceは、すべてのシステムコール(ファイルシステムアクセスを含む)を出力します。

$ strace phantomjs rasterize.js 2>&1 | grep font | grep grochmal |grep -v cache
stat("/home/grochmal/.config/fontconfig/conf.d", 0x7ffff95fbbc0) = -1 ENOENT (No such file or directory)
stat("/home/grochmal/.config/fontconfig/conf.d", 0x7ffff95fbbc0) = -1 ENOENT (No such file or directory)
access("/home/grochmal/.config/fontconfig/conf.d", R_OK) = -1 ENOENT (No such file or directory)
access("/home/grochmal/.config/fontconfig/conf.d", R_OK) = -1 ENOENT (No such file or directory)
stat("/home/grochmal/.config/fontconfig/fonts.conf", 0x7ffff95fbbc0) = -1 ENOENT (No such file or directory)
stat("/home/grochmal/.config/fontconfig/fonts.conf", 0x7ffff95fbbc0) = -1 ENOENT (No such file or directory)
access("/home/grochmal/.config/fontconfig/fonts.conf", R_OK) = -1 ENOENT (No such file or directory)
access("/home/grochmal/.config/fontconfig/fonts.conf", R_OK) = -1 ENOENT (No such file or directory)
access("/home/grochmal/.fonts.conf.d", R_OK) = -1 ENOENT (No such file or directory)
access("/home/grochmal/.fonts.conf.d", R_OK) = -1 ENOENT (No such file or directory)
access("/home/grochmal/.fonts.conf", R_OK) = -1 ENOENT (No such file or directory)
access("/home/grochmal/.fonts.conf", R_OK) = -1 ENOENT (No such file or directory)
stat("/home/grochmal/.local/share/fonts", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/home/grochmal/.local/share/fonts", O_RDONLY|O_CLOEXEC) = 4
stat("/home/grochmal/.local/share/fonts", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/home/grochmal/.local/share/fonts", O_RDONLY|O_CLOEXEC) = 4
open("/home/grochmal/.local/share/fonts", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
stat("/home/grochmal/.local/share/fonts/HomemadeApple.ttf", {st_mode=S_IFREG|0644, st_size=110080, ...}) = 0
open("/home/grochmal/.local/share/fonts/HomemadeApple.ttf", O_RDONLY) = 6
stat("/home/grochmal/.local/share/fonts/TTF", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/grochmal/.fonts", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/home/grochmal/.fonts", O_RDONLY|O_CLOEXEC) = 4
stat("/home/grochmal/.local/share/fonts/TTF", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/home/grochmal/.local/share/fonts/TTF", O_RDONLY|O_CLOEXEC) = 4
stat("/home/grochmal/.local/share/fonts/TTF", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/home/grochmal/.local/share/fonts/TTF", O_RDONLY|O_CLOEXEC) = 4
open("/home/grochmal/.local/share/fonts/TTF", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
stat("/home/grochmal/.local/share/fonts/TTF/HomemadeApple.ttf", {st_mode=S_IFREG|0644, st_size=110080, ...}) = 0
open("/home/grochmal/.local/share/fonts/TTF/HomemadeApple.ttf", O_RDONLY) = 5
stat("/home/grochmal/.fonts/Type1", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/home/grochmal/.fonts/Type1", O_RDONLY|O_CLOEXEC) = 4

そして、PhantomJSはフォントディレクトリに行き、それらをロードしました!

CJKフォントに必要な~/.config/fontconfig/fonts.confがありませんmay(これらのmay実際の構成が必要です)が、/etc/fonts/conf.d/*からファイルをコピーできます(特に、いくつかのnonlatinフォント、構成例を取得するため)。

しかし、~/.local/share/fonts/TTFにドロップしてfc-cacheを実行するだけで、ほとんどのフォントを使いこなすことができます。

免責事項:古いRedHat(確かに5、確かに6ではない)はfontconfigを使用していない可能性があるため、例にPFBフォントを含めました。その場合、ttmkfdirおよびmkfontdirを使用してfont.scaleおよびfont.dirファイルを生成する必要があります。

参照:

4
grochmal