Generador de códigos QR en Kotlin: biblioteca ZXing y consejos de implementación

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Generador de códigos QR en Kotlin con ZXing

\n\n

Los códigos QR (Quick Response) se han convertido en una parte esencial del mundo digital moderno. Se utilizan para intercambiar rápidamente enlaces, datos de contacto, contraseñas Wi-Fi y otra información. Si estás desarrollando una aplicación en Kotlin — ya sea para Android, backend (Ktor, Spring) o escritorio (Compose Desktop) — es posible que necesites incorporar funcionalidad de generación de códigos QR. En este artículo, veremos cómo crear un generador de códigos QR simple y eficiente en Kotlin utilizando la popular biblioteca ZXing (Zebra Crossing).

\n\n

¿Por qué ZXing?

\n

ZXing es una biblioteca multifuncional para leer y escribir códigos de barras y códigos QR. Está escrita en Java, lo que la hace idealmente compatible con Kotlin. Las principales ventajas son:

\n
    \n
  • Soporte para varios formatos: código QR, Data Matrix, Aztec, PDF417 y otros.
  • \n
  • Alto rendimiento y personalización.
  • \n
  • Comunidad activa y actualizaciones periódicas.
  • \n
  • Facilidad de integración en proyectos Kotlin.
  • \n
\n\n

Conexión de la biblioteca

\n

Para empezar, agrega la dependencia a tu build.gradle.kts (si usas Gradle):

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

Si estás escribiendo una aplicación de servidor en Ktor o Spring, estas dependencias son adecuadas. Para Android, puedes usar el módulo android-core, pero en la mayoría de los casos core es suficiente.

\n\n

Generador básico de código QR

\n

Creemos una clase QRCodeGenerator que tomará un texto y devolverá una imagen de código QR 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        // Configuración de codificación y nivel de corrección de errores\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) // Márgenes alrededor del código QR\n        }\n\n        val writer = QRCodeWriter()\n        val bitMatrix: BitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, width, height, hints)\n\n        // Conversión de BitMatrix a 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

Explicación:

\n
    \n
  • QRCodeWriter — clase de ZXing responsable de crear la matriz de puntos.
  • \n
  • BitMatrix — matriz binaria, donde true significa píxel negro.
  • \n
  • Establecemos la codificación UTF-8 y el nivel máximo de corrección de errores (H — 30% de daños).
  • \n
  • La imagen se guarda en formato ARGB con un esquema de color blanco y negro.
  • \n
\n\n

Guardar en archivo (PNG)

\n

Para guardar el código QR generado en un archivo, usa 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("Código QR guardado: ${outputFile.ab                    

Recommendations