割烹エディター 紹介カードを作ってみる
こんにちは。
今回は小説の紹介文やレビューを画像化させるためのツールを作ってみたいと思います。
基本方針
出力は1ページ。スマホで見た時に画面に収まるようにしたい。
最大400文字くらい、改行ありで余裕をもって入れられるようにしたい。
使用用途は小説書き出し、またはレビュー用。
フォントを選択できるようにする。
文字色や背景色を変えられるようにする。
パラメータ
レイアウト 縦とか横とか
ヘッダー(文字)
フッター(文字)
本文(文字)
文字色(CSS)
背景色(CSS)
フォント(CSS)
実装
HTMLから画像への変換はSVGからキャンバス出力で実現させます。
function saveSvg(selector, fileName){
const svg = document.querySelector(selector);
const svgData = new XMLSerializer().serializeToString(svg);
const canvas = document.createElement("canvas");
canvas.width = 540 ;// svg.width.baseVal.value;
canvas.height = 775 ;// svg.height.baseVal.value;
const ctx = canvas.getContext("2d");
const image = new Image;
image.onload = function(){
ctx.drawImage( image, 0, 0 );
const a = document.createElement("a");
a.href = canvas.toDataURL("image/png");
a.download = fileName+'.png';
a.click();
}
image.src = "data:image/svg+xml;charset=utf-8;base64," + btoa(unescape(encodeURIComponent(svgData)));
}
あるSVGを指定してそれをimageにしてダウンロードしています。
<svg id="wrapper-svg" viewBox="0 0 400 574" style="font-family:sans-serif;width:100%;background: #f9f9f9;line-height: 1.5;font-size: 16px;white-space: pre-wrap;line-break:strict;word-break:break-word;overflow-wrap: break-word;word-wrap:break-word;" xmlns="http://www.w3.org/2000/svg">
<foreignObject width="352" height="24" x="24" y="502" style="overflow: hidden;text-align: center;">
<div id="output-header-text">走れメロス</div>
</foreignObject>
<foreignObject width="352" height="24" x="24" y="526" style="overflow: hidden;text-align: center;">
<div id="output-footer-text">冒頭より</div>
</foreignObject>
<foreignObject width="352" height="452" x="24" y="32" style="overflow: hidden">
<div id="output-text">※これはサンプルです。
メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。
メロスには政治がわからぬ。
メロスは、村の牧人である。
笛を吹き、羊と遊んで暮して来た。
けれども邪悪に対しては、人一倍に敏感であった。
</div>
</foreignObject>
</svg>
SVGでテキストを扱う場合、改行とか色々とややこしいのでforeignObjectを埋め込んでその中にテキストを入れるようにしました。サイズと位置を指定することができるので便利です。
はみ出た部分はhiddenで隠します。
あとはカスタマイズ用の部分を作って変更があればsvgの要素へ反映されるようにします。
今後の課題
Webフォントの読み込みが画像に反映されない
svgからcanvasに変換するときはインストールされているフォントで表示されるのでWebフォントを使った場合は反映されないです。
選べるレイアウトが少ない
文庫メーカーみたいに色々なレイアウトを選べるようにしたいです。サイズも今は固定なので柔軟に対応できるようにしたいですね。
背景画像が使えない
今は文字だけなので背景画像も使えるようにしたいです
設定が保存できない
カスタマイズしても次に来た時に、初期化されるので自分独自の設定を保存できるようにしたいです。
色々と課題はあるので、少しずつ改善していきたいと思います。
良ければサポートお願いします。サポート費用はサーバー維持などの開発費に使わせていただきます。