Java后台Html转图片
1.引入相关maven包
<dependency>
<groupId>gui.ava</groupId>
<artifactId>html2image</artifactId>
<version>2.0.1</version>
</dependency>
<!--二维码 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>2.2</version>
</dependency>
<!--图片叠加 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.18</version>
</dependency>
<!-- html 内容获取-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
2. HtmlImageGeneratorUtil 工具类
public class HtmlImageGeneratorUtil {
private final static Logger logger = LoggerFactory.getLogger(HtmlImageGeneratorUtil.class);
private static Pattern p = Pattern.compile("[\u4E00-\u9FA5|\\!|\\,|\\。|\\(|\\)|\\《|\\》|\\“|\\”|\\?|\\:|\\;|\\【|\\】]");
/**
* 封装模板页面数据
* @param map
* @param type
* @return
*/
public static List<String> getSingleImageHtml(Map<String,String> map, String type) {
String html = "";
String html2 = "";
List<String> list = new ArrayList<>();
Map<String,String> sizeMap = getFontSize( map,type);
String streetSize = sizeMap.get("streetSize");
String width = sizeMap.get("width"); //图片宽
String height = sizeMap.get("height"); //图片高
String cityWidth = "156";//sizeMap.get("cityWidth"); //城市拼音图片宽
String cityHeight = sizeMap.get("cityHeight"); //城市拼音图片高
String qrcodeWidth = sizeMap.get("qrcodeWidth"); //二维码图片宽
String qrcodeHeight = sizeMap.get("qrcodeHeight"); //二维码图片高
String street = sizeMap.get("street");
String streetFontSize = sizeMap.get("streetFontSize");
String streetNo = sizeMap.get("streetNo");
String streetNoFontSize = sizeMap.get("streetNoFontSize");
String subStreet = sizeMap.get("subStreet");
String subStreetFontSize = sizeMap.get("subStreetFontSize");
String subStreetNo = sizeMap.get("subStreetNo");
String subStreetNoFontSize = sizeMap.get("subStreetNoFontSize");
String unit = sizeMap.get("unit");
String unitFontSize = sizeMap.get("unitFontSize");
String aoiGate = sizeMap.get("aoiGate");
String aoiGateFontSize = sizeMap.get("aoiGateFontSize");
String room = sizeMap.get("room");
String roomFontSize = sizeMap.get("roomFontSize");
String cityCode = sizeMap.get("cityCode");
String cityCodeFontSize = sizeMap.get("cityCodeFontSize");
String streetNoWidth = sizeMap.get("streetNoWidth");
logger.info("########################## type = "+ type +"################################");
logger.info("##########################street = "+ map.get("street")+"################################");
logger.info("##########################streetNo = "+ map.get("streetNo")+"################################");
logger.info("##########################subStreet = "+ map.get("subStreet")+"################################");
logger.info("##########################subStreetNo = "+ map.get("subStreetNo")+"################################");
logger.info("##########################unit = "+ map.get("unit")+"################################");
logger.info("##########################room = "+ map.get("room")+"################################");
if(TaskPackageConstants.DOOR_CLASS_BIG.equals(type)){
html += "<div style=\"width: "+width+"px; height: "+height+"px; background-color: rgb(255, 255, 255); box-shadow: rgba(119, 119, 119, 0.2) 0px 1px 2px 0px, rgba(119, 119, 119, 0.1) 0px 1px 5px 0px, rgba(119, 119, 119, 0.12) 0px 2px 3px 0px; position: relative;\" id=\"panelNode\">";
html += "<div style=\"width: 401.625px; height: 101.25px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 67.5px; font-weight: 600; color: rgb(51, 51, 51); line-height: 27px; max-height: 90px; position: absolute; left: 100px; top: 63px;\" id=\"street\"><b>";
html += map.get("street");
//}
html += "</b></div>";
html += "<div style=\"width: 256.5px; height: 67.5px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 45px; font-weight: 500; color: rgb(51, 51, 51); line-height: 67.5px; max-height: 90px; position: absolute; left: 140px; top: 198px;\" id=\"subStreet\"><b>";
if(StringUtil.isNotEmpty(map.get("subStreet"))){
html += "(" + map.get("subStreet") + ")";
}
html += "</b></div>";
html += "<div style=\"width: 320.625px; height: 219.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size:90px; font-weight: 500; color: rgb(51, 51, 51); line-height: 213px; max-height: 180px; position: absolute; left: 108px; top: 293px;\" id=\"streetNo\">";
html += map.get("streetNo");
html += "</div>";
// if(StringUtil.isNotEmpty(map.get(“subStreetNo”))){
// html += “<div style=“width: 60.75px; height: 148.5px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 60px; font-weight: 500; color: rgb(51, 51, 51); line-height: 148.5px; max-height: 90px;position: absolute; left:345px;top:370px” id=“line”>”;
// html += “-”;
// html += “”;
// }
html += “<div style=“width: 74.25px; height: 148.5px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 50px; font-weight: 500; color: rgb(51, 51, 51); line-height: 148.5px; max-height: 90px; position: absolute; left: 320px; top: 350px;” id=“subStreetNo”>”;
html += map.get(“subStreetNo”);
html += “”;
html += “<div style=“width: 118.125px; height: 57.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 28px; font-weight: 500; color: rgb(202, 42, 42); line-height: 57px; max-height: 30px; position: absolute; left: 574px;top:235px” id=“aoiGate”>”;
html += map.get(“aoiGate”);
html += “”;
html += “”;
html2 += "<div style="width: "+cityWidth+"px; height: “+cityHeight+“px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 25px; font-weight: 500; color: rgba(0, 0, 0, 0.65); line-height: 45px; max-height: 30px;” id=“cityCode”>”;
html2 += map.get(“cityCode”);
html2 += “”;
}else if(TaskPackageConstants.DOOR_CLASS_BUILD.equals(type)){
html += "<div style=\"width: "+width+"px; height: "+height+"px; background-color: rgb(255, 255, 255); box-shadow: rgba(119, 119, 119, 0.2) 0px 1px 2px 0px, rgba(119, 119, 119, 0.1) 0px 1px 5px 0px, rgba(119, 119, 119, 0.12) 0px 2px 3px 0px; position: relative;\" id=\"panelNode\">";
if(map.get("street").length()>20){
html += "<div style=\"width: 340.875px; height: 84.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size:26px; font-weight: 600; color: rgb(51, 51, 51); line-height: 84px; max-height: 120px; position: absolute; left: 100px; top: 74px;\" id=\"street\"><b>";
html += map.get("street");
html += "</b></div>";
}else{
html += "<div style=\"width: 340.875px; height: 84.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size:30px; font-weight: 600; color: rgb(51, 51, 51); line-height: 84px; max-height: 120px; position: absolute; left: 100px; top: 74px;\" id=\"street\"><b>";
html += map.get("street");
html += "</b></div>";
}
html += "<div style=\"width: 108px; height: 263.25px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size:150px; font-weight: 500; color: rgb(51, 51, 51); line-height: 262.5px; max-height: 195px; position: absolute; left: 140px; top: 205px;\" id=\"streetNo\">";
html += map.get("streetNo");
html += "</div>";
// html += "<div style=“width: 81px; height: 111.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 72px; font-weight: 500; color: rgb(51, 51, 51); line-height: 111px; max-height: 90px;position: absolute; left: 296px; top: 308px; " id=“none”>”;
// html += “栋”;
// html += “”;
html += “<div style=“width: 118.125px; height: 57.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 37.5px; font-weight: 500; color: rgb(202, 42, 42); line-height: 57px; max-height: 40.5px; position: absolute; left: 470px; top: 220px;” id=“unit”>”;
html += map.get(“unit”);
html += “”;
html += “”;
html2 += "<div style=\"width: "+cityWidth+"px; height: "+cityHeight+"px; display: flex; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 25px; font-weight: 500; color: rgba(0, 0, 0, 0.65); line-height: 46.5px; max-height: 31.5px;\" id=\"cityCode\">";
html2 += map.get("cityCode");
html2 += "</div>";
}else if(TaskPackageConstants.DOOR_CLASS_MIDDLE.equals(type)){
html += "<div style=\"width: "+width+"px; height: "+height+"px; background-color: rgb(255, 255, 255); box-shadow: rgba(119, 119, 119, 0.2) 0px 1px 2px 0px, rgba(119, 119, 119, 0.1) 0px 1px 5px 0px, rgba(119, 119, 119, 0.12) 0px 2px 3px 0px; position: relative;\" id=\"panelNode\">";
if(street.length() > 10){
html += "<div style=\"width: 283.5px; height: 74.25px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 25px; font-weight: 600; color: rgb(51, 51, 51); line-height: 73.5px; max-height: 90px; position: absolute; left: 84px; top: 52px;\" id=\"street\"><b>";
html += map.get("street");
html += "</b></div>";
}else {
html += "<div style=\"width: 283.5px; height: 74.25px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 38px; font-weight: 600; color: rgb(51, 51, 51); line-height: 73.5px; max-height: 90px; position: absolute; left: 84px; top: 52px;\" id=\"street\"><b>";
html += map.get("street");
html += "</b></div>";
}
html += "<div style=\"width: 239.625px; height: 57.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 45px; font-weight: 500; color: rgb(51, 51, 51); line-height: 57px; max-height: 90px; position: absolute; left: 102px; top: 155px;\" id=\"subStreet\">";
if(StringUtil.isNotEmpty(map.get("subStreet"))){
html += "(" + map.get("subStreet") + ")";
}
html += "</div>";
html += "<div style=\"width: 142.5px; height: 148.5px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 110.5px; font-weight: 500; color: rgb(51, 51, 51); line-height: 148.5px; max-height: 112.5px; position: absolute; left: 79px; top: 241px;\" id=\"streetNo\">";
html += map.get("streetNo");
html += "</div>";
String leftSize = "210px";
if(streetNo.length() > 3){
leftSize = "260px";
}
html += "<div style=\"width: 74.25px; height: 148.5px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 55px; font-weight: 500; color: rgb(51, 51, 51); line-height: 148.5px; max-height: 90px; position: absolute; left:"+leftSize+"; top: 260px;\" id=\"subStreetNo\">";
html += map.get("subStreetNo");
html += "</div>";
html += "<div style=\"width: 128.25px; height: 57.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 25px; font-weight: 500; color: rgb(202, 42, 42); line-height: 57px; max-height: 40.5px; position: absolute; left: 389px; top: 200px;\" id=\"unit\">";
html += map.get("unit");
html += "</div>";
html += "</div>";
html2 += "<div style=\"width: "+cityWidth+"px; height: "+cityHeight+"px; display: flex; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 25px; font-weight: 500; color: rgba(0, 0, 0, 0.65); line-height: 46.5px; max-height: 27px;\" id=\"cityCode\">";
html2 += map.get("cityCode");
html2 += "</div>";
}else if(TaskPackageConstants.DOOR_CLASS_MIDDLE_M.equals(type)){
html += "<div style=\"width: "+width+"px; height: "+height+"px; background-color: rgb(255, 255, 255); box-shadow: rgba(119, 119, 119, 0.2) 0px 1px 2px 0px, rgba(119, 119, 119, 0.1) 0px 1px 5px 0px, rgba(119, 119, 119, 0.12) 0px 2px 3px 0px; position: relative;\" id=\"panelNode\">";
if(street.length() > 10){
html += "<div style=\"width: 283.5px; height: 74.25px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 30px; font-weight: 600; color: rgb(51, 51, 51); line-height: 73.5px; max-height: 90px; position: absolute; left: 85px; top: 61px;\" id=\"street\"><b>";
html += map.get("street");
html += "</b></div>";
}else {
html += "<div style=\"width: 283.5px; height: 74.25px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 44px; font-weight: 600; color: rgb(51, 51, 51); line-height: 73.5px; max-height: 90px; position: absolute; left: 85px; top: 61px;\" id=\"street\"><b>";
html += map.get("street");
html += "</b></div>";
}
html += "<div style=\"width: 239.625px; height: 57.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 45px; font-weight: 500; color: rgb(51, 51, 51); line-height: 57px; max-height: 90px; position: absolute; left: 82px; top: 166px;\" id=\"subStreet\"><b>";
html += map.get("subStreet");
html += "</b></div>";
html += "<div style=\"width: 90px; height: 148.5px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 50px; font-weight: 500; color: rgb(51, 51, 51); line-height: 148.5px; max-height: 180px; position: absolute; left: 161px; top: 233px;\" id=\"streetNo\">";
html += map.get("streetNo");
html += "</div>";
if(StringUtil.isNotEmpty(map.get("subStreetNo")) && StringUtil.isContainChinese(map.get("subStreetNo"))){
html += "<div style=\"width: 30px; height: 10px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 40px; font-weight: 500; color: rgb(51, 51, 51); line-height: 298px; max-height: 90px; position: absolute; left: 280px; top: 170px;\" id=\"subStreetNo\">";
}else{
html += "<div style=\"width: 30px; height: 10px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 40px; font-weight: 500; color: rgb(51, 51, 51); line-height: 298px; max-height: 90px; position: absolute; left: 250px; top: 170px;\" id=\"subStreetNo\">";
}
html += map.get("subStreetNo");
html += "</div>";
html += "</div>";
html2 += "<div style=\"width: "+cityWidth+"px; height: "+cityHeight+"px; display: flex; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 34.5px; font-weight: 500; color: rgba(0, 0, 0, 0.65); line-height: 46.5px; max-height: 27px;\" id=\"cityCode\">";
html2 += map.get("cityCode");
html2 += "</div>";
}else if(TaskPackageConstants.DOOR_CLASS_ROOM.equals(type)){
html += "<div style=\"width: "+width+"px; height: "+height+"px; background-color: rgb(255, 255, 255); box-shadow: rgba(119, 119, 119, 0.2) 0px 1px 2px 0px, rgba(119, 119, 119, 0.1) 0px 1px 5px 0px, rgba(119, 119, 119, 0.12) 0px 2px 3px 0px; position: relative;\" id=\"panelNode\">";
if(map.get("street").length() > 18){
html += "<div style=\"width: 240px; height: 57.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 14px; font-weight: 600; color: rgb(51, 51, 51); line-height: 57px;max-height: 105px; position: absolute; left: 55px; top: 49px;\" id=\"street\"><b>";
html += map.get("street");
}else{
html += "<div style=\"width: 240px; height: 57.375px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 22px; font-weight: 600; color: rgb(51, 51, 51);line-height: 57px; max-height: 105px; position: absolute; left: 55px; top: 49px;\" id=\"street\"><b>";
html += map.get("street");
}
html += "</b></div>";
html += "<div style=\"width: 180px; height: 141.75px; display: flex; text-align: center;display: block; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 94.5px; font-weight: 500; color: rgb(51, 51, 51); line-height: 141px; max-height: 120px; position: absolute; left: 76px; top: 127px;\" id=\"room\">";
html += map.get("room");
html += "</div>";
html += "</div>";
html2 += "<div style=\"width: "+cityWidth+"px; height: "+cityHeight+"px; display: flex; align-items: center; flex-wrap: nowrap; white-space: nowrap; cursor: move; font-size: 15px; font-weight: 500; color: rgba(0, 0, 0, 0.65); line-height: 40.5px; max-height: 22.5px;\" id=\"cityCode\">";
html2 += map.get("cityCode");
html2 += "</div>";
}
logger.info("########################## html = "+ html+"################################");
logger.info("########################## html2 = "+ html2+"################################");
list.add(html);
list.add(html2);
list.add(width);
list.add(height);
list.add(cityWidth);
list.add(cityHeight);
list.add(qrcodeWidth);
list.add(qrcodeHeight);
list.add(street);
list.add(streetFontSize);
list.add(streetNo);
list.add(streetNoFontSize);
list.add(subStreet);
list.add(subStreetFontSize);
list.add(subStreetNo);
list.add(subStreetNoFontSize);
list.add(unit);
list.add(unitFontSize);
list.add(aoiGate);
list.add(aoiGateFontSize);
list.add(room);
list.add(roomFontSize);
list.add(cityCode);
list.add(cityCodeFontSize);
list.add(streetNoWidth);
return list;
}
/**
* html转图片,并叠加图片
* @param map
* @param type
* @param fileName
* @return
* @throws Exception
*/
public static BufferedImage graphicsHtmlGeneration(Map<String, String> map, String type, String fileName) throws Exception{
//获取页面
List<String> list = getSingleImageHtml(map,type);
if (list.get(0) != null && list.get(0).length() > 0) {
String html1 = list.get(0);
//城市拼音html
String html2 = list.get(1);
String width = list.get(2);
String height = list.get(3);
String cityWidth = list.get(4);
String cityHeight = list.get(5);
String qrcodeWidth = list.get(6);
String qrcodeHeight = list.get(7);
String street = list.get(8);
String streetFontSize = list.get(9);
String streetNo = list.get(10);
String streetNoFontSize = list.get(11);
String subStreet = list.get(12);
String subStreetFontSize = list.get(13);
String subStreetNo = list.get(14);
String subStreetNoFontSize = list.get(15);
String unit = list.get(16);
String unitFontSize = list.get(17);
String aoiGate = list.get(18);
String aoiGateFontSize = list.get(19);
String room = list.get(20);
String roomFontSize = list.get(21);
String cityCode = list.get(22);
String cityCodeFontSize = list.get(23);
String streetNoWidth = list.get(24);
Html2Image imageGenerator = Html2Image.fromHtml(html1);
Html2Image imageGenerator2 = Html2Image.fromHtml(html2);
ImageRenderer t1 = imageGenerator.getImageRenderer();
ImageRenderer t2 = imageGenerator2.getImageRenderer();
//设置图片宽高
t1.setWidth(Double.valueOf(width).intValue());
t1.setHeight(Double.valueOf(height).intValue());
t2.setWidth(Double.valueOf(cityWidth).intValue());
t2.setHeight(Double.valueOf(cityHeight).intValue());
//二维码宽高
int widthCode = 0;
int heightCode = 0;
if(TaskPackageConstants.DOOR_CLASS_ROOM.equals(type)){
widthCode =Double.valueOf(qrcodeWidth).intValue()+30;
heightCode = Double.valueOf(qrcodeHeight).intValue()+30;
}else{
widthCode =Double.valueOf(qrcodeWidth).intValue();
heightCode = Double.valueOf(qrcodeHeight).intValue();
}
try {
BufferedImage image = imageGenerator.getImageRenderer().getBufferedImage();
String widthFont = new BigDecimal(width).subtract(new BigDecimal(cityHeight)).toString();
if(StringUtil.isNotEmpty(street)){
//设置 street 字体大小
setFontSize(image,widthFont, streetFontSize, street);
}
if(StringUtil.isNotEmpty(streetNo)){
//设置 streetNo 字体大小
setFontSize(image,streetNoWidth, streetNoFontSize, streetNo);
}
if(StringUtil.isNotEmpty(subStreet)){
//设置 subStreet 字体大小
setFontSize(image,width, subStreetFontSize, subStreet);
}
if(StringUtil.isNotEmpty(subStreetNo)){
//设置 subStreetNo 字体大小
setFontSize(image,width, subStreetNoFontSize, subStreetNo);
}
if(StringUtil.isNotEmpty(unit)){
//设置 unit 字体大小
setFontSize(image,qrcodeWidth, unitFontSize, unit);
}
if(StringUtil.isNotEmpty(aoiGate)){
//设置 aoiGate 字体大小
setFontSize(image,qrcodeWidth, aoiGateFontSize, aoiGate);
}
if(StringUtil.isNotEmpty(room)){
//设置 room 字体大小
setFontSize(image,width, roomFontSize, room);
}
BufferedImage citiImage = imageGenerator2.getImageRenderer().getBufferedImage();
if(StringUtil.isNotEmpty(cityCode)){
//设置 cityCode 字体大小
setFontSize(citiImage,cityWidth, cityCodeFontSize, cityCode);
}
//旋转城市拼音图片270度
BufferedImage des = rotate(citiImage, 90);
//修改旋转后图片宽高
BufferedImage desImage = resizeBufferedImage(des,imageGenerator2.getImageRenderer().getHeight(),imageGenerator2.getImageRenderer().getWidth(),false);
int x = 0;
int y = 0;
if(TaskPackageConstants.DOOR_CLASS_ROOM.equals(type)){
//int x = 540; //原图片宽减二维码宽
x = new BigDecimal(width).subtract(new BigDecimal(qrcodeWidth)).intValue() -20;
//int y = (int) 289.125; //原图片高减二维码高
y = new BigDecimal(height).subtract(new BigDecimal(qrcodeHeight)).intValue() -20;
}else{
//int x = 540; //原图片宽减二维码宽
x = new BigDecimal(width).subtract(new BigDecimal(qrcodeWidth)).intValue();
//int y = (int) 289.125; //原图片高减二维码高
y = new BigDecimal(height).subtract(new BigDecimal(qrcodeHeight)).intValue();
}
//int city_X = (int) 708.75; //原图宽减原城市图片高
int cityX = new BigDecimal(width).subtract(new BigDecimal(cityHeight)).intValue();
//int city_Y = (int) 47.25; //原城市图片高
int cityY = Double.valueOf(cityHeight).intValue();
//String imageType = "png";
//String saveFilePath = "D:\\"+fileName+".png";
//获取二维码流
BufferedImage image2 = RecodeUtil.codeCreate(map.get("qrcode"),widthCode,heightCode);
//拼接城市拼音旋转后的图片
BufferedImage buffImg = overlyingImage(image, desImage, cityX, cityY, 1.0f);
//拼接门牌和二维码
BufferedImage buffImg1 = overlyingImage(buffImg, image2, x, y, 1.0f);
return buffImg1;
} catch (Exception e) {
logger.error("图片转换失败:", e);
}
}
return null;
}
/**
* 调整bufferedimage大小
* @param source BufferedImage 原始image
* @param targetW int 目标宽
* @param targetH int 目标高
* @param flag boolean 是否同比例调整
* @return BufferedImage 返回新image
*/
private static BufferedImage resizeBufferedImage(BufferedImage source, int targetW, int targetH, boolean flag) {
int type = source.getType();
BufferedImage target = null;
double sx = (double) targetW / source.getWidth();
double sy = (double) targetH / source.getHeight();
if (flag && sx > sy) {
sx = sy;
targetW = (int) (sx * source.getWidth());
} else if (flag && sx <= sy) {
sy = sx;
targetH = (int) (sy * source.getHeight());
}
if (type == BufferedImage.TYPE_CUSTOM) { // handmade
ColorModel cm = source.getColorModel();
WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
target = new BufferedImage(cm, raster, alphaPremultiplied, null);
} else {
target = new BufferedImage(targetW, targetH, type);
}
Graphics2D g = target.createGraphics();
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
g.dispose();
return target;
}
/**
*
* @Title: 构造图片
* @Description: 生成水印并返回java.awt.image.BufferedImage
* @param buffImg 源文件(BufferedImage)
* @param waterImg 水印文件(BufferedImage)
* @param x 距离右下角的X偏移量
* @param y 距离右下角的Y偏移量
* @param alpha 透明度, 选择值从0.0~1.0: 完全透明~完全不透明
* @return BufferedImage
* @throws IOException
*/
public static BufferedImage overlyingImage(BufferedImage buffImg, BufferedImage waterImg, int x, int y, float alpha) throws IOException {
// 创建Graphics2D对象,用在底图对象上绘图
Graphics2D g2d = buffImg.createGraphics();
int waterImgWidth = waterImg.getWidth();// 获取层图的宽度
int waterImgHeight = waterImg.getHeight();// 获取层图的高度
// 在图形和图像中实现混合和透明效果
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
// 绘制
g2d.drawImage(waterImg, x, y, waterImgWidth, waterImgHeight, null);
g2d.dispose();// 释放图形上下文使用的系统资源
return buffImg;
}
/**
* 图片旋转
* @param src
* @param angel
* @return
*/
public static BufferedImage rotate(Image src, int angel) {
int srcWidth = src.getWidth(null)-1;
int srcHeight = src.getHeight(null)-3;
// calculate the new image size
Rectangle rectDes = calcRotatedSize(new Rectangle(new Dimension(
srcWidth, srcHeight)), angel);
BufferedImage res = null;
res = new BufferedImage(rectDes.width, rectDes.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = res.createGraphics();
// transform
g2.translate((rectDes.width - srcWidth) / 2, (rectDes.height - srcHeight) / 2);
g2.rotate(Math.toRadians(angel), (double)srcWidth / 2, (double)srcHeight / 2);
g2.drawImage(src, null, null);
return res;
}
/**
* 图片旋转
* @param src
* @param angel
* @return
*/
public static Rectangle calcRotatedSize(Rectangle src, int angel) {
// if angel is greater than 90 degree, we need to do some conversion
if (angel >= 90) {
if(angel / 90 % 2 == 1){
int temp = src.height;
src.height = src.width;
src.width = temp;
}
angel = angel % 90;
}
double r = Math.sqrt((double)src.height * src.height + (double)src.width * src.width) / 2;
double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;
double angelAlpha = (Math.PI - Math.toRadians(angel)) / 2;
double angelDaltaWidth = Math.atan((double) src.height / src.width);
double angelDaltaHeight = Math.atan((double) src.width / src.height);
int lenDaltaWidth = (int) (len * Math.cos(Math.PI - angelAlpha
- angelDaltaWidth));
int lenDaltaHeight = (int) (len * Math.cos(Math.PI - angelAlpha
- angelDaltaHeight));
int desWidth = src.width + lenDaltaWidth * 2;
int desHeight = src.height + lenDaltaHeight * 2;
return new java.awt.Rectangle(new Dimension(desWidth, desHeight));
}
/**
* 获取模板里相关属性数据
* @param map
* @param type
* @return
*/
public static Map<String,String> getHtmlContext(Map<String, String> map, String type){
Map<String,String> resultMap = new HashMap<>(16);
//获取页面
//List<String> list = getSingleImageHtml(map,type);
String html = map.get("html");
//城市拼音
if(TaskPackageConstants.DOOR_CLASS_BIG.equals(type)){
Document document = Jsoup.parse(html);
Element postList = document.getElementById("panelNode");
//获取模板第一个div样式
String style = postList.attr("style");
//获取模板宽高
String style1 = style.substring(style.indexOf("width"));
String style2 = style1.substring(0, style1.indexOf(";"));
String attr = style2.substring(style2.indexOf(":") + 2);
String width = attr.substring(0, attr.indexOf("px"));
//获取模板高
String style3 = style.substring(style.indexOf("height"));
String style4 = style3.substring(0, style3.indexOf(";"));
String attr1 = style4.substring(style4.indexOf(":") + 2);
String height = attr1.substring(0, attr1.indexOf("px"));
//获取模板street div
Element streetHtml = document.getElementById("street");
//获取文本值
//获取第2个div样式
String styleStreet = streetHtml.attr("style");
String styleStreet1 = styleStreet.substring(styleStreet.indexOf("font-size"));
String styleStreet2 = styleStreet1.substring(0, styleStreet1.indexOf(";"));
String attr2 = styleStreet2.substring(styleStreet2.indexOf(":") + 2);
String streetFontSize = attr2.substring(0, attr2.indexOf("px"));
//subStreet
Element subStreetHtml = document.getElementById("subStreet");
String styleSubStreet = subStreetHtml.attr("style");
String styleSubStreet1 = styleSubStreet.substring(styleSubStreet.indexOf("font-size"));
String styleSubStreet2 = styleSubStreet1.substring(0, styleSubStreet1.indexOf(";"));
String attrSubStreet = styleSubStreet2.substring(styleSubStreet2.indexOf(":") + 2);
String subStreetFontSize = attrSubStreet.substring(0, attrSubStreet.indexOf("px"));
//streetNo
Element streetNoHtml = document.getElementById("streetNo");
String styleStreetNo = streetNoHtml.attr("style");
String styleStreetNo1 = styleStreetNo.substring(styleStreetNo.indexOf("font-size"));
String styleStreetNo2 = styleStreetNo1.substring(0, styleStreetNo1.indexOf(";"));
String attrStreetNo = styleStreetNo2.substring(styleStreetNo2.indexOf(":") + 2);
String streetNoFontSize = attrStreetNo.substring(0, attrStreetNo.indexOf("px"));
//subStreetNo
Element subStreetNoHtml = document.getElementById("subStreetNo");
String styleSubStreetNo = subStreetNoHtml.attr("style");
String styleSubStreetNo1 = styleSubStreetNo.substring(styleSubStreetNo.indexOf("font-size"));
String styleSubStreetNo2 = styleSubStreetNo1.substring(0, styleSubStreetNo1.indexOf(";"));
String attrSubStreetNo = styleSubStreetNo2.substring(styleSubStreetNo2.indexOf(":") + 2);
String subStreetNoFontSize = attrSubStreetNo.substring(0, attrSubStreetNo.indexOf("px"));
//判断是否包含中文
String streetNo = map.get("streetNo");
Matcher m = p.matcher(streetNo);
if (m.find()) {
streetNoFontSize = "70";
}
String streetNoWidth1 = styleStreetNo.substring(styleStreetNo.indexOf("width"));
String streetNoWidth2 = streetNoWidth1.substring(0, streetNoWidth1.indexOf(";"));
String attrStreetNoWidth = streetNoWidth2.substring(streetNoWidth2.indexOf(":") + 2);
String streetNoWidth = attrStreetNoWidth.substring(0, attrStreetNoWidth.indexOf("px"));
//aoiGate 大门
Element aoiGateHtml = document.getElementById("aoiGate");
String styleAoiGate = aoiGateHtml.attr("style");
String styleAoiGate1 = styleAoiGate.substring(styleAoiGate.indexOf("font-size"));
String styleAoiGate2 = styleAoiGate1.substring(0, styleAoiGate1.indexOf(";"));
String attrAoiGate = styleAoiGate2.substring(styleAoiGate2.indexOf(":") + 2);
String aoiGateFontSize = attrAoiGate.substring(0, attrAoiGate.indexOf("px"));
//城市拼音div 宽高
Element cityHtml = document.getElementById("cityCode");
//获取文本值
String cityCode = streetHtml.select("#cityCode").text();
//获取第一个div样式
String styleCityCode = cityHtml.attr("style");
String styleCityCode1 = styleCityCode.substring(styleCityCode.indexOf("width"));
String styleCityCode2 = styleCityCode1.substring(0, styleCityCode1.indexOf(";"));
String attr3 = styleCityCode2.substring(styleCityCode2.indexOf(":") + 2);
String cityWidth = attr3.substring(0, attr3.indexOf("px"));
String styleCityCode3 = styleCityCode.substring(styleCityCode.indexOf("height"));
String styleCityCode4 = styleCityCode3.substring(0, styleCityCode3.indexOf(";"));
String attr4 = styleCityCode4.substring(styleCityCode4.indexOf(":") + 2);
String cityHeight = attr4.substring(0, attr4.indexOf("px"));
String styleCityCode11 = styleCityCode.substring(styleCityCode.indexOf("font-size"));
String styleCityCode22 = styleCityCode11.substring(0, styleCityCode11.indexOf(";"));
String attrCityCode = styleCityCode22.substring(styleCityCode22.indexOf(":") + 2);
String cityCodeFontSize = attrCityCode.substring(0, attrCityCode.indexOf("px"));
//二维码div 宽高
Element qrcodeHtml = document.getElementById("qrcode");
//获取第一个div样式
String styleQrcode = qrcodeHtml.attr("style");
String styleQrcode1 = styleQrcode.substring(styleQrcode.indexOf("width"));
String styleQrcode2 = styleQrcode1.substring(0, styleQrcode1.indexOf(";"));
String attrCode = styleQrcode2.substring(styleQrcode2.indexOf(":") + 2);
String qrcodeWidth = attrCode.substring(0, attrCode.indexOf("px"));
String styleQrcode3 = styleQrcode.substring(styleQrcode.indexOf("height"));
String styleQrcode4 = styleQrcode3.substring(0, styleQrcode3.indexOf(";"));
String attrCode2 = styleQrcode4.substring(styleQrcode4.indexOf(":") + 2);
String qrcodeHeight = attrCode2.substring(0, attrCode2.indexOf("px"));
resultMap.put("width",width);
resultMap.put("height",height);
resultMap.put("cityWidth",cityWidth);
resultMap.put("cityHeight",cityHeight);
resultMap.put("qrcodeWidth",qrcodeWidth);
resultMap.put("qrcodeHeight",qrcodeHeight);
resultMap.put("streetFontSize",streetFontSize);
resultMap.put("subStreetFontSize",subStreetFontSize);
resultMap.put("streetNoFontSize",streetNoFontSize);
resultMap.put("aoiGateFontSize",aoiGateFontSize);
resultMap.put("cityCodeFontSize",cityCodeFontSize);
resultMap.put("streetNoWidth",streetNoWidth);
resultMap.put("subStreetNoFontSize",subStreetNoFontSize);
}else if(TaskPackageConstants.DOOR_CLASS_BUILD.equals(type)){
Document document = Jsoup.parse(html);
Element postList = document.getElementById("panelNode");
//获取模板第一个div样式
String style = postList.attr("style");
//获取模板宽高
String style1 = style.substring(style.indexOf("width"));
String style2 = style1.substring(0, style1.indexOf(";"));
String attr = style2.substring(style2.indexOf(":") + 2);
String width = attr.substring(0, attr.indexOf("px"));
//获取模板高
String style3 = style.substring(style.indexOf("height"));
String style4 = style3.substring(0, style3.indexOf(";"));
String attr1 = style4.substring(style4.indexOf(":") + 2);
String height = attr1.substring(0, attr.indexOf("px"));
//获取模板第二个div
Element streetHtml = document.getElementById("street");
//获取文本值
//获取第一个div样式
String styleStreet = streetHtml.attr("style");
String styleStreet1 = styleStreet.substring(styleStreet.indexOf("font-size"));
String styleStreet2 = styleStreet1.substring(0, styleStreet1.indexOf(";"));
String attr2 = styleStreet2.substring(styleStreet2.indexOf(":") + 2);
String streetFontSize = attr2.substring(0, attr2.indexOf("px"));
//streetNo
Element streetNoHtml = document.getElementById("streetNo");
String styleStreetNo = streetNoHtml.attr("style");
String styleStreetNo1 = styleStreetNo.substring(styleStreetNo.indexOf("font-size"));
String styleStreetNo2 = styleStreetNo1.substring(0, styleStreetNo1.indexOf(";"));
String attrStreetNo = styleStreetNo2.substring(styleStreetNo2.indexOf(":") + 2);
String streetNoFontSize = attrStreetNo.substring(0, attrStreetNo.indexOf("px"));
//判断是否包含中文
String streetNo = map.get("streetNo");
Matcher m = p.matcher(streetNo);
if (m.find()) {
streetNoFontSize = "90";
}
String streetNoWidth1 = styleStreetNo.substring(styleStreetNo.indexOf("width"));
String streetNoWidth2 = streetNoWidth1.substring(0, streetNoWidth1.indexOf(";"));
String attrStreetNoWidth = streetNoWidth2.substring(streetNoWidth2.indexOf(":") + 2);
String streetNoWidth = attrStreetNoWidth.substring(0, attrStreetNoWidth.indexOf("px"));
//unit
Element unitHtml = document.getElementById("unit");
String styleUnit = unitHtml.attr("style");
String styleUnit1 = styleUnit.substring(styleUnit.indexOf("font-size"));
String styleUnit2 = styleUnit1.substring(0, styleUnit1.indexOf(";"));
String attrUnit = styleUnit2.substring(styleUnit2.indexOf(":") + 2);
String unitFontSize = attrUnit.substring(0, attrUnit.indexOf("px"));
//城市拼音div 宽高
Element cityHtml = document.getElementById("cityCode");
//获取文本值
//获取第一个div样式
String styleCityCode = cityHtml.attr("style");
String styleCityCode1 = styleCityCode.substring(styleCityCode.indexOf("width"));
String styleCityCode2 = styleCityCode1.substring(0, styleCityCode1.indexOf(";"));
String attr3 = styleCityCode2.substring(styleCityCode2.indexOf(":") + 2);
String cityWidth = attr3.substring(0, attr3.indexOf("px"));
String styleCityCode3 = styleCityCode.substring(styleCityCode.indexOf("height"));
String styleCityCode4 = styleCityCode3.substring(0, styleCityCode3.indexOf(";"));
String attr4 = styleCityCode4.substring(styleCityCode4.indexOf(":") + 2);
String cityHeight = attr4.substring(0, attr4.indexOf("px"));
String styleCityCode11 = styleCityCode.substring(styleCityCode.indexOf("font-size"));
String styleCityCode22 = styleCityCode11.substring(0, styleCityCode11.indexOf(";"));
String attrCityCode = styleCityCode22.substring(styleCityCode22.indexOf(":") + 2);
String cityCodeFontSize = attrCityCode.substring(0, attrCityCode.indexOf("px"));
//二维码div 宽高
Element qrcodeHtml = document.getElementById("qrcode");
//获取第一个div样式
String styleQrcode = qrcodeHtml.attr("style");
String styleQrcode1 = styleQrcode.substring(styleQrcode.indexOf("width"));
String styleQrcode2 = styleQrcode1.substring(0, styleQrcode1.indexOf(";"));
String attrCode = styleQrcode2.substring(styleQrcode2.indexOf(":") + 2);
String qrcodeWidth = attrCode.substring(0, attrCode.indexOf("px"));
String styleQrcode3 = styleQrcode.substring(styleQrcode.indexOf("height"));
String styleQrcode4 = styleQrcode3.substring(0, styleQrcode3.indexOf(";"));
String attrCode2 = styleQrcode4.substring(styleQrcode4.indexOf(":") + 2);
String qrcodeHeight = attrCode2.substring(0, attrCode2.indexOf("px"));
resultMap.put("width",width);
resultMap.put("height",height);
resultMap.put("cityWidth",cityWidth);
resultMap.put("cityHeight",cityHeight);
resultMap.put("qrcodeWidth",qrcodeWidth);
resultMap.put("qrcodeHeight",qrcodeHeight);
resultMap.put("streetFontSize",streetFontSize);
resultMap.put("streetNoFontSize",streetNoFontSize);
resultMap.put("unitFontSize",unitFontSize);
resultMap.put("cityCodeFontSize",cityCodeFontSize);
resultMap.put("streetNoWidth",streetNoWidth);
}else if(TaskPackageConstants.DOOR_CLASS_MIDDLE.equals(type)){
Document document = Jsoup.parse(html);
Element postList = document.getElementById("panelNode");
//获取模板第一个div样式
String style = postList.attr("style");
//获取模板宽高
String style1 = style.substring(style.indexOf("width"));
String style2 = style1.substring(0, style1.indexOf(";"));
String attr = style2.substring(style2.indexOf(":") + 2);
String width = attr.substring(0, attr.indexOf("px"));
//获取模板高
String style3 = style.substring(style.indexOf("height"));
String style4 = style3.substring(0, style3.indexOf(";"));
String attr1 = style4.substring(style4.indexOf(":") + 2);
String height = attr1.substring(0, attr.indexOf("px"));
//获取模板第二个div
Element streetHtml = document.getElementById("street");
//获取文本值
//获取第一个div样式
String styleStreet = streetHtml.attr("style");
String styleStreet1 = styleStreet.substring(styleStreet.indexOf("font-size"));
String styleStreet2 = styleStreet1.substring(0, styleStreet1.indexOf(";"));
String attr2 = styleStreet2.substring(styleStreet2.indexOf(":") + 2);
String streetFontSize = attr2.substring(0, attr2.indexOf("px"));
//subStreet
Element subStreetHtml = document.getElementById("subStreet");
String styleSubStreet = subStreetHtml.attr("style");
String styleSubStreet1 = styleSubStreet.substring(styleSubStreet.indexOf("font-size"));
String styleSubStreet2 = styleSubStreet1.substring(0, styleSubStreet1.indexOf(";"));
String attrSubStreet = styleSubStreet2.substring(styleSubStreet2.indexOf(":") + 2);
String subStreetFontSize = attrSubStreet.substring(0, attrSubStreet.indexOf("px"));
//streetNo
Element streetNoHtml = document.getElementById("streetNo");
String styleStreetNo = streetNoHtml.attr("style");
String styleStreetNo1 = styleStreetNo.substring(styleStreetNo.indexOf("font-size"));
String styleStreetNo2 = styleStreetNo1.substring(0, styleStreetNo1.indexOf(";"));
String attrStreetNo = styleStreetNo2.substring(styleStreetNo2.indexOf(":") + 2);
String streetNoFontSize = attrStreetNo.substring(0, attrStreetNo.indexOf("px"));
//判断是否包含中文
String streetNo = map.get("streetNo");
Matcher m = p.matcher(streetNo);
if (m.find()) {
streetNoFontSize = "90";
}
String streetNoWidth1 = styleStreetNo.substring(styleStreetNo.indexOf("width"));
String streetNoWidth2 = streetNoWidth1.substring(0, streetNoWidth1.indexOf(";"));
String attrStreetNoWidth = streetNoWidth2.substring(streetNoWidth2.indexOf(":") + 2);
String streetNoWidth = attrStreetNoWidth.substring(0, attrStreetNoWidth.indexOf("px"));
//subStreetNo
Element subStreetNoHtml = document.getElementById("subStreetNo");
String styleSubStreetNo = subStreetNoHtml.attr("style");
String styleSubStreetNo1 = styleSubStreetNo.substring(styleSubStreetNo.indexOf("font-size"));
String styleSubStreetNo2 = styleSubStreetNo1.substring(0, styleSubStreetNo1.indexOf(";"));
String attrSubStreetNo = styleSubStreetNo2.substring(styleSubStreetNo2.indexOf(":") + 2);
String subStreetNoFontSize = attrSubStreetNo.substring(0, attrSubStreetNo.indexOf("px"));
//unit
Element unitHtml = document.getElementById("unit");
String styleUnit = unitHtml.attr("style");
String styleUnit1 = styleUnit.substring(styleUnit.indexOf("font-size"));
String styleUnit2 = styleUnit1.substring(0, styleUnit1.indexOf(";"));
String attrUnit = styleUnit2.substring(styleUnit2.indexOf(":") + 2);
String unitFontSize = attrUnit.substring(0, attrUnit.indexOf("px"));
//城市拼音div 宽高
Element cityHtml = document.getElementById("cityCode");
//获取文本值
//获取第一个div样式
String styleCityCode = cityHtml.attr("style");
String styleCityCode1 = styleCityCode.substring(styleCityCode.indexOf("width"));
String styleCityCode2 = styleCityCode1.substring(0, styleCityCode1.indexOf(";"));
String attr3 = styleCityCode2.substring(styleCityCode2.indexOf(":") + 2);
String cityWidth = attr3.substring(0, attr3.indexOf("px"));
String styleCityCode3 = styleCityCode.substring(styleCityCode.indexOf("height"));
String styleCityCode4 = styleCityCode3.substring(0, styleCityCode3.indexOf(";"));
String attr4 = styleCityCode4.substring(styleCityCode4.indexOf(":") + 2);
String cityHeight = attr4.substring(0, attr4.indexOf("px"));
String styleCityCode11 = styleCityCode.substring(styleCityCode.indexOf("font-size"));
String styleCityCode22 = styleCityCode11.substring(0, styleCityCode11.indexOf(";"));
String attrCityCode = styleCityCode22.substring(styleCityCode22.indexOf(":") + 2);
String cityCodeFontSize = attrCityCode.substring(0, attrCityCode.indexOf("px"));
//二维码div 宽高
Element qrcodeHtml = document.getElementById("qrcode");
//获取第一个div样式
String styleQrcode = qrcodeHtml.attr("style");
String styleQrcode1 = styleQrcode.substring(styleQrcode.indexOf("width"));
String styleQrcode2 = styleQrcode1.substring(0, styleQrcode1.indexOf(";"));
String attrCode = styleQrcode2.substring(styleQrcode2.indexOf(":") + 2);
String qrcodeWidth = attrCode.substring(0, attrCode.indexOf("px"));
String styleQrcode3 = styleQrcode.substring(styleQrcode.indexOf("height"));
String styleQrcode4 = styleQrcode3.substring(0, styleQrcode3.indexOf(";"));
String attrCode2 = styleQrcode4.substring(styleQrcode4.indexOf(":") + 2);
String qrcodeHeight = attrCode2.substring(0, attrCode2.indexOf("px"));
resultMap.put("width",width);
resultMap.put("height",height);
resultMap.put("cityWidth",cityWidth);
resultMap.put("cityHeight",cityHeight);
resultMap.put("qrcodeWidth",qrcodeWidth);
resultMap.put("qrcodeHeight",qrcodeHeight);
resultMap.put("streetFontSize",streetFontSize);
resultMap.put("subStreetFontSize",subStreetFontSize);
resultMap.put("streetNoFontSize",streetNoFontSize);
resultMap.put("subStreetNoFontSize",subStreetNoFontSize);
resultMap.put("unitFontSize",unitFontSize);
resultMap.put("cityCodeFontSize",cityCodeFontSize);
resultMap.put("streetNoWidth",streetNoWidth);
}else if(TaskPackageConstants.DOOR_CLASS_MIDDLE_M.equals(type)){
Document document = Jsoup.parse(html);
Element postList = document.getElementById("panelNode");
//获取模板第一个div样式
String style = postList.attr("style");
//获取模板宽高
String style1 = style.substring(style.indexOf("width"));
String style2 = style1.substring(0, style1.indexOf(";"));
String attr = style2.substring(style2.indexOf(":") + 2);
String width = attr.substring(0, attr.indexOf("px"));
//获取模板高
String style3 = style.substring(style.indexOf("height"));
String style4 = style3.substring(0, style3.indexOf(";"));
String attr1 = style4.substring(style4.indexOf(":") + 2);
String height = attr1.substring(0, attr.indexOf("px"));
//获取模板第二个div
Element streetHtml = document.getElementById("street");
//获取第2个div样式
String styleStreet = streetHtml.attr("style");
String styleStreet1 = styleStreet.substring(styleStreet.indexOf("font-size"));
String styleStreet2 = styleStreet1.substring(0, styleStreet1.indexOf(";"));
String attr2 = styleStreet2.substring(styleStreet2.indexOf(":") + 2);
String streetFontSize = attr2.substring(0, attr2.indexOf("px"));
//subStreet
Element subStreetHtml = document.getElementById("subStreet");
String styleSubStreet = subStreetHtml.attr("style");
String styleSubStreet1 = styleSubStreet.substring(styleSubStreet.indexOf("font-size"));
String styleSubStreet2 = styleSubStreet1.substring(0, styleSubStreet1.indexOf(";"));
String attrSubStreet = styleSubStreet2.substring(styleSubStreet2.indexOf(":") + 2);
String subStreetFontSize = attrSubStreet.substring(0, attrSubStreet.indexOf("px"));
//subStreetNo
Element subStreetNoHtml = document.getElementById("subStreetNo");
String styleSubStreetNo = subStreetNoHtml.attr("style");
String styleSubStreetNo1 = styleSubStreetNo.substring(styleSubStreetNo.indexOf("font-size"));
String styleSubStreetNo2 = styleSubStreetNo1.substring(0, styleSubStreetNo1.indexOf(";"));
String attrSubStreetNo = styleSubStreetNo2.substring(styleSubStreetNo2.indexOf(":") + 2);
String subStreetNoFontSize = attrSubStreetNo.substring(0, attrSubStreetNo.indexOf("px"));
//streetNo
Element streetNoHtml = document.getElementById("streetNo");
String styleStreetNo = streetNoHtml.attr("style");
String styleStreetNo1 = styleStreetNo.substring(styleStreetNo.indexOf("font-size"));
String styleStreetNo2 = styleStreetNo1.substring(0, styleStreetNo1.indexOf(";"));
String attrStreetNo = styleStreetNo2.substring(styleStreetNo2.indexOf(":") + 2);
String streetNoFontSize = attrStreetNo.substring(0, attrStreetNo.indexOf("px"));
//判断是否包含中文或标点符号
String streetNo = map.get("streetNo");
Matcher m = p.matcher(streetNo);
if (m.find()) {
streetNoFontSize = "50";
}
String streetNoWidth1 = styleStreetNo.substring(styleStreetNo.indexOf("width"));
String streetNoWidth2 = streetNoWidth1.substring(0, streetNoWidth1.indexOf(";"));
String attrStreetNoWidth = streetNoWidth2.substring(streetNoWidth2.indexOf(":") + 2);
String streetNoWidth = attrStreetNoWidth.substring(0, attrStreetNoWidth.indexOf("px"));
//unit
Element unitHtml = document.getElementById("unit");
String styleUnit = unitHtml.attr("style");
String styleUnit1 = styleUnit.substring(styleUnit.indexOf("font-size"));
String styleUnit2 = styleUnit1.substring(0, styleUnit1.indexOf(";"));
String attrUnit = styleUnit2.substring(styleUnit2.indexOf(":") + 2);
String unitFontSize = attrUnit.substring(0, attrUnit.indexOf("px"));
//城市拼音div 宽高
Element cityHtml = document.getElementById("cityCode");
//获取第一个div样式
String styleCityCode = cityHtml.attr("style");
String styleCityCode1 = styleCityCode.substring(styleCityCode.indexOf("width"));
String styleCityCode2 = styleCityCode1.substring(0, styleCityCode1.indexOf(";"));
String attr3 = styleCityCode2.substring(styleCityCode2.indexOf(":") + 2);
String cityWidth = attr3.substring(0, attr3.indexOf("px"));
String styleCityCode3 = styleCityCode.substring(styleCityCode.indexOf("height"));
String styleCityCode4 = styleCityCode3.substring(0, styleCityCode3.indexOf(";"));
String attr4 = styleCityCode4.substring(styleCityCode4.indexOf(":") + 2);
String cityHeight = attr4.substring(0, attr4.indexOf("px"));
String styleCityCode11 = styleCityCode.substring(styleCityCode.indexOf("font-size"));
String styleCityCode22 = styleCityCode11.substring(0, styleCityCode11.indexOf(";"));
String attrCityCode = styleCityCode22.substring(styleCityCode22.indexOf(":") + 2);
String cityCodeFontSize = attrCityCode.substring(0, attrCityCode.indexOf("px"));
//二维码div 宽高
Element qrcodeHtml = document.getElementById("qrcode");
//获取第一个div样式
String styleQrcode = qrcodeHtml.attr("style");
String styleQrcode1 = styleQrcode.substring(styleQrcode.indexOf("width"));
String styleQrcode2 = styleQrcode1.substring(0, styleQrcode1.indexOf(";"));
String attrCode = styleQrcode2.substring(styleQrcode2.indexOf(":") + 2);
String qrcodeWidth = attrCode.substring(0, attrCode.indexOf("px"));
String styleQrcode3 = styleQrcode.substring(styleQrcode.indexOf("height"));
String styleQrcode4 = styleQrcode3.substring(0, styleQrcode3.indexOf(";"));
String attrCode2 = styleQrcode4.substring(styleQrcode4.indexOf(":") + 2);
String qrcodeHeight = attrCode2.substring(0, attrCode2.indexOf("px"));
resultMap.put("width",width);
resultMap.put("height",height);
resultMap.put("cityWidth",cityWidth);
resultMap.put("cityHeight",cityHeight);
resultMap.put("qrcodeWidth",qrcodeWidth);
resultMap.put("qrcodeHeight",qrcodeHeight);
resultMap.put("streetFontSize",streetFontSize);
resultMap.put("subStreetFontSize",subStreetFontSize);
resultMap.put("subStreetNoFontSize",subStreetNoFontSize);
resultMap.put("streetNoFontSize",streetNoFontSize);
resultMap.put("unitFontSize",unitFontSize);
resultMap.put("cityCodeFontSize",cityCodeFontSize);
resultMap.put("streetNoWidth",streetNoWidth);
}else if(TaskPackageConstants.DOOR_CLASS_ROOM.equals(type)){
Document document = Jsoup.parse(html);
Element postList = document.getElementById("panelNode");
//获取模板第一个div样式
String style = postList.attr("style");
//获取模板宽高
String style1 = style.substring(style.indexOf("width"));
String style2 = style1.substring(0, style1.indexOf(";"));
String attr = style2.substring(style2.indexOf(":") + 2);
String width = attr.substring(0, attr.indexOf("px"));
//获取模板高
String style3 = style.substring(style.indexOf("height"));
String style4 = style3.substring(0, style3.indexOf(";"));
String attr1 = style4.substring(style4.indexOf(":") + 2);
String height = attr1.substring(0, attr.indexOf("px"));
//获取模板第二个div
Element streetHtml = document.getElementById("street");
//获取第2个div样式
String styleStreet = streetHtml.attr("style");
String styleStreet1 = styleStreet.substring(styleStreet.indexOf("font-size"));
String styleStreet2 = styleStreet1.substring(0, styleStreet1.indexOf(";"));
String attr2 = styleStreet2.substring(styleStreet2.indexOf(":") + 2);
String streetFontSize = attr2.substring(0, attr2.indexOf("px"));
//room
Element roomHtml = document.getElementById("room");
String styleRoom = roomHtml.attr("style");
String styleRoom1 = styleRoom.substring(styleRoom.indexOf("font-size"));
String styleRoom2 = styleRoom1.substring(0, styleRoom1.indexOf(";"));
String attrRoom = styleRoom2.substring(styleRoom2.indexOf(":") + 2);
String roomFontSize = attrRoom.substring(0, attrRoom.indexOf("px"));
//城市拼音div 宽高
Element cityHtml = document.getElementById("cityCode");
//获取第一个div样式
String styleCityCode = cityHtml.attr("style");
String styleCityCode1 = styleCityCode.substring(styleCityCode.indexOf("width"));
String styleCityCode2 = styleCityCode1.substring(0, styleCityCode1.indexOf(";"));
String attr3 = styleCityCode2.substring(styleCityCode2.indexOf(":") + 2);
String cityWidth = attr3.substring(0, attr3.indexOf("px"));
String styleCityCode3 = styleCityCode.substring(styleCityCode.indexOf("height"));
String styleCityCode4 = styleCityCode3.substring(0, styleCityCode3.indexOf(";"));
String attr4 = styleCityCode4.substring(styleCityCode4.indexOf(":") + 2);
String cityHeight = attr4.substring(0, attr4.indexOf("px"));
String styleCityCode11 = styleCityCode.substring(styleCityCode.indexOf("font-size"));
String styleCityCode22 = styleCityCode11.substring(0, styleCityCode11.indexOf(";"));
String attrCityCode = styleCityCode22.substring(styleCityCode22.indexOf(":") + 2);
String cityCodeFontSize = attrCityCode.substring(0, attrCityCode.indexOf("px"));
//二维码div 宽高
Element qrcodeHtml = document.getElementById("qrcode");
//获取第一个div样式
String styleQrcode = qrcodeHtml.attr("style");
String styleQrcode1 = styleQrcode.substring(styleQrcode.indexOf("width"));
String styleQrcode2 = styleQrcode1.substring(0, styleQrcode1.indexOf(";"));
String attrCode = styleQrcode2.substring(styleQrcode2.indexOf(":") + 2);
String qrcodeWidth = attrCode.substring(0, attrCode.indexOf("px"));
String styleQrcode3 = styleQrcode.substring(styleQrcode.indexOf("height"));
String styleQrcode4 = styleQrcode3.substring(0, styleQrcode3.indexOf(";"));
String attrCode2 = styleQrcode4.substring(styleQrcode4.indexOf(":") + 2);
String qrcodeHeight = attrCode2.substring(0, attrCode2.indexOf("px"));
resultMap.put("width",width);
resultMap.put("height",height);
resultMap.put("cityWidth",cityWidth);
resultMap.put("cityHeight",cityHeight);
resultMap.put("qrcodeWidth",qrcodeWidth);
resultMap.put("qrcodeHeight",qrcodeHeight);
resultMap.put("streetFontSize",streetFontSize);
resultMap.put("roomFontSize",roomFontSize);
resultMap.put("cityCodeFontSize",cityCodeFontSize);
}
return resultMap;
}
/**
* 获取字体大小
* @param map
* @param type
* @return
*/
public static Map<String,String> getFontSize(Map<String, String> map, String type){
Map<String,String> resultMap = new HashMap<>(16);
Map<String,String> result = getHtmlContext(map,type);
String width = result.get("width");
String height = result.get("height");
String cityWidth = result.get("cityWidth");
String cityHeight = result.get("cityHeight");
String qrcodeWidth = result.get("qrcodeWidth");
String qrcodeHeight = result.get("qrcodeHeight");
String streetNoWidth = result.get("streetNoWidth");
String street = map.get("street");
String streetNo = map.get("streetNo");
String subStreet = map.get("subStreet");
String subStreetNo = map.get("subStreetNo");
String unit = map.get("unit");
String aoiGate = map.get("aoiGate");
String cityCode = map.get("cityCode");
String room = map.get("room");
resultMap.put("width",width);
resultMap.put("height",height);
resultMap.put("cityWidth",cityWidth);
resultMap.put("cityHeight",cityHeight);
resultMap.put("qrcodeWidth",qrcodeWidth);
resultMap.put("qrcodeHeight",qrcodeHeight);
resultMap.put("street",street);
resultMap.put("streetFontSize",result.get("streetFontSize"));
resultMap.put("streetNo",streetNo);
resultMap.put("streetNoFontSize",result.get("streetNoFontSize"));
resultMap.put("subStreet",subStreet);
resultMap.put("subStreetFontSize",result.get("subStreetFontSize"));
resultMap.put("subStreetNo",subStreetNo);
resultMap.put("subStreetNoFontSize",result.get("subStreetNoFontSize"));
resultMap.put("unit",unit);
resultMap.put("unitFontSize",result.get("unitFontSize"));
resultMap.put("aoiGate",aoiGate);
resultMap.put("aoiGateFontSize",result.get("aoiGateFontSize"));
resultMap.put("cityCode",cityCode);
resultMap.put("cityCodeFontSize",result.get("cityCodeFontSize"));
resultMap.put("room",room);
resultMap.put("roomFontSize",result.get("roomFontSize"));
resultMap.put("streetNoWidth",streetNoWidth);
return resultMap;
}
/**
* 设置图片字体大小
* @param image
* @param width
* @param fontSizeStr
* @param str
*/
public static void setFontSize(BufferedImage image,String width,String fontSizeStr,String str){
Graphics2D g2d2 = image.createGraphics();
//字体最大 字尺寸
int fontSize = Double.valueOf(fontSizeStr).intValue();
//初始化一下字体
g2d2.setFont(new Font("宋体",Font.PLAIN,fontSize));
//图片宽度限制
int xz = Double.valueOf(width).intValue();
int ss = g2d2.getFontMetrics().stringWidth(str);
while(g2d2.getFontMetrics().stringWidth(str)>xz) {
fontSize = fontSize-1;
if(fontSize < 0){
fontSize =10;
g2d2.setFont(new Font("宋体",Font.PLAIN,fontSize));
}
}
}
}
3.效果图
三张图片叠加在一起的(二维码图片,城市拼音图片,底图)