欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-28 10:11:53
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.QRCod....
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