最近因为java项目中有大量的图片需要导出到word(采用freemarker导出模板),导出的过程中发现一个问题:导出饼图的时候会随着浏览器的大小不同被拉长或者拉伸,查阅很多质料但网上并没有找到相关的解决办法,因此今日记录下来以便以后查阅,同时也将解决思路分享给大家,有问题的地方希望有机会看到文章的技术大咖给以指导。
1、要点及思路
(1)word模板修改后将如果图片的单位是厘米则修改为像素(修改方法网上有)或者自己算出对应的像素,且以下计算已像素为准
(2)word文档另存为xml文件,此时打开可看到图片的一些设置 关键行<a:ext cx="1501775" cy="1365250" />设置图片的宽高
(3)cx,cy计算公式如下
公式:实际width=cX*100/914400;//固定系数
            实际height=cY*100/914400;//固定系数
(4)java项目将图片放大或缩小的的思路是获取图片宽度和高度,乘以倍数得出新的宽度和高度
因此解决该问题的思路转换为
第一步:前端获取实际图片的宽度高度传入后台,当然也可以java直接是获取图片文件
第二步:传入设置宽度和高度,即是上面提到的word里图片设置的像素
第二步:根据实际宽度高度和设置宽度高度计算缩放比例,得出目标宽度高度
第四步:根据以上公式,实际wideth即是现在的目标宽度,高度一样的,计算出目标CX,CY
第五步:将该CX,CY套入xml文件关键行 ,即是<a:ext cx="${目标宽度CX}" cy="${目标高度CY}" />
此时你可能会发现,如果本来实际宽度和实际高度已经小于设置宽度和高度,图片会被缩放的很小,因此,再对小于设置宽度或高度的图片做等比放大,以宽度位置还是高度位置取决于你自己因此:
第六步:选择性的等比放大目标宽度和高度,放大到合适大小
2、具体代码如下:
/**
  * 设置图片宽高(以纸张设置A4为标准,宽高单位像素)
  * @param imWidth 实际宽度
  * @param imHeight 实际高度
  * @param sWidth 设置宽度
  * @param sHeight 设置 
*@param iType 图片类型 已混搭图 和饼图为例
  * @param isEnlarge 是否放大 0-不放大,1-放大 选择性的放大图片
  * @remarks 当 实际宽高小于目标设置宽高时等比缩小后word展示的图片过小,此时下可设置等比放大,放大到合适大小
  * @return
  */ 
 public static Map<String,Object> setWH(String imWidth,String imHeight ,String sWidth,String sHeight,String iType,String isEnlarge){
   Map<String,Object> map=new HashMap<String,Object>();
  //设置宽高
  double width =Double.parseDouble(sWidth);
  double height=Double.parseDouble(sHeight);
  //实际宽高
  double iWidth=Double.parseDouble(imWidth);
  double iHeight=Double.parseDouble(imHeight);
  //目标宽高
  Double tW; 
  Double tH;
  
  //混搭图宽度比例以0.6作为分界点,小于0.6 会拉长,大于0.6会拉伸,饼图:大于0.7小于1.0时会拉长,大于1.0时会拉伸,次临界点以不同大小屏幕测试得出的计算值
  if((width/iWidth<0.6 && "1".equals(imageType)) || (width/iWidth>0.7 && width/iWidth<1.0 && "2".equals(imageType))){
   //计算缩放比例
   tW=iWidth*(height/iHeight);  
   tH=iHeight*(height/iHeight); 
  }else{
   //计算缩放比例
   if(width/iWidth<=height/iHeight){     
    tW=iWidth*(width/iWidth); 
    tH=iHeight*(height/iHeight);    
   }else{   
    tW=iWidth*(height/iHeight);  
    tH=iHeight*(height/iHeight); 
   }
   //选择性的等比放大图片
   if("1".equals(isEnlarge)){
    //目标宽度或高度小于设置宽度或高度时比例方法
    if(tW<width || tH<height){
     map=enlWH(tW,tH,width,height);
     tW=(Double) map.get("tW");
     tH=(Double)map.get("tH");
    }
   }
  
  }
  
  //图片cX,cY计算
  //914400为固定系数
  
  map.put("imageWidth", String.valueOf(tW.intValue()*914400/100));
  map.put("imageHeight",String.valueOf((tH.intValue()*914400/100)));
  return map;
 }
 
 /**
  * 比例放大
  * @param width 转换过的宽度
  * @param height 转换过的高度
  * @param MaxWidth 目标宽度
  * @param MaxHeight 目标高度
  */
 public static Map<String,Object> enlWH(double width,double height,double maxWidth,double maxHeight){
  Map<String, Object> map = Maps.newConcurrentMap();
   // 放大倍数
  double times = 1;
  //比例
  double sw = (maxWidth * 1.0) / (width * 1.0);
  double sh = (maxHeight * 1.0) / (height * 1.0);
  if (width > maxWidth && height > maxHeight) {
   return map;
  } else if (width < maxWidth && height <= maxHeight) {
   if (sw > sh) {
    times = sw + 0.2;//根据实际情况设置
   } else {
    times = sh + 0.2;
   }
  } else if (width < maxWidth && height > maxHeight) {
   times = sw + 0.2;
  } else {
   times = sh + 0.2;
  }
  NumberFormat nf=NumberFormat.getNumberInstance(); 
  nf.setMaximumFractionDigits(1);
  times=Double.parseDouble(nf.format(times));
  Double lastW = times * width;
  Double lastH = times * height;
  map.put("tW", lastW);
  map.put("tH", lastH);
  return map;
 }
