자바 로 QR 코드 를 만 들 고 문자 정 보 를 첨부 합 니 다.

11753 단어 Java생 성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 코드 를 만 드 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기