文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用POI向word中添加图片

2023-07-04 20:50

关注

本篇内容介绍了“如何使用POI向word中添加图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

使用POI向word中添加图片

由于一次需要向word中添加多张图片,其中有图片存在重复,一开始使用的创建图片代码为:

xwpf.createPicture(xwpf.getAllPictures().size()-1, 80, 30,pargraph);
public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {          final int EMU = 9525;          width *= EMU;          height *= EMU;          String blipId = getAllPictures().get(id).getPackageRelationship().getId();          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);          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");      }

上述代码对于重复的图片流不会第二次生成id,因此会造成第二次出现的图片被后续图片覆盖的情况。

因此,修改为如下处理方式,解决了重复图片的问题:

String ind = xwpf.addPictureData(is, XWPFDocument.PICTURE_TYPE_GIF);int id =  xwpf.getNextPicNameNumber(XWPFDocument.PICTURE_TYPE_GIF);xwpf.createPicture(ind, id, 80, 30,pargraph);
public void createPicture(String blipId, int id, int width, int height,XWPFParagraph paragraph) {          final int EMU = 9525;          width *= EMU;          height *= EMU;          //String blipId = getAllPictures().get(id).getPackageRelationship().getId();          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);          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");      }

使用POI给Word添加水印

Maven 引入依赖

       <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactId>            <version>3.17</version>        </dependency>                <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi-ooxml</artifactId>            <version>3.17</version>        </dependency>

Java 代码:

package com.daydayup.study001.watermark;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFHeader;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.poi.xwpf.usermodel.XWPFRun;public class WatermarkForWord {    public static void main(String[] args) throws FileNotFoundException, IOException {        XWPFDocument doc= new XWPFDocument();          // the body content          XWPFParagraph paragraph = doc.createParagraph();          XWPFRun run=paragraph.createRun();            run.setText("The Body:");          // create header-footer          XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy();          if (headerFooterPolicy == null) headerFooterPolicy = doc.createHeaderFooterPolicy();          // create default Watermark - fill color black and not rotated          headerFooterPolicy.createWatermark("Watermark");          // get the default header          // Note: createWatermark also sets FIRST and EVEN headers           // but this code does not updating those other headers          XWPFHeader header = headerFooterPolicy.getHeader(XWPFHeaderFooterPolicy.DEFAULT);          paragraph = header.getParagraphArray(0);          // get com.microsoft.schemas.vml.CTShape where fill color and rotation is set          org.apache.xmlbeans.XmlObject[] xmlobjects = paragraph.getCTP().getRArray(0).getPictArray(0).selectChildren(            new javax.xml.namespace.QName("urn:schemas-microsoft-com:vml", "shape"));          if (xmlobjects.length > 0) {           com.microsoft.schemas.vml.CTShape ctshape = (com.microsoft.schemas.vml.CTShape)xmlobjects[0];           // set fill color           ctshape.setFillcolor("#d8d8d8");           // set rotation           ctshape.setStyle(ctshape.getStyle() + ";rotation:315");           //System.out.println(ctshape);          }          doc.write(new FileOutputStream("CreateWordHeaderFooterWatermark.docx"));          doc.close();    }}

“如何使用POI向word中添加图片”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