Gerador de QR Codes em Kotlin: biblioteca ZXing e dicas de implementação

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Gerador de QR Codes em Kotlin com ZXing

\n\n

QR 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\n

Por que ZXing?

\n

ZXing é 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
\n\n

Adicionando a biblioteca

\n

Para começar, adicione a dependência ao seu build.gradle.kts (se você usa Gradle):

\n
dependencies {\n    implementation("com.google.zxing:core:3.5.3")\n    implementation("com.google.zxing:javase:3.5.3") // para trabalhar com BufferedImage\n}
\n

Se 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.

\n\n

Gerador básico de QR Code

\n

Vamos criar a classe QRCodeGenerator, que receberá o texto e retornará uma imagem do QR Code como BufferedImage.

\n
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}
\n

Explicação:

\n
    \n
  • QRCodeWriter — classe ZXing responsável por criar a matriz de pontos.
  • \n
  • BitMatrix — matriz binária, onde true significa 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
\n\n

Salvando em arquivo (PNG)

\n

Para salvar o QR Code gerado em um arquivo, use javax.imageio.ImageIO:

\n
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                    

Recommendations