Existe uma maneira de fazer o PhantomJS (ou qualquer navegador sem cabeçalho) usar um cache de fonte alternativo?

7

Existe uma maneira de fazer o PhantomJS (ou qualquer navegador sem cabeçalho) usar um cache de fonte alternativo além de /usr/share/fonts/ ? Uma maneira de usar mais fontes (por exemplo, fontes CJK) com o PhantomJS é instalá-las para este diretório. No entanto, este é um servidor compartilhado e não pode ser feito.

Não consigo encontrar um parâmetro CLI para isso. Por favor, perdoe-me se esta é uma pergunta boba.

Esta é uma versão do RedHat, e o yum e o rpm estão desativados.

Captura de tela com o PhantomJS - fontes que não estão sendo carregadas:

Resultadodesejado( link ):

RESOLVIDO:@grochmalmemostrouqueasfontespodemserinstaladasnapastainicial.Euexecuteifc-cache-vfeasfontesdosistemaeas~/.fonts/TTFfontsforamarmazenadasemcache.Porexemplo,aexecuçãodefc-list"impact" encontra a fonte Impact ( somente para uso pessoal ):

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

Eu confirmei isso com o rastreamento de pilha sugerido de forma inteligente por @grochmal:

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

e descobri que o PhantomJS está realmente procurando no meu diretório de fontes do usuário

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
...
    
por Drakes 11.08.2016 / 15:46

1 resposta

4

O PhantomJS respeita os diretórios fontconfig e até mesmo a antiga configuração de fonte font.dir / font.scale postscript. Por exemplo, eu tenho uma fonte Type 1 antiga:

$ 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

(que foi criado com o ol 'X11 mkfontdir )

E, para um melhor exemplo, copio uma fonte fotnconfig para meu diretório pessoal:

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

Agora vamos ver como o PhantomJS os usa (usando um exemplo clássico do github do PhantomJS):

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

strace imprime todas as chamadas do sistema (incluindo o acesso ao sistema de arquivos):

$ 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

E o PhantomJS foi para os diretórios de fontes e os carregou!

Eu não tenho um ~/.config/fontconfig/fonts.conf que pode ser necessário para fontes CJK (porque as podem precisam de alguma configuração real), mas você pode copiar um arquivo de /etc/fonts/conf.d/* (notavelmente alguns nonlatin font, para obter uma configuração de exemplo).

No entanto, você provavelmente pode usar a maioria das fontes simplesmente soltando-as em ~/.local/share/fonts/TTF e, em seguida, executando fc-cache .

Disclaimer: Um antigo RedHat (5 com certeza, não tenho certeza sobre 6) pode não estar usando fontconfig , é por isso que incluí a fonte PFB no exemplo. Nesse caso, você precisa usar ttmkfdir e mkfontdir para gerar os arquivos font.scale e font.dir .

Referências:

por 11.08.2016 / 17:14