こちらでどうでしょうか?
案1 テーブルとしてQRが生成されるためテーブルをSVG変換
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QRコードSVG生成アプリ</title>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.7.1.min.js"></script>
<script src="https://cdn.rawgit.com/jeromeetienne/jquery-qrcode/master/jquery.qrcode.min.js"></script>
</head>
<body>
<p style="font-size: 32px;">QRコードSVG生成アプリ</p>
<input type="text" id="inputText" placeholder="QRコードに変換するテキストを入力" value="https://">
<button onclick="generateQR()">QRコード生成</button>
<div id="qrcode"></div>
<a id="downloadLink" style="display: none;">QRコードをダウンロード</a>
<script>
function generateQR() {
var inputText = $("#inputText").val();
// QRコードを生成
$("#qrcode").empty().qrcode({
text: inputText,
render: 'table',
fill: '#000',
background: '#fff',
size: 256
});
var svgString = convertDomIntoSVG($("#qrcode table"));
// ダウンロードリンクの表示
var svgString = $("#qrcode svg")[0].outerHTML;
var fileName = "QRcode_" + inputText + "_" + generateRandomString() + ".svg"; // ファイル名の生成
var downloadLink = document.getElementById("downloadLink");
downloadLink.href = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(svgString);
downloadLink.download = fileName;
downloadLink.innerText = "QRコードをダウンロード"; // リンクのテキストを設定
downloadLink.style.display = "inline"; // displayをinlineに変更
}
function generateRandomString() {
return Math.random().toString(36).substring(2, 8); // ランダムな文字列を生成
}
//---------------------------------
//HTML要素をSVG要素に変換
//引数1:$dom html dom
//返り値:svgの要素
//---------------------------------
function convertDomIntoSVG(dom) {
let width = dom.get(0).scrollWidth;
let height = dom.get(0).scrollHeight;
let svgString = "<svg xmlns='http://www.w3.org/2000/svg' width='" + width + "' height='" + height + "'>" +
"<foreignObject width='100%' height='100%'>" +
"<div xmlns='http://www.w3.org/1999/xhtml'>" +
dom.prop('outerHTML') +
"</div>" +
"</foreignObject>" +
"</svg>";
document.getElementById("qrcode").innerHTML = svgString;
}
</script>
</body>
</html>
案2別のライブラリを利用
https://github.com/datalog/qrcode-svg?tab=readme-ov-file
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QRコードSVG生成アプリ</title>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.7.1.min.js"></script>
<script src="https://cdn.rawgit.com/jeromeetienne/jquery-qrcode/master/jquery.qrcode.min.js"></script>
<script src="https://datalog.github.io/demo/qrcode-svg/qrcode.min.js"></script>
</head>
<body>
<p style="font-size: 32px;">QRコードSVG生成アプリ</p>
<input type="text" id="inputText" placeholder="QRコードに変換するテキストを入力" value="https://">
<button onclick="generateQR()">QRコード生成</button>
<div id="qrcode"></div>
<a id="downloadLink" style="display: none;">QRコードをダウンロード</a>
<script>
function generateQR() {
var inputText = $("#inputText").val();
// QRコードを生成
$("#qrcode").empty;
var svg = new QRCode({
msg: inputText,
dim: 300,
pad: 6,
mtx: 7,
ecl: "H",
ecb: 0,
pal: ["#000000", "#fff"],
vrb: 1
})
$("#qrcode").append(svg);
// ダウンロードリンクの表示
var svgString = $("#qrcode svg")[0].outerHTML;
var fileName = "QRcode_" + inputText + "_" + generateRandomString() + ".svg"; // ファイル名の生成
var downloadLink = document.getElementById("downloadLink");
downloadLink.href = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(svgString);
downloadLink.download = fileName;
downloadLink.innerText = "QRコードをダウンロード"; // リンクのテキストを設定
downloadLink.style.display = "inline"; // displayをinlineに変更
}
function generateRandomString() {
return Math.random().toString(36).substring(2, 8); // ランダムな文字列を生成
}
</script>
</body>
</html>
修正案
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QRコードSVG生成アプリ</title>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.7.1.min.js"></script>
<script src="https://cdn.rawgit.com/jeromeetienne/jquery-qrcode/master/jquery.qrcode.min.js"></script>
</head>
<body>
<p style="font-size: 32px;">QRコードSVG生成アプリ</p>
<input type="text" id="inputText" placeholder="QRコードに変換するテキストを入力" value="https://">
<button onclick="generateQR()">QRコード生成</button>
<div id="qrcode"></div>
<div id="svgarea"></div>
<a id="downloadLink" style="display: none;">QRコードをダウンロード</a>
<script>
function generateQR() {
var inputText = $("#inputText").val();
// QRコードを生成
$("#qrcode").empty().qrcode({
text: inputText,
render: 'canvas',
fill: '#000',
background: '#fff',
size: 256
});
$("#qrcode canvas").css('display', 'none');
createSVG($("#qrcode canvas")[0]);
// ダウンロードリンクの表示
var svgString = $("#qrcode svg")[0].outerHTML;
var fileName = "QRcode_" + inputText + "_" + generateRandomString() + ".svg"; // ファイル名の生成
var downloadLink = document.getElementById("downloadLink");
downloadLink.href = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(svgString);
downloadLink.download = fileName;
downloadLink.innerText = "QRコードをダウンロード"; // リンクのテキストを設定
downloadLink.style.display = "inline"; // displayをinlineに変更
}
function generateRandomString() {
return Math.random().toString(36).substring(2, 8); // ランダムな文字列を生成
}
function createSVG(canvas) {
var width = canvas.width;
var height = canvas.height;
// SVGのnamespace付きでElementを作成する
var svg = createElement("svg", { width: width, height: height, xmlns: "http://www.w3.org/2000/svg", "xmlns:xlink": "http://www.w3.org/1999/xlink" });
$("#qrcode").append(svg); // "#qrcode" 配下にsvgを追加する
var defs = createElement("defs");
svg.appendChild(defs);
// fill用にpatternを作成
var pattern = createElement("pattern", { id: "img", x: 0, y: 0, width: width, height: height, patternUnits: "userSpaceOnUse" });
defs.appendChild(pattern);
// patternに使うimageを作成
var image = createElement("image", { x: 0, y: 0, width: width, height: height });
image.setAttribute("href", canvas.toDataURL()); // xlink:hrefをhrefに変更
pattern.appendChild(image);
// 角丸の四角形を作り、上のパターンで塗りつぶす
var rect = createElement("rect", { x: 0, y: 0, width: width, height: height, rx: 0, ry: 0, fill: "url(#img)" });
svg.appendChild(rect);
};
// SVGのnamespace付きでElementを作成する
function createElement(tag, attributes) {
var ret = document.createElementNS("http://www.w3.org/2000/svg", tag);
if (ret && attributes) {
for (var key in attributes) {
var value = attributes[key];
ret.setAttribute(key, value);
}
}
return ret;
};
</script>
</body>
</html>
QRをSVGで生成
利用ライブラリ:https://www.jsdelivr.com/package/npm/qrcode-svg
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QRコードSVG生成アプリ</title>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.7.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/qrcode-svg@1.1.0/lib/qrcode.min.js"></script>
</head>
<body>
<p style="font-size: 32px;">QRコードSVG生成アプリ</p>
<input type="text" id="inputText" placeholder="QRコードに変換するテキストを入力" value="https://">
<button onclick="generateQR()">QRコード生成</button>
<div id="qrcode"></div>
<a id="downloadLink" style="display: none;">QRコードをダウンロード</a>
<script>
function generateQR() {
// 入力値
var inputText = $("#inputText").val();
// QRコードのパラメータ
const param = {
content: inputText,
padding: 0,
width: 256,
height: 256,
color: "#000000",
background: "#ffffff",
ecl: "M",
join: true,
};
// QRコードを初期化し、SVGを生成
$("#qrcode").empty().append(new QRCode(param).svg());
// ダウンロードリンクの表示
var svgString = $("#qrcode svg")[0].outerHTML;
var fileName = "QRcode_" + inputText + "_" + generateRandomString() + ".svg"; // ファイル名の生成
var downloadLink = document.getElementById("downloadLink");
downloadLink.href = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(svgString);
downloadLink.download = fileName;
downloadLink.innerText = "QRコードをダウンロード"; // リンクのテキストを設定
downloadLink.style.display = "inline"; // displayをinlineに変更
}
function generateRandomString() {
return Math.random().toString(36).substring(2, 8); // ランダムな文字列を生成
}
</script>
</body>
</html>