在使用POI给word插入图片的时候发现,插入图片后,生成的文件打不开,提示格式损坏,查了一下,这是POI自带的bug,真是不想说这是有多操蛋了。
直接查看word中的document.xml文件,和正常的word中的document.xml对比,发现了POI生成的word格式有问题,因此就得从这方面找解决之道,这是一个正常的document.xml的图片部分,如果大家有相同的问题,可以用这个做对比:

<w:p><w:pPr><w:jc w:val="center"/></w:pPr><w:r><w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0"><wp:extent cx="7620000" cy="1905000"/><wp:docPr id="2" name="Picture 2" descr="Generated"/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:nvPicPr><pic:cNvPr id="2" name="Generated"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed="rId2" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="7620000" cy="1905000"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r></w:p>

现在看解决办法:

package com.railway.schedule.service;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;import java.io.*;
import java.util.List;public class CustomXWPFDocument extends XWPFDocument {public CustomXWPFDocument() {super();}public CustomXWPFDocument(OPCPackage opcPackage) throws IOException {super(opcPackage);}public CustomXWPFDocument(InputStream in) throws IOException {super(in);}public void createPicture(String blipId,int id, int width, int height) {width = width * 1000;height = height * 1000;//String blipId = getAllPictures().get(id).getPackageRelationship().getId();XWPFParagraph paragraph = createParagraph();paragraph.setAlignment(ParagraphAlignment.CENTER);CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();String picXml = "" +"<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" +"   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +"      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +"         <pic:nvPicPr>" +"            <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" +"            <pic:cNvPicPr/>" +"         </pic:nvPicPr>" +"         <pic:blipFill>" +"            <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" +"            <a:stretch>" +"               <a:fillRect/>" +"            </a:stretch>" +"         </pic:blipFill>" +"         <pic:spPr>" +"            <a:xfrm>" +"               <a:off x=\"0\" y=\"0\"/>" +"               <a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" +"            </a:xfrm>" +"            <a:prstGeom prst=\"rect\">" +"               <a:avLst/>" +"            </a:prstGeom>" +"         </pic:spPr>" +"      </pic:pic>" +"   </a:graphicData>" +"</a:graphic>";//CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData();XmlToken xmlToken = null;try {xmlToken = XmlToken.Factory.parse(picXml);} catch(XmlException xe) {xe.printStackTrace();}inline.set(xmlToken);//graphicData.set(xmlToken);inline.setDistT(0);inline.setDistB(0);inline.setDistL(0);inline.setDistR(0);CTPositiveSize2D extent = inline.addNewExtent();extent.setCx(width);extent.setCy(height);CTNonVisualDrawingProps docPr = inline.addNewDocPr();docPr.setId(id);docPr.setName("Picture " + id);docPr.setDescr("Generated");}}

我们把插入图片使用的类继承一下,扩展一下,然后把原生使用的方法绕过就好了,请看具体实现:

private CustomXWPFDocument fillSignalImgToWord(Map<String, String> pathMap, CustomXWPFDocument doc) {String chartSignalAnalysis1 = pathMap.get("chartSignalAnalysis1");XWPFRun run;if (!"".equals(chartSignalAnalysis1) && !"".equals(chartSignalAnalysis2)) {try {XWPFParagraph paragraph5 = doc.createParagraph();run = paragraph5.createRun();run = Utils.chgFont(run, "宋体", 14);run.setText("    MT1呼叫信令:");FileInputStream is = new FileInputStream(chartSignalAnalysis1);//run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, chartSignalAnalysis1, 600, 1200);doc.createPicture(doc.addPictureData(is, XWPFDocument.PICTURE_TYPE_PNG), doc.getNextPicNameNumber(XWPFDocument.PICTURE_TYPE_PNG), 7000, 8000);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (InvalidFormatException e) {e.printStackTrace();}}return doc;}

注释掉的代码就是原来插入图片的方法,插入图片后,返回CustomXWPFDocument这个对象,再做其他使用,就OK了
亲测可用!!!

POI给word中插入图片后打不开的bug相关推荐

  1. Java利用poi生成word(包含插入图片,动态表格,行合并)

    Java利用poi生成word(包含插入图片,动态表格,行合并) 测试模板样式: 图表 1 Word生成结果: 图表 2 需要的jar包:(具体jar可自行去maven下载) Test测试类: imp ...

  2. npoi2.0版本word中插入图片

     npoi2.0版本word中插入图片,也可以插入条码. namespace InsertPicturesInWord {     class Program     {         //ht ...

  3. Spire.Doc在Word中插入图片时,自适应宽度设置

    需求:往Word中插入图片,需要铺满可编辑区域的宽度,此时需要根据文档的宽度自适应图片的大小了,核心代码如下: Paragraph paragraph = doc.createParagraph(); ...

  4. word中插入图片只显示底边,其他看不到,插入公式显示不全

    在word中插入图片发现只能显示底边,其他内容看不到,图片上方还有文字,好像图片隐形了一样.插入公式显示不全,少些边角,尤其是公式的上下显示不完整. 原因: 段落中设置了固定行间距 解决方法: 先选中 ...

  5. 用“域”来往Word中插入图片

    http://gzkhrh.blog.51cto.com/30447/121160 用"域"来往Word中插入图片   这里,会用到一个叫"INCLUDEPICTURE& ...

  6. Word中插入图片不清晰、分辨率较低的问题解决方案(VISIO\MATLAB)

    Word中插入图片不清晰.分辨率较低的问题解决方案 1.网上常用的解决方案是修改word中自带的压缩设置,但大部分该操作不顶用.流程如下:文件-选项-高级-图像大小与质量 2.通常我们图片的来源是ma ...

  7. Word中插入图片不按原始大小显示的问题

    Word中插入图片不按原始大小显示的问题 怎样设置Word文档图像的默认输出分辨率

  8. Python办公自动化实战 05 | Python-docx库:Python与Word的完美结合_ 利用代码实现Word中插入图片

    一.专题内容简介 本专题主要介绍Python针对Word办公自动化如何利用Python代码动态向Word中插入图片.​并且对格式做简单设定. 二.专题案例效果 最终运行效果如下: 三.专题代码实现 3 ...

  9. poi 向Excel中插入图片

    使用poi向excel中插入图片 直接上代码,我这里的图片是项目中的一个logo图片,所以是直接springboot读取本地文件的方式 主要解释一下定位图片位置的八个参数int dx1, int dy ...

  10. java使用poi读写word中的图片(二)

    文章目录 准备工作 简单读取 复杂读取 查看Word的XML 特别说明:Word中的Svg图片 第一种写入图片到Word中的方式 第二种写入图片到Word中的方式 最后 准备工作 这里就不在复述了,可 ...

最新文章

  1. java线程 同步与异步 线程池
  2. 今晚直播 | 商汤科技X-Lab刘宇:神经网络结构与大规模优化方法
  3. JAVA标识符的命名规则和规范
  4. 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
  5. Goreplay来做流量回放
  6. 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
  7. 深入Spring Boot:利用Arthas排查NoSuchMethodError
  8. net 中web.config一个配置文件解决方法 (其他配置文件引入方式)
  9. 信号生成及DFT的python实现
  10. putty连上l虚拟机中的linux要点
  11. ArcGIS案例学习笔记4_2_水文分析批处理地理建模
  12. Java中的Filter过滤器
  13. 软考高项-质量管理论文范文
  14. IOT [01] -- 物联网平台架构
  15. 枚举身份证后四位java代码
  16. 华为太极magisk安装教程_教程:如何升级太极内部的应用
  17. 电子研发公司_文件命名规则、版本命名规则_建议
  18. 每周论文精读05-A2J:AnchortoJointRegressionNetwork for 3D ArticulatedPoseEstimation from a SingleDepthImage
  19. 3Com发展史(摘录)
  20. 做人得厚道,不是么?

热门文章

  1. 简报 | 解决“无感停车”开票难题, 广州试水区块链停车发票
  2. 嵌入式单片机及外设(硬件)知识基础一
  3. 按位与运算()和求余运算(%)的联系
  4. 技术自查番外篇六:死锁及解决办法
  5. 程序员最爱的11个在线社区,你去过几个?
  6. K线形态识别—多K线之买入型多日K线组合
  7. wps无法使用F4重复上一步操作的解决方法
  8. mysql实现跨库多表查询
  9. springboot - redis记录并统计网页浏览量
  10. ensp 链路聚合的配置