前提と注意事項
以下が前提と注意事項になります。
- Next.js のバージョンは 14.0.5
- Tailwind を使用しています。
- QR コード生成のために
qrcode.react
というパッケージを使用します。 以下がqrcode.react
の公式リポジトリです。
なお、もし Next.js で QR コードを読み取る機能を実装したい場合は、以下に別途まとめていますので必要な方は見てみてください。
この記事のゴール
以下の画像のように、Next.js で QR コードを生成し、それをダウンロードできるようにします。
qrcode.react をインストールする
npm
かyarn
を使って qrcode.react
のパッケージをインストールします。
$ npm install qrcode.react
# or
$ yarn add qrcode.react
以上でqrcode.react
のインストールは完了です。
QR コードを生成するコンポーネントを作成する
以下のように、適当な場所に QR コードを生成して表示するためのコンポーネントを作成します。
'use client';
import { QRCodeCanvas } from 'qrcode.react';
export default function Generator({ content }: { content: string }) {
const getQRCodeImage = async () => {
const canvas = document.querySelector('canvas');
if (canvas) {
const dataURL = canvas.toDataURL('image/png');
const link = document.createElement('a');
link.download = 'QRCode.png';
link.href = dataURL;
link.click();
}
};
return (
<div className='p-8'>
<QRCodeCanvas
value={content}
size={256}
bgColor={'#FFFFFF'}
fgColor={'#000000'}
level={'L'}
includeMargin={false}
/>
<button
className='bg-blue-500 hover:bg-blue-700 text-white text-sm font-bold py-1 px-2 rounded my-2'
onClick={() => getQRCodeImage()}
>
QRコードダウンロード
</button>
</div>
);
}
上記は、QR コードに含める文字列をcontent
として受け取って、それを元に QR コードを生成して表示するコンポーネントです。また、表示した QR コードの下にはダウンロードボタンを設置しています。
qrcode.react
で設定できるオプションは色々ありますが、今回は以下のように設定しています。
value
: QR コードに含める文字列size
: QR コードのサイズbgColor
: QR コードの背景色fgColor
: QR コード部分の色level
: QR コードの誤り訂正レベル。L
,M
,Q
,H
のいずれかを指定できます。左から右に行くほど誤り訂正レベルが高くなります。includeMargin
: QR コードの周りに余白を設けるかどうか。このオプションは廃止予定で、代わりにmarginSize
が使えるようになります。ただし、marginSize
が使用できる v4.0 は記事公開時点ではまだリリースされていません。
QR コードに画像を含める
以下のようにimageSettings
を指定することで QR コードの中央に画像を含めることができます。
<QRCodeCanvas
value={content}
size={256}
bgColor={'#FFFFFF'}
fgColor={'#000000'}
level={'L'}
includeMargin={false}
imageSettings={{
src: '/next.svg',
x: 20,
y: 50,
height: 48,
width: 48,
excavate: true,
}}
/>
上記で設定しているimageSettings
の各オプションは以下の通りです。
src
: QR コードに含める画像のパスx
: 画像を配置する x 座標。デフォルトでは中央。y
: 画像を配置する y 座標。デフォルトでは中央。height
: 画像の高さ。width
: 画像の幅excavate
: 画像を最前面にするかどうか
v4.0 ではimageSettings
でopacity
を設定でき、透過率の指定もできるようです。
上記の設定だと以下のように表示されます。
動作確認
あとは以下のように適当なページにて、前節で作成したコンポーネントGenerator
を使用して動作確認を行います。
// import先は適宜置き換えてください。
import Generator from './components/Qrcode/Generator';
export default function Home() {
return (
<main>
<div>
<Generator content={'test'} />
</div>
</main>
);
}
上記のページにアクセスすると、冒頭に載せたイメージ画像が表示され、ダウンロードボタンを押すと、QR コードをダウンロードできます。
まとめ
任意の文字列を使って QR コードを生成し、それをダウンロードできるようにする方法を解説しました。 これによって例えば QR コードを使って、イベントの出欠用の QR コードをお客さん毎に発行してメールに含めて送信したり、従業員用の QR コードを生成して QR コードリーダーで読み取って退勤管理するなど色々な用途に使用できます。