第一次发表经验,以上只是解决此类问题的一个思路,但不是唯一办法,如有好的方案及思路很感谢一起分享出来,写的有不好地方敬请指正!

freemarker导出word文档对图片拉伸或拉长的处理相关推荐

  1. java通过freemarker导出word文档带图片并且循环

    转载请标明出处: https://blog.csdn.net/weixin_41965979/article/details/80969287 本文出自付付讶的博客 1:所需jar包:freemark ...

  2. freemarker导出Word文档并在其中插入图片

    先将word转成xml格式,再用notepad将其转为ftl格式(将要填入数据的地方加个占位符,${name}) import java.io.File; import java.io.FileInp ...

  3. 使用freemarker导出word文档包含多张图片

    使用freemarker导出word文档包含多张图片 最近项目中有个需求就是导出word文档并且文档中需要有多张图片,我当时一脸懵逼啊,之前没有搞过这个啊,但是不要灰心,肯定会有很多人搞过的,百度一下 ...

  4. java-制作flt模板,导出word文档带图片循环

    java-制作flt模板,导出word文档带图片循环 模板制作 制作xml 编辑xml文档 将xml模板转换为flt 编写工具类 导出word工具类 获取远程图片 使用示例 使用示例--springb ...

  5. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  6. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  7. 使用FreeMarker生成word文档(带图片),word转pdf,预览pdf,pdf下载工具类

    一.下载或配置: 下载jar包 :freemaker的jar包下载 下载jar包 :aspose-words的jar包下载 或者配置maven依赖: pom.xml添加aspose的依赖包(maven ...

  8. SpringBoot整合Freemarker导出word文档表格

    freemarker模板里面的template.process()方法里传入的第一个参数Object类型,如果是一个实体类对象在模板上怎么进行渲染,将实体类的值取出 freemarker会调用Obje ...

  9. Java+freemarker 导出Word文档的实现(包括word for Mac 插入域的方法)-静态数据,动态表格list

    1. 准备环境 1.1 word版本:MacOS系统下的Office360 word for Mac下好多操作和win的不一样啊啊啊,差点栽在Mac word的模版设计上. win版本的word模版设 ...

最新文章

  1. Business Contact Mnanager for Outlook2010之二:常用基本功能
  2. sql server 2005中新增加的try catch学习
  3. docker逃逸 从Play-with-Docker容器逃逸到Docker主机
  4. 尽快卸载这两款恶意浏览器插件!已有近50万用户安装
  5. oracle high watermark,Elasticsearch high disk watermark 问题
  6. select count(*) from返回的类型_数据分析面试题类型汇总
  7. I.MX6 Android 设备节点权限
  8. 杨校老师课堂之Hadoop环境搭建(一)
  9. 三角函数的思维导图(中)-1
  10. Premiere Pro CC2017软件安装资料及教程
  11. linux centos7 安装svn,linux centos7安装svn并配置同步更新web项目
  12. IDEA单机,双人五子棋
  13. 【linux_centOS】Warning: mysql_num_rows() expects parameter 1 to be resource
  14. friendly发音_欧路词典|英汉-汉英词典 friendly是什么意思_friendly的中文解释和发音_friendly的翻译_friendly怎么读...
  15. 大数据在金融领域的应用案例解析
  16. sql语句实现行转列的3种方法
  17. 学习Unix,可从事什么样的工作(2)《精通Unix下C语言与项目实践》读书笔记(4)...
  18. 如何处理大文件的GIS数据(剪裁数据)
  19. Echarts 地图隐藏右下角 “南海诸岛” 的方法
  20. 前端第八次培训(JS表单)

热门文章

  1. 数据挖掘的R包和函数的集合
  2. 若依Ruoyi 不分离教程01-新建主子表应用
  3. c语言叶子,用C语言画的一片叶子
  4. 【洛谷习题】Likecloud-吃、吃、吃
  5. ViacomCBS和韩国CJ ENM达成战略合作;AppsFlyer与英特尔共同打隐私云 | 全球TMT
  6. ssh 连接报错:Unable to negotiate with 192.168.xx.xx port 22: no matching key exchange method found.
  7. 突然悟到了“追求卓越”的真谛
  8. java转移oraclr数据_Oracle转义 - JAVA_NINA的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 90后的职场价值观:职场的本质是交换,从来不是奉献,更不是奉承!
  10. php调用python pkl_Python中的Pickle操作(pkl文件解释)