前提
SVGをcanvasを使用して画像に変換していますが、
以下の時、<text ...> の font-family が画像に反映されません。
- svg の中で <text ...> を使用している
- font-family は、adobe font である
- 日本語フォント (ex. kozuka-mincho-pro)
- adobe font は、Web プロジェクトページ で生成される script タグを使用して埋め込み
※他の自作フォントは、blob化することで、画像にもfont-familyが反映できています。
※ブラウザ上(SVGの時点)では、adobe font の font-family も反映されています。
何か知見ありましたら、アドバイスいただけると幸いです。
よろしくお願いいたします。
実現したいこと
最終的に、
- canvasで生成した画像で、<text ...>の font-familyが適用されていること
- 例えば、kozuka-mincho-pro
↓
- blob化したら解決しそうなので、adobe fonts を blob化したい
発生している問題・エラーメッセージ
SVGをcanvasで画像(png)に変換したときに、
font-familyが適用されず、デフォルト?のフォントスタイルになってしまう。
該当のソースコード
classに、.sample を指定しています。
svg
<svg ...> ... <text font-size="12" x="0" y="0" class="sample" fill="#ffffff" rorate="0" text-anchor="middle" dominant-baseline="central" > サンプルテキスト </text></svg>
試したこと
1) blob化
canvasでfont-familyを適用するには、blobにする必要があるとの、記事を見ましたので
試してみました。(adobe以外のサーバーにある自作フォントは、これで解決済)
※xxxxxxx.js は 仮です。 実際は、adobeのkitIdが入ります。
js
const svg = document.getElementById("svg_sample") const style = svg.getElementsByTagName("style")[0] const json = await axios.get(https://use.typekit.net/xxxxxxx.js, { responseType: 'blob' }) const data = json.data const blob = new Blob([data], {type: "font/woff;charset=utf-8"}) let reader = new FileReader() reader.readAsDataURL(blob) reader.onload = () => { const dataURL = reader.result const font_face_css = `@font-face { font-family: sample; src: url("${dataURL}"); }` const font_class = `.sample { font-family: sample; }` const add_html = `${font_face_css} ${font_class}` style.insertAdjacentHTML('beforeEnd', add_html); }
画像どころか、ブラウザ上でもfont-familyが反映されません。
2)text に 直接 font-family 指定
js
const svg = document.getElementById("svg_sample")const textEls = svg.getElementsByClassName(`sample`)const targetTextEl = textEls[0]targetTextEl.setAttribute("font-family", "kozuka-mincho-pro")
↓
svg
<text font-size="12" x="0" y="0" class="sample" fill="#ffffff" rorate="0" text-anchor="middle" dominant-baseline="central" font-family="kozuka-mincho-pro" // ここが追加されます > サンプルテキスト </text>
blobにしてないので、canvas処理ではfont-familyが反映されない?
補足情報(FW/ツールのバージョンなど)
Vue 3.0
SVGを画像にする方法はこちらを参考にしています(成功しています)
: https://blog.asial.co.jp/1615
0 コメント