Java itext zxing 生成带中文的二维码

2022-07-25,,,,

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        String pdfPath = "C:\\Users\\Administrator\\Desktop\\新建文件夹 (2)\\完成.pdf";

        long start = System.currentTimeMillis();
        List<String> list = new ArrayList<>();
        for(int i=0;i<10000;i++){
            list.add("1、设备名称:国家新标准\n" +
                    "2、设备编号:"+i+"\n" +
                    "3、规格型号:0.075-60mm\n" +
                    "4、生产厂家:仪器设备有限公司\n" +
                    "5、进场日期:2020年12月15日\n" +
                    "6、检定单位:检测认证有限公司\n" +
                    "7、检定日期:2020年12月24日\n" +
                    "8、管理人员:张三\n" +
                    "9、存放位置:卧室");
        }
        createPdfByList(pdfPath,list);
        long end = System.currentTimeMillis();
        System.out.println("使用时间为:"+(end-start)+"毫秒");
        //有点慢啊 1秒。 一万个? 1000= 20秒 还是慢
    }

    public static void createPdfByList(String pdfPath,List<String> list){
        float pageWidth = 125f;
        float pageHeight = 200f;
        try {
            float pt = 72f / 25.4f;
            Document document = new Document(new Rectangle(pageWidth * pt, pageHeight * pt));//新建一个文档并且设置页面大小
            FileOutputStream outputStream = outputStream = new FileOutputStream(pdfPath);//新建一个pdf文档;

            PdfWriter writer = PdfWriter.getInstance(document, outputStream);//把新建的pdf 赋值给 document
            writer.setPdfVersion(PdfWriter.VERSION_1_5);
            document.open();//打开 document文档
            PdfContentByte cb = writer.getDirectContent();
            int k =0;
            for(String str: list){
                System.out.println(k++);
                document.newPage();
                String pngPath = generateQRCodeImage(str, 350, 350);
                Image image = Image.getInstance(pngPath);
                cb.addImage(image,image.getWidth(),0,0,image.getHeight(),pt*(pageWidth-image.getWidth()/pt)/2,
                        pageHeight * pt-image.getHeight());
                String [] arr = str.split("\n");
                for(int i=0;i<arr.length;i++){
                    addText(cb,15*pt,25*(arr.length-i),arr[i]);
                }
            }
            outputStream.flush();//关闭文件
            document.close();//关闭文件
            outputStream.close();//关闭文件
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public   static void addText(PdfContentByte cb,float x,float y,String content){
        if(null!=content){
            try{
                ExtendedColor baseColor=new CMYKColor(0f,0f,0f,1f);
                cb.setColorFill(baseColor);
                //使用了微软雅黑字体
                BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/msyh.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
                cb.beginText();
                //字号 19
                cb.setFontAndSize(baseFont, 19);
                cb.showTextAligned(PdfContentByte.ALIGN_LEFT,content, x, y, 0);
                cb.endText();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

    private  static String generateQRCodeImage(String text, int width, int height) throws WriterException, IOException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        Map hints = new HashMap();
        //设置UTF-8, 防止中文乱码
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        //设置二维码四周白色区域的大小
        hints.put(EncodeHintType.MARGIN, 0);
        //设置二维码的容错性
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
        long l = System.currentTimeMillis();
        String pngPath = "C:\\Users\\Administrator\\Desktop\\新建文件夹 (2)\\"+l+".png";
        Path path = FileSystems.getDefault().getPath(pngPath);
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
        return pngPath;
    }

}

 

本文地址:https://blog.csdn.net/jialan75/article/details/112006942

《Java itext zxing 生成带中文的二维码.doc》

下载本文的Word格式文档,以方便收藏与打印。