文章目录

  • 准备工作
  • 简单读取
  • 复杂读取
  • 查看Word的XML
  • 特别说明:Word中的Svg图片
  • 第一种写入图片到Word中的方式
  • 第二种写入图片到Word中的方式
  • 最后

准备工作

这里就不在复述了,可以看上一篇博文 java使用poi读写word中的内容(包含表格内容)(一)

代码中MyUnits工具类在我另一篇博文中 word中各种长度转换为px(工具类)

简单读取

如果后期还有回写到word中不建议使用这种方式读取。

 @Testpublic void test() throws FileNotFoundException, IOException {XWPFDocument document = new XWPFDocument(new FileInputStream("D:\\Test\\word\\test1.docx"));try {List<XWPFParagraph> paragraphs = document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {List<XWPFPicture> pictures = run.getEmbeddedPictures();// 我这里是偷懒,请使用循环XWPFPicture picture = pictures.get(0);XWPFPictureData pictureData = picture.getPictureData();System.out.println(pictureData.getPictureType());System.out.println(pictureData.getFileName());System.out.println(pictureData.getData());}}} finally {document.close();}}

上面代码中,可以直接取出word中的图片,但是无法取出图片在word中的大小此处要注意,word中图片的大小可能与图片的大小不一致操作word你就知道,图片放入word中后是可以放大或缩小的

复杂读取

 @Testpublic void test1() throws FileNotFoundException, IOException {XWPFDocument document = new XWPFDocument(new FileInputStream("D:\\Test\\word\\test1.docx"));try {List<XWPFParagraph> paragraphs = document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {Node node = run.getCTR().getDomNode();// drawing 一个绘画的图片Node drawingNode = getChildNode(node, "w:drawing");if (drawingNode == null) {continue;}// 绘画图片的宽和高Node extentNode = getChildNode(drawingNode, "wp:extent");NamedNodeMap extentAttrs = extentNode.getAttributes();System.out.println("宽:".concat(extentAttrs.getNamedItem("cx").getNodeValue()).concat("emu"));System.out.println("高:".concat(extentAttrs.getNamedItem("cy").getNodeValue()).concat("emu"));// 绘画图片具体引用Node blipNode = getChildNode(drawingNode, "a:blip");NamedNodeMap blipAttrs = blipNode.getAttributes();String rid = blipAttrs.getNamedItem("r:embed").getNodeValue();System.out.println("word中图片ID:".concat(rid));// 获取图片信息PackagePart part = document.getPartById(rid);System.out.println(part.getContentType());System.out.println(part.getPartName().getName());System.out.println(part.getInputStream());System.out.println("------ run ------");}System.out.println("------ paragraph ------");}} finally {document.close();}}private Node getChildNode(Node node, String nodeName) {if (!node.hasChildNodes()) {return null;}NodeList childNodes = node.getChildNodes();for (int i = 0; i < childNodes.getLength(); i++) {Node childNode = childNodes.item(i);if (nodeName.equals(childNode.getNodeName())) {return childNode;}childNode = getChildNode(childNode, nodeName);if (childNode != null) {return childNode;}}return null;}

上面代码中既可以读取到图片在word中的宽高,也可以读取到图片的信息
注意宽和高的单位为emu
emupx的工具类我已经共享出来了,word中各种长度转换为px(工具类)

查看Word的XML

w:drawingwp:extenta:blip等等,这些我是怎么知道的呢?
当然是直接在word里面看见的了,下面教大家如何看word的xml

首先要安装压缩工具(我用的是360压缩)

选择用360压缩打开

打开后双击word文件夹

document.xml拉倒桌面,然后将文件里的xml格式化一下就可以看到了,如图

特别说明:Word中的Svg图片

这里特别说明一下,如果将svg(手动操作Word并非程序操作)图片插入word中的话,Word会生成一张png图片。Word中显示的也是png图片。这里我们看下xml
仔细看,这段xml中有两处r:embed

第一处r:embed="rId6"引用的是png图片

第二处r:embed="rId7"引用的才是你插入的svg图片

<w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="43206650" wp14:editId="4D01F649"><wp:extent cx="352425" cy="200025"/><wp:effectExtent l="0" t="0" r="9525" b="9525"/><wp:docPr id="1" name="图形 1"/><wp:cNvGraphicFramePr><a:graphicFrameLocksxmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/></wp:cNvGraphicFramePr><a:graphicxmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:picxmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:nvPicPr><pic:cNvPr id="1" name=""/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed="rId6"><a:extLst><a:ext uri="{96DAC541-7B7A-43D3-8B79-37D633B846F1}"><asvg:svgBlipxmlns:asvg="http://schemas.microsoft.com/office/drawing/2016/SVG/main" r:embed="rId7"/></a:ext></a:extLst></a:blip><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="352425" cy="200025"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing>

第一种写入图片到Word中的方式

注意:这种方式写入图片,宽高单位必须是emu

 @Testpublic void test2() throws IOException, InvalidFormatException {XWPFDocument document = new XWPFDocument();try {XWPFParagraph paragraph = document.createParagraph();XWPFRun run = paragraph.createRun();InputStream is = new FileInputStream("D:\\Test\\word\\aa.png");// 因为FileInputStream没有重写reset() 所有将流转为了byte数组byte[] bs = IOUtils.toByteArray(is);BufferedImage image = ImageIO.read(new ByteArrayInputStream(bs));int width = MyUnits.pxToEMU(image.getWidth());int height = MyUnits.pxToEMU(image.getHeight());run.addPicture(new ByteArrayInputStream(bs), Document.PICTURE_TYPE_PNG, "", width, height);OutputStream stream = new FileOutputStream("D:\\Test\\word\\w_test.docx");document.write(stream);} finally {document.close();}}

看看写入的效果

第二种写入图片到Word中的方式

相对第一种这种方式要复杂一点
注意:这种方式写入图片的宽高inmmcmptpx都可以使用,我这里用的是pt.

 @Testpublic void test3() throws IOException {XWPFDocument document = new XWPFDocument();try {XWPFParagraph paragraph = document.createParagraph();XWPFRun run = paragraph.createRun();// 获取图片InputStream is = new FileInputStream("D:\\Test\\word\\aa.png");byte[] bs = IOUtils.toByteArray(is);BufferedImage image = ImageIO.read(new ByteArrayInputStream(bs));// 获取组装图片宽高,单位ptStringBuffer dataSize = new StringBuffer();dataSize.append("width:").append(MyUnits.pxToPt(image.getWidth())).append("pt;");dataSize.append("height:").append(MyUnits.pxToPt(image.getHeight())).append("pt;");// 添加图片到Word中String rid = document.addPictureData(bs, Document.PICTURE_TYPE_PNG);StringBuffer xml = new StringBuffer();xml.append("<w:pict xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"");xml.append(" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");xml.append(" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n");xml.append("  <v:shape id=\"图片1").append("\" o:spid=\"\" type=\"\" alt=\"\" style=\"").append(dataSize).append("\">\r\n");xml.append("     <v:imagedata r:id=\"").append(rid).append("\" o:title=\"\" />");xml.append("    </v:shape>\r\n");xml.append("</w:pict>");InputSource source = new InputSource(new StringReader(xml.toString()));org.w3c.dom.Document pictDoc = DocumentHelper.readDocument(source);// 将信息写入run中run.setEmbossed(true);XmlObject xmlObject = XmlObject.Factory.parse(pictDoc.getDocumentElement(), POIXMLTypeLoader.DEFAULT_XML_OPTIONS);run.getCTR().set(xmlObject);OutputStream stream = new FileOutputStream("D:\\Test\\word\\w_test1.docx");document.write(stream);} catch (Exception e) {e.printStackTrace();} finally {document.close();}}

看看写入效果

最后

如果有什么不明白的可以留言。
欢迎大家留言讨论。

java使用poi读写word中的图片(二)相关推荐

  1. Java使用Poi填充Word表格模板(图片和文字)

    Java使用Poi填充Word表格模板(图片和文字) **** 由于个人需求需要对表格模板进行操作,所以本文章只对表格进行替换数据操作,没有段落,没有循环遍历,没有延伸!!!!!(后续补充!!!) * ...

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

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

  3. java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换、更新内置Excel数据、更新插入的文本框内容、合并表格单元格;

    本文参考地址:https://blog.csdn.net/wangxiaoyingWXY/article/details/95377533 在参考文章的基础上,增加了扩展.感谢被参考的妹子.另外该博客 ...

  4. java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换 springboot项目

    本文参考地址:https://blog.csdn.net/u014427811/article/details/100771314 在参考文章的基础上,增加了模板样例 模板样例地址 百度网盘 链接:h ...

  5. java利用POI在word中绘制折线图

    1.poi的简介 Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel.WORD ...

  6. java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片

    介绍 java使用poi在word模板中替换柱状图.折线图.饼图.表格.文本.图片 软件架构 安装教程 环境搭建:jdk1.8.0_291.maven1.8.0_291 IDEA工具:IntelliJ ...

  7. java 读取excel 图片_利用Java+POI 读写Excel文档向Excel中插入图片

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

  8. java使用poi操作word模板,插入图片、段落、表格

    java使用poi操作word插入图片.段落.表格 其他链接 准备工作 创建word模板.docx文件 编写模板格式.xml文件 java上手poi maven依赖 使用到的包 具体应用 对应封装方法 ...

  9. [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能)

    [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能) 基于Apache POI对Word进行操作 一.基于Apache POI封装的word文档工具V1. ...

最新文章

  1. C语言文件最后一行重复储存,求大佬看看,我这个程序为什么保存进文件只有最后一行...
  2. java8新特性(四)_Stream详解
  3. python 计算累计人数_免费Python入门课程,看到就是赚到~
  4. 2021方便速食行业洞察报告
  5. 太省事了!高分SCI全套优质模板下载
  6. oracle数据库查询表的列
  7. 拉勾发布互联网社畜输入法报告:市场人每日打字7300个
  8. Hadoop1——创建虚拟机
  9. layui引入jQuery
  10. zuul源码分析之Request生命周期管理
  11. 关于计算机航天生物的想像作文,未来的航天员想象作文
  12. easyui常用控件样式收藏
  13. java正整数正则表达式_Java 正则表达式
  14. 999宝藏网ghostxp-sp2(圣诞+纯净版)
  15. 复盘 20160629
  16. 奥升德赢得三星SDI锂离子电池添加剂专利案;蜂巢能源完成102.8亿元人民币B轮融资;伊顿、特灵科技、芬美意发布财报 | 能动...
  17. ORACLE TRUNCATE 的用法
  18. 最全的大数据采集方法分类
  19. Android百度地图API使用教程
  20. 联发科技一道笔试题目

热门文章

  1. 阿里云服务器深度学习环境从0配置(Ubuntu16.04+cuda8.0+cudnn6.0+tensorflow1.4+Anaconda3+opencv2+tensorlayer1.7.4)
  2. 免校准的电量计量芯片_免校准电能计量芯片,让家电智能化更简单
  3. bat putty shell 连携
  4. LP前缀是什么意思?
  5. 面试题:看数字找规律
  6. sublime指定python版本
  7. python对excel分列转多行
  8. 2018 ACM-ICPC 北京站 游记
  9. k8s可视化管理工具
  10. logback配置 (分文件夹、可配路径)_hanCSDN_20180906