<!--图片转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