图片转PDF

<!--图片转pdf-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.1.2</version>
        </dependency>
 /**
     * 生成pdf流
     * @param dataList
     * @param outputStream
     */
    public void printToPdf(List<SettlementDocumentItemDto> dataList, OutputStream outputStream) throws Exception{
        //原图
        var imgName = "jsd1.jpg";
        ClassPathResource classPathResource = new ClassPathResource(imgName);

        //坐标填充
        List<com.itextpdf.text.Image> images = dataList.stream().map(data -> {
            com.itextpdf.text.Image image = null;
            try {
                BufferedImage bufferedImage = ImageIO.read(classPathResource.getInputStream());
                Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
                g2d.setColor(Color.BLACK);
                g2d.setStroke(new BasicStroke(5));
                g2d.setFont(new Font("宋体", Font.PLAIN, 23));
                convertGraphics2D(data, g2d);

                //压缩图片,通过压缩图片质量,保持原图大小
                JPEGImageWriteParam imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);
                imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT); // 指定压缩方式为MODE_EXPLICIT
                imgWriteParams.setCompressionQuality((float)0);                  // 指定压缩的程度,参数qality是取值0~1范围内,
                imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);

                var formatName = imgName.contains(".jpg") ? "PNG" : "JPG";
                ImageWriter imgWrier = ImageIO.getImageWritersByFormatName(formatName).next();
                imgWrier.reset();
                ByteArrayOutputStream imageOutputStream = new ByteArrayOutputStream();
                imgWrier.setOutput(ImageIO.createImageOutputStream(imageOutputStream)); // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何 OutputStream构造
                IIOImage iioImage = new IIOImage(bufferedImage, null, null);
                imgWrier.write(null, iioImage, imgWriteParams); // 调用write方法,就可以向输入流写图片

                //ImageIO.write(bufferedImage, formatName, imageOutputStream);
                image = com.itextpdf.text.Image.getInstance(imageOutputStream.toByteArray());
                imageOutputStream.close();
            }catch (Exception e) {
                log.error("图片转pdf报错", e);
            }
            return image;
        }).collect(Collectors.toList());
        //转pdf
        FileUtils.imgForPdf(images, outputStream);

        outputStream.close();

    }

    private void convertGraphics2D(SettlementDocumentItemDto item, Graphics2D g2d) {
        g2d.drawString("", map.get("twoCode").getX(), map.get("twoCode").getY()); //二维码
        g2d.drawString(item.getSfhb(), map.get("sfhb").getX(), map.get("sfhb").getY());//是否换表

        var clientName = item.getHm();
        if(clientName.length() > 13) {
            var clientName1 = clientName.substring(0,14);
            var clientName2 = clientName.substring(14);
            g2d.drawString(clientName1, map.get("hm").getX(), map.get("hm").getY());
            g2d.drawString(clientName2, map.get("hm1").getX(), map.get("hm1").getY());
        }else{
            g2d.drawString(clientName, map.get("hm").getX(), map.get("hm").getY()); //户名
        }
        g2d.drawString(item.getFdhh(), map.get("fdhh").getX(), map.get("fdhh").getY());//发电户号
        g2d.drawString(item.getBwrl(), map.get("bwrl").getX(), map.get("bwrl").getY());//并网容量
        g2d.drawString(item.getFddz(), map.get("fddz").getX(), map.get("fddz").getY());//发电地址
        g2d.drawString(item.getYzbm(), map.get("yzbm").getX(), map.get("yzbm").getY());//邮政编码
        g2d.drawString(item.getXmlxr(), map.get("xmlxr").getX(), map.get("xmlxr").getY());//项目联系人
        g2d.drawString(item.getLxdh(), map.get("lxdh").getX(), map.get("lxdh").getY());//联系电话
        g2d.drawString(item.getYhzh(), map.get("yhzh").getX(), map.get("yhzh").getY());//银行账户
        g2d.drawString(item.getKhyh(), map.get("khyh").getX(), map.get("khyh").getY());//开户银行

        g2d.drawString(item.getJszq(), map.get("jszq").getX(), map.get("jszq").getY());//计算周期
        var jsList = item.getJsList();
        jsList.forEach(jsItem -> {
            if(jsItem.getJslx().equals("上网电费")){
                g2d.drawString(jsItem.getCcbh(), map.get("ccbh1").getX(), map.get("ccbh1").getY());
                g2d.drawString(jsItem.getScss(), map.get("scss1").getX(), map.get("scss1").getY());
                g2d.drawString(jsItem.getBcss(), map.get("bcss1").getX(), map.get("bcss1").getY());
                g2d.drawString(jsItem.getBl(), map.get("bl1").getX(), map.get("bl1").getY());
                g2d.drawString(jsItem.getCjdl(), map.get("cjdl1").getX(), map.get("cjdl1").getY());
                g2d.drawString(jsItem.getJsbz(), map.get("jsbz1").getX(), map.get("jsbz1").getY());
                g2d.drawString(jsItem.getJsje(), map.get("jsje1").getX(), map.get("jsje1").getY());
            }else if(jsItem.getJslx().equals("补助国家资金")){
                g2d.drawString(jsItem.getCcbh(), map.get("ccbh2").getX(), map.get("ccbh2").getY());
                g2d.drawString(jsItem.getScss(), map.get("scss2").getX(), map.get("scss2").getY());
                g2d.drawString(jsItem.getBcss(), map.get("bcss2").getX(), map.get("bcss2").getY());
                g2d.drawString(jsItem.getBl(), map.get("bl2").getX(), map.get("bl2").getY());
                g2d.drawString(jsItem.getCjdl(), map.get("cjdl2").getX(), map.get("cjdl2").getY());
                g2d.drawString(jsItem.getJsbz(), map.get("jsbz2").getX(), map.get("jsbz2").getY());
                g2d.drawString(jsItem.getJsje(), map.get("jsje2").getX(), map.get("jsje2").getY());
            }else if(jsItem.getJslx().equals("补助地方资金")){
                g2d.drawString(jsItem.getCcbh(), map.get("ccbh3").getX(), map.get("ccbh3").getY());
                g2d.drawString(jsItem.getScss(), map.get("scss3").getX(), map.get("scss3").getY());
                g2d.drawString(jsItem.getBcss(), map.get("bcss3").getX(), map.get("bcss3").getY());
                g2d.drawString(jsItem.getBl(), map.get("bl3").getX(), map.get("bl3").getY());
                g2d.drawString(jsItem.getCjdl(), map.get("cjdl3").getX(), map.get("cjdl3").getY());
                g2d.drawString(jsItem.getJsbz(), map.get("jsbz3").getX(), map.get("jsbz3").getY());
                g2d.drawString(jsItem.getJsje(), map.get("jsje3").getX(), map.get("jsje3").getY());
            }
        });
        g2d.drawString(item.getXj(), map.get("xj").getX(), map.get("xj").getY());//小计
        g2d.drawString(item.getJedx(), map.get("jedx").getX(), map.get("jedx").getY());//金额大写

        var pjList = item.getPjList();
        pjList.forEach(pjItem -> {
            if(pjItem.getXm().equals("1")) {
                g2d.drawString(pjItem.getSl(), map.get("sl1").getX(), map.get("sl1").getY());
                g2d.drawString(pjItem.getMoney(), map.get("money1").getX(), map.get("money1").getY());
                g2d.drawString(pjItem.getTaxMoney(), map.get("taxMoney1").getX(), map.get("taxMoney1").getY());
            }else if(pjItem.getXm().equals("2")){
                g2d.drawString(pjItem.getSl(), map.get("sl2").getX(), map.get("sl2").getY());
                g2d.drawString(pjItem.getMoney(), map.get("money2").getX(), map.get("money2").getY());
                g2d.drawString(pjItem.getTaxMoney(), map.get("taxMoney2").getX(), map.get("taxMoney2").getY());
            }
        });
        g2d.drawString(item.getHjje(), map.get("hjje").getX(), map.get("hjje").getY());//合计金额

        g2d.drawString(item.getZybz(), map.get("zybz").getX(), map.get("zybz").getY());//中央补助单价
        g2d.drawString(item.getDfbz(), map.get("dfbz").getX(), map.get("dfbz").getY());//地方补助单价
        g2d.drawString(item.getZzsbfb(), map.get("zzsbfb").getX(), map.get("zzsbfb").getY());//发票百分比
    }

