Có cách nào để khiến PhantomJS (hoặc bất kỳ trình duyệt không đầu nào) sử dụng bộ đệm phông chữ thay thế không?


7

Có cách nào để khiến PhantomJS (hoặc bất kỳ trình duyệt không đầu nào) sử dụng bộ đệm phông chữ thay thế bên cạnh /usr/share/fonts/không? Một cách để sử dụng nhiều phông chữ hơn (ví dụ: phông chữ CJK) với PhantomJS là cài đặt chúng vào thư mục này. Tuy nhiên, đây là một máy chủ được chia sẻ và không thể được thực hiện.

Tôi dường như không thể tìm thấy một tham số CLI cho điều này. Xin vui lòng tha thứ cho tôi nếu đây là một câu hỏi ngớ ngẩn.

Đây là bản dựng RedHat và yum và vòng / phút bị tắt.

Ảnh chụp màn hình với PhantomJS - phông chữ không tải:

Hiển thị phông chữ không thành công

Kết quả mong muốn ( http://v1.jontangerine.com/silo/typography/web-fonts/ ):

Kết xuất phông chữ thực tế


GIẢI QUYẾT: @grochmal cho tôi thấy rằng phông chữ có thể được cài đặt trong thư mục nhà. Tôi đã chạy fc-cache -vfvà các phông chữ hệ thống và các ~/.fonts/TTFphông chữ được lưu trữ. Ví dụ: chạy fc-list "impact"tìm thấy phông chữ Impact (chỉ dành cho sử dụng cá nhân ):

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

Tôi đã xác nhận điều này với dấu vết ngăn xếp được đề xuất một cách khéo léo bởi @grochmal:

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

và phát hiện ra rằng PhantomJS thực sự đang tìm kiếm trong thư mục phông chữ người dùng của tôi

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
...

Ops, ví dụ rasterize của tôi là kém. Bạn sẽ nhận được kết quả tốt hơn với strace phantomjs rasterize.js http://v1.jontangerine.com/silo/typography/web-fonts/ file.pdf 2>&1 | grep ttf(tức là sử dụng trình duyệt để rasterize trang đó, mặc dù tôi không thấy impactphông chữ được sử dụng trên trang). Ngoài ra, hệ thống của bạn đang sử dụng fontconfigdo đó đặt phông chữ vào ~/.local/share/fonts/TTF(Tôi giả sử đó là phông chữ TTF, phải không?) An toàn hơn (và không cần sử dụng ttmkfdirhoặc mkfontdirở đó.)
grochmal

Xin lỗi nếu điều này gây nhầm lẫn, vấn đề là hiện tại * nix có hai hệ thống để quản lý phông chữ mkfontdirfontconfig. Ngoài ra, kết HomemadeApplequả trong câu trả lời của tôi xảy ra do tôi quên chạy fc-cachenên phông chữ được tải bằng tay (thay vì được lấy từ bộ đệm).
grochmal

@grochmal Bạn đã giải quyết nó. Điều này đang làm việc cho CLI trong một vỏ. Cảm ơn bạn rất nhiều
Drakes

Câu trả lời:


4

PhantomJS tôn trọng các fontconfigthư mục và thậm chí cả cấu hình phông chữ cũ font.dir/ font.scalepostcript. Ví dụ tôi có phông chữ Loại 1 cũ:

$ 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

(Điều đó đã được tạo ra với ol 'X11 mkfontdir)

Và, để có một ví dụ tốt hơn, tôi sẽ sao chép một fotnconfigphông chữ vào thư mục nhà của mình:

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

Bây giờ, hãy xem PhantomJS sử dụng chúng như thế nào (sử dụng một ví dụ cổ điển từ github PhantomJS):

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

strace in tất cả các cuộc gọi hệ thống (bao gồm cả truy cập hệ thống tập tin):

$ 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

Và PhantomJS đã đi đến các thư mục phông chữ và tải chúng!

Tôi không có cái ~/.config/fontconfig/fonts.confnào thể cần cho phông chữ CJK (vì chúng có thể cần một số cấu hình thực tế), nhưng bạn có thể sao chép một tệp từ /etc/fonts/conf.d/*(đáng chú ý là một số nonlatinphông chữ, để có được cấu hình mẫu).

Tuy nhiên, bạn có thể có thể thoát khỏi hầu hết các phông chữ bằng cách thả chúng vào ~/.local/share/fonts/TTFvà sau đó chạy fc-cache.

Tuyên bố miễn trừ trách nhiệm: Một RedHat cũ (5 chắc chắn, không chắc chắn về 6) có thể không được sử dụng fontconfig, đó là lý do tại sao tôi đưa phông chữ PFB vào ví dụ. Trong trường hợp đó, bạn cần sử dụng ttmkfdirmkfontdirtạo tệp font.scalefont.dir.

Người giới thiệu:


Bạn đã cho tôi rất nhiều thông tin tốt ở đây. Hãy để tôi thử một vài trong số những điều này và cho bạn biết làm thế nào nó đi. ^^
Drakes

Đề xuất của bạn là hữu ích, và nỗ lực của bạn được đánh giá cao. Tôi đã cố gắng tái tạo kết quả của bạn. Bạn có vui lòng xem chỉnh sửa câu hỏi của tôi không?
Drakes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.