POI给word中插入图片后打不开的bug
在使用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相关推荐
- Java利用poi生成word(包含插入图片,动态表格,行合并)
Java利用poi生成word(包含插入图片,动态表格,行合并) 测试模板样式: 图表 1 Word生成结果: 图表 2 需要的jar包:(具体jar可自行去maven下载) Test测试类: imp ...
- npoi2.0版本word中插入图片
npoi2.0版本word中插入图片,也可以插入条码. namespace InsertPicturesInWord { class Program { //ht ...
- Spire.Doc在Word中插入图片时,自适应宽度设置
需求:往Word中插入图片,需要铺满可编辑区域的宽度,此时需要根据文档的宽度自适应图片的大小了,核心代码如下: Paragraph paragraph = doc.createParagraph(); ...
- word中插入图片只显示底边,其他看不到,插入公式显示不全
在word中插入图片发现只能显示底边,其他内容看不到,图片上方还有文字,好像图片隐形了一样.插入公式显示不全,少些边角,尤其是公式的上下显示不完整. 原因: 段落中设置了固定行间距 解决方法: 先选中 ...
- 用“域”来往Word中插入图片
http://gzkhrh.blog.51cto.com/30447/121160 用"域"来往Word中插入图片 这里,会用到一个叫"INCLUDEPICTURE& ...
- Word中插入图片不清晰、分辨率较低的问题解决方案(VISIO\MATLAB)
Word中插入图片不清晰.分辨率较低的问题解决方案 1.网上常用的解决方案是修改word中自带的压缩设置,但大部分该操作不顶用.流程如下:文件-选项-高级-图像大小与质量 2.通常我们图片的来源是ma ...
- Word中插入图片不按原始大小显示的问题
Word中插入图片不按原始大小显示的问题 怎样设置Word文档图像的默认输出分辨率
- Python办公自动化实战 05 | Python-docx库:Python与Word的完美结合_ 利用代码实现Word中插入图片
一.专题内容简介 本专题主要介绍Python针对Word办公自动化如何利用Python代码动态向Word中插入图片.并且对格式做简单设定. 二.专题案例效果 最终运行效果如下: 三.专题代码实现 3 ...
- poi 向Excel中插入图片
使用poi向excel中插入图片 直接上代码,我这里的图片是项目中的一个logo图片,所以是直接springboot读取本地文件的方式 主要解释一下定位图片位置的八个参数int dx1, int dy ...
- java使用poi读写word中的图片(二)
文章目录 准备工作 简单读取 复杂读取 查看Word的XML 特别说明:Word中的Svg图片 第一种写入图片到Word中的方式 第二种写入图片到Word中的方式 最后 准备工作 这里就不在复述了,可 ...
最新文章
- java线程 同步与异步 线程池
- 今晚直播 | 商汤科技X-Lab刘宇:神经网络结构与大规模优化方法
- JAVA标识符的命名规则和规范
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
- Goreplay来做流量回放
- 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
- 深入Spring Boot:利用Arthas排查NoSuchMethodError
- net 中web.config一个配置文件解决方法 (其他配置文件引入方式)
- 信号生成及DFT的python实现
- putty连上l虚拟机中的linux要点
- ArcGIS案例学习笔记4_2_水文分析批处理地理建模
- Java中的Filter过滤器
- 软考高项-质量管理论文范文
- IOT [01] -- 物联网平台架构
- 枚举身份证后四位java代码
- 华为太极magisk安装教程_教程:如何升级太极内部的应用
- 电子研发公司_文件命名规则、版本命名规则_建议
- 每周论文精读05-A2J:AnchortoJointRegressionNetwork for 3D ArticulatedPoseEstimation from a SingleDepthImage
- 3Com发展史(摘录)
- 做人得厚道,不是么?