Gerador de QR Codes em Kotlin com ZXing
\n\nQR Codes (Quick Response) tornaram-se parte essencial do mundo digital moderno. Eles são usados para compartilhar rapidamente links, dados de contato, senhas de Wi-Fi e outras informações. Se você está desenvolvendo um aplicativo em Kotlin — seja para Android, backend (Ktor, Spring) ou desktop (Compose Desktop) — pode precisar incorporar a funcionalidade de geração de QR Codes. Neste artigo, veremos como criar um gerador de QR Codes simples e eficiente em Kotlin, usando a popular biblioteca ZXing (Zebra Crossing).
\n\nPor que ZXing?
\nZXing é uma biblioteca multifuncional para leitura e escrita de códigos de barras e QR Codes. Ela é escrita em Java, o que a torna perfeitamente compatível com Kotlin. As principais vantagens são:
\n- \n
- Suporte a vários formatos: QR Code, Data Matrix, Aztec, PDF417 e outros. \n
- Alta performance e personalização. \n
- Comunidade ativa e atualizações regulares. \n
- Facilidade de integração em projetos Kotlin. \n
Adicionando a biblioteca
\nPara começar, adicione a dependência ao seu build.gradle.kts (se você usa Gradle):
dependencies {\n implementation("com.google.zxing:core:3.5.3")\n implementation("com.google.zxing:javase:3.5.3") // para trabalhar com BufferedImage\n}\nSe você está escrevendo uma aplicação de servidor em Ktor ou Spring, essas dependências funcionarão. Para Android, você pode usar o módulo android-core, mas na maioria dos casos core é suficiente.
Gerador básico de QR Code
\nVamos criar a classe QRCodeGenerator, que receberá o texto e retornará uma imagem do QR Code como BufferedImage.
import com.google.zxing.BarcodeFormat\nimport com.google.zxing.EncodeHintType\nimport com.google.zxing.qrcode.QRCodeWriter\nimport com.google.zxing.common.BitMatrix\nimport java.awt.image.BufferedImage\nimport java.util.*\n\nclass QRCodeGenerator {\n\n fun generateQRCode(text: String, width: Int = 300, height: Int = 300): BufferedImage {\n // Configuração de codificação e nível de correção de erros\n val hints = EnumMap<EncodeHintType, Any>(EncodeHintType::class.java).apply {\n put(EncodeHintType.CHARACTER_SET, "UTF-8")\n put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H) // Alto\n put(EncodeHintType.MARGIN, 1) // Margens ao redor do QR Code\n }\n\n val writer = QRCodeWriter()\n val bitMatrix: BitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, width, height, hints)\n\n // Conversão de BitMatrix para BufferedImage\n val image = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)\n for (x in 0 until width) {\n for (y in 0 until height) {\n image.setRGB(x, y, if (bitMatrix.get(x, y)) 0xFF000000.toInt() else 0xFFFFFFFF.toInt())\n }\n }\n return image\n }\n}\nExplicação:
\n- \n
QRCodeWriter— classe ZXing responsável por criar a matriz de pontos. \n BitMatrix— matriz binária, ondetruesignifica pixel preto. \n - Definimos a codificação UTF-8 e o nível máximo de correção de erros (H — 30% de danos). \n
- A imagem é salva no formato ARGB com esquema de cores preto e branco. \n
Salvando em arquivo (PNG)
\nPara salvar o QR Code gerado em um arquivo, use javax.imageio.ImageIO:
import java.io.File\nimport javax.imageio.ImageIO\n\nfun saveQRCodeToFile(text: String, filePath: String) {\n val generator = QRCodeGenerator()\n val image = generator.generateQRCode(text)\n val outputFile = File(filePath)\n ImageIO.write(image, "png", outputFile)\n println("QR Code salvo: ${outputFile.ab