QRコードをSVGで書き出せば、拡大しても輪郭は崩れません。しかし「ベクター画像であること」と「実際の印刷物を読み取れること」は別問題です。
一括生成では、画質だけでなく次の事故も起きます。
- CSVのヘッダーまでQRコードになった
- 2列目のメモも別のQRとして処理された
- 出力ファイルと元データの対応が分からなくなった
- 画面では読めたが、実寸印刷では読めなかった
- 一部だけフォールバック画像になっていた
この記事では、複数のURLをSVGで一括生成し、ZIPの構造確認、対応表の検査、実寸印刷テストまでを一つの手順にします。
1. 入力データを「1セル1コンテンツ」にする
入力は1列だけにし、ヘッダーを削除します。
https://example.org/manual/item-001
https://example.org/manual/item-002?lang=ja
https://example.org/support/item-003
一括ツールによっては、CSVやExcelの「空でない各セル」を順番に読み取ります。その場合、url というヘッダーや隣のメモ列もQRコードになります。
生成前に、空でない項目数を記録しておきます。上の例なら期待値は3です。
長いURL、クエリ文字列を含むURL、日本語テキストなど、密度が高くなりやすい値もテスト用データに含めます。短いURLだけで合格させると、本番の最も難しいコードを見落とします。
2. 共通設定でSVGを一括生成する
以下の手順では、CSV・Excel・TXT・貼り付け入力に対応する日本語の一括QRコード生成ツールを使います。最大1,000件をブラウザ内で処理でき、SVGをZIPで取得できます。
設定は次のようにしました。
- 出力形式: SVG
- 前景色: 濃色
- 背景色: 明色
- 余白: 0にせず、明確なクワイエットゾーンを残す
- 誤り訂正: ロゴなしはMを基準に確認
- ロゴを使う場合: 小さくし、Hで再テスト
- 形状: 最初の基準テストは標準の四角
一括生成では、同じ設定が全QRコードに適用されます。最も密度の高いデータでも読める設定を基準にするほうが安全です。
3. ZIPの内容を機械的に確認する
ダウンロード名は qr-codes-batch-[timestamp].zip の形式です。最新のZIPを変数に入れます。
zip_file="$(ls -t qr-codes-batch-*.zip | head -n 1)"
unzip -l "$zip_file"
期待する構造は次のとおりです。
images/qr-001.svg
images/qr-002.svg
images/qr-003.svg
index.csv
index.txt
index.html
README.txt
画像数を数えます。
unzip -Z1 "$zip_file" \
| awk '/^images\/qr-[0-9]+\.svg$/ { count++ } END { print count+0 }'
この値を、生成前に記録した入力件数と比較します。
次にインデックスを確認します。
unzip -p "$zip_file" index.csv | sed -n '1,6p'
index.csv には、生成時刻、連番、ファイル名、パス、形式、状態、元コンテンツが入ります。最低限、次を確認します。
- 行数が入力件数と一致する
- 最初と最後のコンテンツが元データと一致する
-
filenameとpathの連番が飛んでいない -
statusがすべてgeneratedになっている
fallback があれば、その行は選択形式で正常生成できなかったことを示します。見た目だけで流さず、対象の入力値と設定を調べます。
4. SVGの外形だけを先に検査する
SVGはテキストなので、展開後に viewBox とサイズ指定を確認できます。
work_dir="$(mktemp -d)"
unzip -q "$zip_file" -d "$work_dir"
rg -n '<svg|viewBox|width=|height=' "$work_dir/images" | head -n 12
ここで確認できるのは、SVGとしての外形です。これだけでは読み取り成功を証明できません。クワイエットゾーン、コントラスト、データ密度、印刷サイズ、素材、照明、カメラ性能は別に検証します。
5. 代表3件で実寸のテストシートを作る
全件を印刷する前に、次の3件だけでテストします。
- 最も短いURL
- 最も長い、または密度の高いデータ
- ロゴや装飾を使う場合は、その最終デザイン
典型的な短いURLなら、まず30mm角前後を開始点として試せます。ただし、これは普遍的な最小サイズではありません。長いデータ、低コントラスト、曲面、遠距離、光沢素材では、より大きなサイズが必要です。
テストシートには、QR画像の下に qr-001.svg のようなファイル名を印字します。スキャン結果と index.csv を照合できるからです。
6. 成功条件を先に決める
「1回読めた」だけでは判定が曖昧です。例えば次の条件を決めます。
- 2種類以上の端末で読む
- 正面と斜めから読む
- 想定する距離で読む
- 通常照明と弱い照明で読む
- 光沢がある場合は反射が出る角度でも読む
- 最も密度の高いコードを必ず含める
ラベルなら曲面や軽いしわ、掲示物なら実際の設置距離も再現します。失敗したら、装飾を減らす、コントラストを上げる、余白を増やす、サイズを大きくする、またはエンコードする文字列を短くする、という順で原因を切り分けます。
7. 静的QRと更新可能なリンクを分ける
SVGであっても、静的QRの内容は画像内に固定されています。印刷後にリンク先が変わる可能性があるなら、一括生成の前に更新可能なリダイレクトやDynamic QRを使うか判断します。
逆に、商品ID、固定マニュアルURL、教室内の固定テキストなど、内容が変わらないものは静的QRがシンプルです。
まとめ
一括QR生成で重要なのは、生成ボタンより前後の検査です。
- 入力は1セル1コンテンツにする
- 期待件数を先に記録する
- SVGでも高コントラストと余白を守る
- ZIPの画像数と
index.csvを照合する -
fallbackを見逃さない - 最も難しい3件を実寸で印刷する
- 複数端末、角度、照明、距離で成功条件を確認する
SVGは拡大に強い形式ですが、読み取り品質を自動で保証するものではありません。元データ、出力マッピング、実寸印刷の3段階を分けて確認すると、一括生成の事故をかなり減らせます。