🇬🇧 Also available in English 🇬🇧
Criar QRCodes em Kotlin (e Java) é mais difícil do que deveria ser. A QRCode-Kotlin tenta trazer uma forma personalizável, simples e direta de se criar QRCodes, especialmente no backend.
É com esta missão em mente que continuamos a fazer o nosso melhor para aprender como pessoas desenvolvedoras utilizam essa biblioteca nos seus projetos e quais os seus objetivos, para podermos prover uma ferramenta/API melhor para todos. Por favor, sinta-se livre para compartilhar se e como você utiliza este projeto ^^
- Puro Kotlin: Reescrita em puro Kotlin de uma implementação de referência da spec QRCode por Kazuhiko Arase
- Leve: Sem dependencias,
~115KB
e faz o que promete no rótulo. - Fácil de usar: Rápida e facilmente tenha QRCodes com pouquíssimas linhas de código.
- Bonito: Muitas pessoas desenvolvedoras não têm tempo e às vezes conhecimento para implementar o QRCode perfeito, por isso esta biblioteca tenta gerar códigos bonitos por padrão.
- Amigável aos servidores: A versão da JVM é fortemente focada em um caso de uso pessoal onde eu precisei criar QRCodes no backend, mas todas as bibliotecas que encontrei eram complexas ou enormes, normalmente os dois.
- Multiplatforma: Esta é uma bilioteca KMP com suporte a Java, JavaScript, Android, iOS e tvOS.
A biblioteca está disponível através da Maven Central e do NPM JS, portanto basta adicioná-la a seu projeto como qualquer outra:
Gradle:
// Use esse tanto para Android quanto para a JVM
implementation("io.github.g0dkar:qrcode-kotlin:4.2.1")
Maven - JVM:
<dependency>
<groupId>io.github.g0dkar</groupId>
<artifactId>qrcode-kotlin-jvm</artifactId>
<version>4.2.1</version>
</dependency>
Maven - Android:
<dependency>
<groupId>io.github.g0dkar</groupId>
<artifactId>qrcode-kotlin-android</artifactId>
<version>4.2.1</version>
</dependency>
NodeJS:
npm install [email protected]
Browser:
<script src="https://cdn.jsdelivr.net/gh/g0dkar/qrcode-kotlin@main/release/qrcode-kotlin.min.js" type="application/javascript"></script>
Para criar QRCodes, a principal classe que deve ser usada é a qrcode.render.QRCode
. Ela tem métodos estáticos para
ajudar na criação de um QRCode da forma que você quiser:
// Use qualquer um desses:
val quadrados = QRCode.ofSquares()
val circulos = QRCode.ofCircles()
val quadradosArredondados = QRCode.ofRoundedSquares()
Com isso, você terá uma instância de QRCodeBuilder. Esta classe tem métodos para ajustar cores, tamanho, espaçamento, adicionar um logo e mais! Certifique-se de ver também a classe Colors.
Aqui tem um código para ajudar você a começar:
val helloWorld = QRCode.ofSquares()
.withColor(Colors.DEEP_SKY_BLUE) // Padrão é Colors.BLACK
.withSize(10) // Padrão é 25px
.build("Hello world!")
// Por padrão, os QRCodes serão gerados como PNG
val pngBytes = helloWorld.render()
FileOutputStream("hello-world.png").use { it.write(pngBytes) }
Recomendamos fortemente que você veja os exemplos disponíveis:
- Todas as formas: Quadrados, Círculos, Quadrados Arredondados e formas personalizadas
- Tudo sobre cores: Frente, Fundo, Fundos transparentes, cores em Gradiente Linear
- Adicionando um Logo: Adicione um logo e remova as células atrás dele, ou não :)
- QRCodes em SVG: Como estender o renderizador para criar SVG (utilizando JFree SVG)
- O banner no topo deste README: Sim, feito com essa biblioteca ^^
Os exemplos mostram praticamente tudo que pode ser feito com a biblioteca! Até mesmo como estender a mesma para criar QRCodes em SVG ;)
Você pode utilizar todas essas funcionalidades juntas e misturadas. Tente gerar o logo e banner com gradientes e tudo mais em SVG ;)
Como dito anteriormente, uma das razões principais para o desenvolvimento dessa biblioteca foi para ser usada em aplicações backend. Portanto, é natural mostrar como fazer exatamente isso :)
Este método de um controller do Spring Framework/Boot mostra como gerar QRCodes dado o conteúdo do mesmo:
import org.springframework.core.io.ByteArrayResource
import org.springframework.http.HttpHeaders.CONTENT_DISPOSITION
import org.springframework.http.MediaType.IMAGE_PNG_VALUE
@GetMapping("/qrcode")
fun generateQrCode(content: String): ResponseEntity<ByteArrayResource> {
val pngData = QRCode().ofSquares()
.build(content)
.render()
val resource = ByteArrayResource(pngData, IMAGE_PNG_VALUE)
return ResponseEntity.ok()
.header(CONTENT_DISPOSITION, "attachment; filename=\"qrcode.png\"")
.body(resource)
}
As principais mudanças vindo da versão v3.3.0
são:
- O pacote principal das classes foi mudado de
io.github.g0dkar.qrcode
para simplesmenteqrcode
- O nome anterior não ajuda linguagens que não têm esse conceito de "pacote", e outras bibliotecas Kotlin já nomeiam os seus pacotes principais dessa forma.
- A antiga classe
QRCode
foi reescrita para ser mais fácil de se criar QRCodes mais bonitos. A antiga classeQRCode
foi renomeada para QRCodeProcessor, com pouquíssimas mudanças na API.- Para a maioria dos casos de uso simples, a nova
QRCode
é compatível com a antiga!
- Para a maioria dos casos de uso simples, a nova
- Uma grande quantidade de otimizações em como o QRCode é desenhado. Anteriormente, tínhamos um canvas (ecrã) para cada quadrado, o qual era copiado no canvas do QRCode principal. Isto foi mudado para termos apenas um grande canvas onde cada quadrado individual será desenhado diretamente.
- Suporte a iOS e tvOS: A partir da versão
v4.0.7
, uma implementação experimental inicial da classeQRCodeGraphics
foi criada para que o iOS e tvOS sejam suportados. Todo e qualquer feedback é muito bem-vindo! (pode comentar em português mesmo) - Um imenso agradecimento a ruicanas por suas contribuições a essa feature :D
Copyright desde 2021 Rafael M. Lins, Licenciado sob a Licença MIT.
QR Code é marca registrada de Denso Wave, Inc.
- Kazuhiko Arase: Por sua implementação de referência!
- Paul Varry: Por abrir as primeiras issues do repositório e ajudar a fazer a biblioteca melhor para todo mundo! 😁
- Renan Lukas: Por sua amizade, paciência e ajuda com Android, Gradle e várias outras coisas mais durante o desenvolvimento das versões v2.0.0 e v3.0.0!
- Doomsdayrs: Por apontar como a biblioteca podería melhorar se tornando um projeto KMP, entre outras contribuições.
- Um incrível e peludo amigo por todo o suporte através dos anos :)
- ruicanas: Por não apenas apontar problemas com a implementação iOS, mas resolvê-los também! Muito obrigado ^^
- Se você encontrar algum bug, sinta-se livre para abrir uma Issue
- Tem sugestões? Você pode fazê-las também!
Se você gostou da biblioteca e quiser ajudar pagando um cafézinho, use os botões abaixo 🤟