|
|
|
@ -62,7 +62,7 @@ public final class QrCodeGeneratorDemo {
|
|
|
|
|
File imgFile = new File("hello-world-QR.png"); // File path for output
|
|
|
|
|
ImageIO.write(img, "png", imgFile); // Write image to file
|
|
|
|
|
|
|
|
|
|
String svg = qr.toSvgString(4); // Convert to SVG XML code
|
|
|
|
|
String svg = toSvgString(qr, 4); // Convert to SVG XML code
|
|
|
|
|
File svgFile = new File("hello-world-QR.svg"); // File path for output
|
|
|
|
|
Files.write(svgFile.toPath(), // Write image to file
|
|
|
|
|
svg.getBytes(StandardCharsets.UTF_8));
|
|
|
|
@ -215,4 +215,41 @@ public final class QrCodeGeneratorDemo {
|
|
|
|
|
ImageIO.write(img, "png", new File(filepath));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns a string of SVG code for an image depicting the specified QR Code, with the specified
|
|
|
|
|
* number of border modules. The string always uses Unix newlines (\n), regardless of the platform.
|
|
|
|
|
* @param qr the QR Code to render (not {@code null})
|
|
|
|
|
* @param border the number of border modules to add, which must be non-negative
|
|
|
|
|
* @return a string representing the QR Code as an SVG XML document
|
|
|
|
|
* @throws NullPointerException if the QR Code is {@code null}
|
|
|
|
|
* @throws IllegalArgumentException if the border is negative
|
|
|
|
|
*/
|
|
|
|
|
private static String toSvgString(QrCode qr, int border) {
|
|
|
|
|
Objects.requireNonNull(qr);
|
|
|
|
|
if (border < 0)
|
|
|
|
|
throw new IllegalArgumentException("Border must be non-negative");
|
|
|
|
|
long brd = border;
|
|
|
|
|
StringBuilder sb = new StringBuilder()
|
|
|
|
|
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
|
|
|
|
|
.append("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n")
|
|
|
|
|
.append(String.format("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 %1$d %1$d\" stroke=\"none\">\n",
|
|
|
|
|
qr.size + brd * 2))
|
|
|
|
|
.append("\t<rect width=\"100%\" height=\"100%\" fill=\"#FFFFFF\"/>\n")
|
|
|
|
|
.append("\t<path d=\"");
|
|
|
|
|
for (int y = 0; y < qr.size; y++) {
|
|
|
|
|
for (int x = 0; x < qr.size; x++) {
|
|
|
|
|
if (qr.getModule(x, y)) {
|
|
|
|
|
if (x != 0 || y != 0)
|
|
|
|
|
sb.append(" ");
|
|
|
|
|
sb.append(String.format("M%d,%dh1v1h-1z", x + brd, y + brd));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return sb
|
|
|
|
|
.append("\" fill=\"#000000\"/>\n")
|
|
|
|
|
.append("</svg>\n")
|
|
|
|
|
.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|