자바 로 QR 코드 를 만 들 고 문자 정 보 를 첨부 합 니 다.
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
2.QR 코드 생 성2.1 실체 클래스 만 들 기
코드 는 다음 과 같 습 니 다:
@Data
public class QRCodeUser {
private String userName;
private String userCode;
private String url; //
}
2.2 QRcodeUtil 만 들 기코드 는 다음 과 같 습 니 다:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.*;
import java.util.List;
import javax.imageio.ImageIO;
import com.demo.demo.mapper.AssetsVo;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.lang3.StringUtils;
public class QRCodeUtil {
// ,
private static final int QRCOLOR = 0xFF000000; //
private static final int BGWHITE = 0xFFFFFFFF; //
private static final int WIDTH = 180; //
private static final int HEIGHT = 180; //
//
private static final int userNameHigh = 10;
private static final int userCodehigh = -20;
//
private static final int strWidth = 130;
/** QR
* com.google.zxing.EncodeHintType: ,
* EncodeHintType.CHARACTER_SET:
* EncodeHintType.ERROR_CORRECTION:
* ErrorCorrectionLevel: ,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction
* , L , , ,
* EncodeHintType.MARGIN: , , ,
* */
private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
private static final long serialVersionUID = 1L;
{
put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// QR (H )
put(EncodeHintType.CHARACTER_SET, "utf-8");//
put(EncodeHintType.MARGIN, 0);
}
};
/**
*
*/
private static BufferedImage createQr(QRCodeUser qrCodeUser, Font font) throws WriterException{
//
String userName = " :"+qrCodeUser.getUserName();
String userCode = "T :"+qrCodeUser.getUserName();
String qrurl = qrCodeUser.getUrl(); //
/**
* MultiFormatWriter: , , encode ,
* encode(String contents,BarcodeFormat format,int width, int height,Map<EncodeHintType,?> hints)
* contents: /
* format: , ,
* width:
* height:
* hints:
* BarcodeFormat: , , 1 ,2
* BitMatrix: ( ) 2D ,
*/
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
/** : , , , ,
* BitMatrix get(int x, int y) , , true, ,
* BufferedImage setRGB(int x, int y, int rgb)
* x: ,
* y: ,
* rgb: , 16 , 0xFFFFFF
*/
BitMatrix bm = multiFormatWriter.encode(qrurl, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
//
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// Bitmap , (0xFFFFFFFF) (0xFF000000)
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) {
image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);
}
}
int height = image.getHeight();
// ------------------------------------------ -------------------------------------------------
if (StringUtils.isNotEmpty(qrCodeUser.getUserCode())) {
//
BufferedImage outImage = new BufferedImage(600, 350, BufferedImage.TYPE_4BYTE_ABGR);
//
Graphics2D outg = outImage.createGraphics();
// X Y ,
outg.drawImage(image, 10, 30, image.getWidth(), image.getHeight(), null);
//
outg.setColor(Color.BLACK);
// 、 、
outg.setFont(font);
//
int userNameWidth = outg.getFontMetrics().stringWidth(userName);
int userCodeWidth = outg.getFontMetrics().stringWidth(userCode);
//drawString( 、x 、y ) ,
outg.drawString(userName, 300 - userNameWidth / 2, height - userNameHigh); //
outg.drawString(userCode, 300 - userCodeWidth / 2, height - userCodehigh); //
// : outg.drawString(depatmentName, 65 - strWidth / 2, height + (outImage.getHeight() - height) / 2 - h3);
outg.dispose();
outImage.flush();
image = outImage;
}
image.flush();
return image;
}
}
이때 QR 코드 는 이미 생 성 할 수 있다.2.3 단일 QR 코드 생 성
/**
* @author: zyf
* @date: 2021/4/27
* Description: ,
**/
public void drawLogoQRCode(QRCodeUser qrCodeUser) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream("D:"+ File.separator+" " + qrCodeUser.getUserCode() + ".png"); // ,
Font fontChinese = new Font(" ", Font.BOLD, 28);
BufferedImage image = QRCodeUtil.createQr(qrCodeUser,fontChinese);
boolean crateQRCode = ImageIO.write(image, "png", fileOutputStream);
}catch (WriterException | IOException e) {
log.error(" IO ",e);
}finally {
try {
if (null != fileOutputStream){
fileOutputStream.flush();
fileOutputStream.close();
}
}catch (IOException ioe){
log.error(" ",ioe);
}
}
}
2.4 QR 코드 대량 생산
/**
* @author: zyf
* @date: 2021/4/27
* Description: ,
**/
public void drawLogoQRCode(List<QRCodeUser> qrCodeUserList) {
FileOutputStream fileOutputStream = null;
// ,
try {
for(QRCodeUser qrCodeUser:qrCodeUserList){
fileOutputStream = new FileOutputStream("D:"+ File.separator+" " + qrCodeUser.getUserCode() + ".png"); // ,
Font fontChinese = new Font(" ", Font.BOLD, 28);
// image , , PDF
BufferedImage image = QRCodeUtil.createQr(qrCodeUser,fontChinese);
//
boolean crateQRCode = ImageIO.write(image, "png", fileOutputStream);
}
}catch (WriterException | IOException e) {
log.error(" IO ",e);
}finally {
try {
if (null != fileOutputStream){
fileOutputStream.flush();
fileOutputStream.close();
}
}catch (IOException ioe){
log.error(" ",ioe);
}
}
}
3.QR 코드 를 생 성하 여 PDF 파일 에 쓰기3.1 도입 의존
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
3.2 대체 도구 클래스 의 drawLogoQRcode 방법
public static void drawLogoQRCode(OutputStream outputStream, QrCodeUser qrCodeUser) {
try {
Font fontChinese = new Font(" ", Font.BOLD, 28);
BufferedImage image = createQr(qrCodeUser,fontChinese);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //
boolean createQRCode = ImageIO.write(image, "png", byteArrayOutputStream);
if(!createQRCode){
log.error(" ");
}
/* pdf*/
Document document = new Document(PageSize.A4, 0, 0, 0, 0);
PdfWriter.getInstance(document, outputStream); // pdf
document.open(); //
/*pdf */
com.lowagie.text.Image image2 = com.lowagie.text.Image.getInstance(byteArrayOutputStream.toByteArray());
float documentWidth = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin();
float documentHeight = documentWidth / 300 * 80;//
image2.scaleAbsolute(documentWidth, documentHeight);//
document.add(image2);
document.close(); //
byteArrayOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
3.3 PDF 중국어 난 장 판 해결
Linux docker , , , PDF
Linux /usr/share/fonts/ , windows ,
Docker ,
![ ](https://img-blog.csdnimg.cn/20210428225743647.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjAxNDA3NQ==,size_16,color_FFFFFF,t_70)
자바 로 QR 코드 를 만 들 고 문자 정 보 를 첨부 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 로 QR 코드 를 만 드 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.