图片转pdf

    public static boolean imgForPdf(List<com.itextpdf.text.Image> images, OutputStream outputStream) throws Exception{
        log.info("批量图片转pdf");
        Document document = new Document();
        document.setMargins(0, 0, 0, 0);
        PdfWriter.getInstance(document, outputStream);
        document.open();
        try {
            for (Image image : images) {
                image.setAlignment(Image.ALIGN_CENTER);
                image.scaleAbsolute(image.getWidth(), image.getHeight());
                document.setPageSize(new Rectangle(image.getWidth(), image.getHeight()));
                document.newPage();
                document.add(image);
            }
        } catch (Exception e) {
            log.error("imgForPdf错误", e);
            return false;
        }
        document.close();
        return true;
    }
public static boolean imgUrlForPdf(List<String> imgUrlList, OutputStream outputStream) throws Exception{
        log.info("图片转pdf");
        Document document = new Document();
        document.setMargins(0, 0, 0, 0);
        PdfWriter.getInstance(document, outputStream);
        document.open();
        for (var url : imgUrlList) {
            try {
                var image = Image.getInstance(url);
                image.setAlignment(Image.ALIGN_CENTER);
                image.scaleAbsolute(image.getWidth(), image.getHeight());
                document.setPageSize(new Rectangle(image.getWidth(), image.getHeight()));
                document.newPage();
                document.add(image);
            } catch (Exception e) {
                log.error("imgForPdf错误", e);
                return false;
            }
        }
        document.close();
        return true;
    }

如果出现中文乱码, 可能是服务器没有"宋体" Font

原文地址:https://www.cnblogs.com/smileblogs/p/12709528.html