diff --git a/generator/src/main/java/net/codecrete/qrbill/generator/OutputSize.java b/generator/src/main/java/net/codecrete/qrbill/generator/OutputSize.java index 62b1c59..f1bc7b0 100644 --- a/generator/src/main/java/net/codecrete/qrbill/generator/OutputSize.java +++ b/generator/src/main/java/net/codecrete/qrbill/generator/OutputSize.java @@ -36,5 +36,13 @@ public enum OutputSize { * optionally for the scissors. *
*/ - QR_BILL_EXTRA_SPACE + QR_BILL_EXTRA_SPACE, + + /** + * QR code only with 5mm of white space on all sides (56 by 56 mm). + *+ * This format applies a white background (as opposed to a transparent one). + *
+ */ + QR_CODE_WITH_QUIET_ZONE } diff --git a/generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java b/generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java index e5c9d86..2c4cecb 100644 --- a/generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java +++ b/generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java @@ -80,6 +80,19 @@ public class QRBill { */ public static final double QR_CODE_HEIGHT = 46; + /** + * The width of the QR code with quiet zone, in mm + * + * @see OutputSize#QR_CODE_WITH_QUIET_ZONE + */ + public static final double QR_CODE_WITH_QUIET_ZONE_WIDTH = 56; + + /** + * The height of the QR code with quiet zone, in mm + * + * @see OutputSize#QR_CODE_WITH_QUIET_ZONE + */ + public static final double QR_CODE_WITH_QUIET_ZONE_HEIGHT = 56; private QRBill() { // do not instantiate @@ -208,6 +221,14 @@ private static void validateAndGenerate(Bill bill, Canvas canvas) throws IOExcep if (bill.getFormat().getOutputSize() == OutputSize.QR_CODE_ONLY) { QRCode qrCode = new QRCode(cleanedBill); qrCode.draw(canvas, 0, 0); + + } else if (bill.getFormat().getOutputSize() == OutputSize.QR_CODE_WITH_QUIET_ZONE) { + QRCode qrCode = new QRCode(cleanedBill); + canvas.startPath(); + canvas.addRectangle(0, 0, QR_CODE_WITH_QUIET_ZONE_WIDTH, QR_CODE_WITH_QUIET_ZONE_HEIGHT); + canvas.fillPath(0xffffff, false); + qrCode.draw(canvas, 5, 5); + } else { BillLayout layout = new BillLayout(cleanedBill, canvas); layout.draw(); @@ -278,6 +299,10 @@ private static Canvas createCanvas(BillFormat format) throws IOException { drawingWidth = QR_CODE_WIDTH; drawingHeight = QR_CODE_HEIGHT; break; + case QR_CODE_WITH_QUIET_ZONE: + drawingWidth = QR_CODE_WITH_QUIET_ZONE_WIDTH; + drawingHeight = QR_CODE_WITH_QUIET_ZONE_HEIGHT; + break; case A4_PORTRAIT_SHEET: default: drawingWidth = A4_PORTRAIT_WIDTH; diff --git a/generator/src/test/java/net/codecrete/qrbill/generatortest/QRCodeTest.java b/generator/src/test/java/net/codecrete/qrbill/generatortest/QRCodeTest.java index 15f5d85..f4ee545 100644 --- a/generator/src/test/java/net/codecrete/qrbill/generatortest/QRCodeTest.java +++ b/generator/src/test/java/net/codecrete/qrbill/generatortest/QRCodeTest.java @@ -54,4 +54,13 @@ void qrCodeAsSVG4() { byte[] svg = QRBill.generate(bill); FileComparison.assertFileContentsEqual(svg, "qrcode_ex4.svg"); } + + @Test + void qrCodeWithQuietZone() { + Bill bill = SampleData.getExample3(); + bill.getFormat().setOutputSize(OutputSize.QR_CODE_WITH_QUIET_ZONE); + bill.getFormat().setGraphicsFormat(GraphicsFormat.SVG); + byte[] svg = QRBill.generate(bill); + FileComparison.assertFileContentsEqual(svg, "qrcode_quiet_zone.svg"); + } } diff --git a/generator/src/test/resources/qrcode_quiet_zone.svg b/generator/src/test/resources/qrcode_quiet_zone.svg new file mode 100644 index 0000000..544b2f0 --- /dev/null +++ b/generator/src/test/resources/qrcode_quiet_zone.svg @@ -0,0 +1,135 @@ + + +