上篇文章使用了inline方式往页眉中插入图片,因为这种方式插入的图片不好按照坐标定位方式调整图片的摆放位置,所以只能参考NPOI 源码中inline的方式修改添加CT_Anchor 锚点的方式

首先下载含有页眉添加图片的NPOI   dll文件:https://download.csdn.net/download/dengxt/10824550

然后打开Reflector,file-open选择NPOI.OOXML.DLL这个库文件,这样就可以查看class中的代码,想要将全部代码导出或者某个方法导出,需要安装Reflector.FileDisassembler.dll 插件,

使用插件可以将代码反编译成文件,方便查看使用, 使用中会弹出其他的引用库,选择添加上即不会再弹出

点击打开文件中的方法,就可以查看其中的源码,

仿照XWPFHeaderFooter抽象类中AddPicture方法,重写一个带有anchor的方法,和XWPFRun中的AddPicture方法类似,如下

//添加一个带有锚点坐标方式的插入图片
public void AddPicture(Stream pictureData, int pictureType, string filename, int width, int height, CT_PosH posHOffset, CT_PosV posVOffset, object wrap, CT_Anchor paranchor, CT_Positive2D parsimplePos, CT_EffectExtent aneffectExtent)
{//本方法主要参考XWPFHeaderFooter中的AddPicture方法,也是结合XWPFRun里面的AddPicture进行修改//XWPFDocument document = this.paragraph.Document;this.document = (XWPFDocument) base.GetParent();string str = this.AddPictureData(pictureData, pictureType);//string id = document.AddPictureData(pictureData, pictureType);//XWPFPictureData relationById = (XWPFPictureData) document.GetRelationById(id);//CT_Drawing drawing = this.run.AddNewDrawing();//CT_R ct_r = this.headerFooter.AddNewP().AddNewR();//使用xml中的run(CT_R) 创建CT_DrawingCT_Drawing drawing = this.headerFooter.AddNewP().AddNewR().AddNewDrawing();CT_Anchor item = new CT_Anchor();drawing.set_anchor(new List<CT_Anchor>());drawing.get_anchor().Add(item);item.set_graphic(new CT_GraphicalObject());item.get_graphic().set_graphicData(new CT_GraphicalObjectData());item.get_graphic().get_graphicData().set_uri("http://schemas.openxmlformats.org/drawingml/2006/picture");item.set_distT(paranchor.get_distT());item.set_distR(paranchor.get_distR());item.set_distB(paranchor.get_distB());item.set_distL(paranchor.get_distL());item.set_relativeHeight(paranchor.get_relativeHeight());item.set_behindDoc(paranchor.get_behindDoc());item.set_locked(paranchor.get_locked());item.set_layoutInCell(paranchor.get_layoutInCell());item.set_allowOverlap(paranchor.get_allowOverlap());item.set_simplePos(new CT_Positive2D());item.get_simplePos().set_x(parsimplePos.get_x());item.get_simplePos().set_y(parsimplePos.get_y());item.set_positionH(posHOffset);item.set_positionV(posVOffset);CT_PositiveSize2D sized = new CT_PositiveSize2D();sized.set_cx((long) width);sized.set_cy((long) height);item.set_extent(sized);item.set_effectExtent(new CT_EffectExtent());item.get_effectExtent().set_b(aneffectExtent.get_b());item.get_effectExtent().set_l(aneffectExtent.get_l());item.get_effectExtent().set_r(aneffectExtent.get_r());item.get_effectExtent().set_t(aneffectExtent.get_t());if (wrap.GetType().Name.ToString() == "CT_WrapSquare")//四周型{item.set_wrapSquare(new CT_WrapSquare());item.get_wrapSquare().set_wrapText(((CT_WrapSquare) wrap).get_wrapText());}else if (wrap.GetType().Name.ToString() == "CT_WrapTight")//紧密型{item.set_wrapTight(new CT_WrapTight());item.get_wrapTight().set_wrapText(((CT_WrapTight) wrap).get_wrapText());item.get_wrapTight().set_wrapPolygon(new CT_WrapPath());item.get_wrapTight().get_wrapPolygon().set_edited(((CT_WrapTight) wrap).get_wrapPolygon().get_edited());item.get_wrapTight().get_wrapPolygon().set_start(new CT_Positive2D());item.get_wrapTight().get_wrapPolygon().get_start().set_x(((CT_WrapTight) wrap).get_wrapPolygon().get_start().get_x());item.get_wrapTight().get_wrapPolygon().get_start().set_y(((CT_WrapTight) wrap).get_wrapPolygon().get_start().get_y());item.get_wrapTight().get_wrapPolygon().set_lineTo(new List<CT_Positive2D>());foreach (CT_Positive2D positived in ((CT_WrapTight) wrap).get_wrapPolygon().get_lineTo()){item.get_wrapTight().get_wrapPolygon().get_lineTo().Add(positived);}}else if (wrap.GetType().Name.ToString() == "CT_WrapThrough")//穿越型{item.set_wrapThrough(new CT_WrapThrough());item.get_wrapThrough().set_wrapText(((CT_WrapThrough) wrap).get_wrapText());item.get_wrapThrough().set_wrapPolygon(new CT_WrapPath());item.get_wrapThrough().get_wrapPolygon().set_edited(((CT_WrapThrough) wrap).get_wrapPolygon().get_edited());item.get_wrapThrough().get_wrapPolygon().set_start(new CT_Positive2D());item.get_wrapThrough().get_wrapPolygon().get_start().set_x(((CT_WrapThrough) wrap).get_wrapPolygon().get_start().get_x());item.get_wrapThrough().get_wrapPolygon().get_start().set_y(((CT_WrapThrough) wrap).get_wrapPolygon().get_start().get_y());item.get_wrapThrough().get_wrapPolygon().set_lineTo(new List<CT_Positive2D>());foreach (CT_Positive2D positived2 in ((CT_WrapThrough) wrap).get_wrapPolygon().get_lineTo()){item.get_wrapThrough().get_wrapPolygon().get_lineTo().Add(positived2);}}else if (wrap.GetType().Name.ToString() == "CT_WrapTopBottom")//剩下的一种方式{item.set_wrapTopAndBottom(new CT_WrapTopBottom());}else if (wrap.GetType().Name.ToString() == "CT_WrapNone")//剩下的另一种方式{item.set_wrapNone(new CT_WrapNone());}CT_NonVisualDrawingProps props = new CT_NonVisualDrawingProps();long num = this.Paragraph.Document.DrawingIdManager.ReserveNew();props.set_id((uint) num);props.set_name("Drawing " + num);props.set_descr(filename);item.set_docPr(props);item.set_cNvGraphicFramePr(new CT_NonVisualGraphicFrameProperties());item.get_graphic().get_graphicData();CT_Picture ctPic = new CT_Picture();CT_PictureNonVisual visual = ctPic.AddNewNvPicPr();CT_NonVisualDrawingProps props2 = visual.AddNewCNvPr();props2.set_id(0);props2.set_name(filename);visual.AddNewCNvPicPr().AddNewPicLocks().set_noChangeAspect(true);CT_BlipFillProperties properties2 = ctPic.AddNewBlipFill();//properties2.AddNewBlip().set_embed(relationById.GetPackageRelationship().get_Id());properties2.AddNewBlip().set_embed(str);//直接取IDproperties2.AddNewStretch().AddNewFillRect();CT_ShapeProperties properties3 = ctPic.AddNewSpPr();CT_Transform2D transformd = properties3.AddNewXfrm();CT_Point2D pointd = transformd.AddNewOff();pointd.set_x(0L);pointd.set_y(0L);CT_PositiveSize2D sized2 = transformd.AddNewExt();sized2.set_cx((long) width);sized2.set_cy((long) height);CT_PresetGeometry2D geometryd = properties3.AddNewPrstGeom();geometryd.set_prst(4);geometryd.AddNewAvLst();using (MemoryStream stream = new MemoryStream()){StreamWriter writer = new StreamWriter(stream);ctPic.Write(writer, "pic:pic");writer.Flush();stream.Position = 0L;string str2 = new StreamReader(stream).ReadToEnd();item.get_graphic().get_graphicData().AddPicElement(str2);}}

关于重新打包成dll目前并有实现,可以新建class继承XWPFHeaderFooter,然后重写上面的方法进行使用,

收集的使用NPOI操作word的文档,还是比较适用的文档 https://download.csdn.net/download/dengxt/10823924

使用Reflector 反编译 NPOI 查看源码,参考源码修改NPOI创建word 页眉中添加锚点图片相关推荐

  1. Apk反编译工具查看layout 和java源码的工具

    首先要准备反编译三件套,这个在网上应该会有很多 一: 查看layout 解压得到apktol.jar 和 apktool.bat 同时把要反编译的apk也一起存放在当前目录下 然后打开控制台  cmd ...

  2. 如何用电脑反编译微信小程序,获得源码(学习用途)

    故事背景:上周末,搞前端的发小(老表)找到我,问我微信小程序能否反编译成功,然后他需要源码,看他的接口签名算法 周末在公司研究了一下午 最后成功了,心路历程走一波,总结一下 一.准备工具: 模拟器: ...

  3. 共享一个对Reflector 反编译支持中文的修正FileGenerator文件

    共享一个对Reflector 反编译支持中文的修正FileGenerator文件 文件生成插件 转载于:https://www.cnblogs.com/LifelongLearning/archive ...

  4. 弥补Reflector反编译对中文支持的不足

    Reflector是我目前用的最多的反编译工具,他可能不时最好的,但以它的更新速度,我相信他会成为最好的哦~~     国外的软件,对中文支持还是有问题,虽然我们都Unicode了,可是老外还是不一定 ...

  5. 解决在使用 Qt 编译项目时出现 “C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode格式以防止数据丢失“ 的警告

    解决在使用 Qt 编译项目时出现 "C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode格式以防止数据丢失" 的警告 警告出现的原因:编 ...

  6. .net Reflector 反编译源码笔记

    使用.net Refector 反编译C#,的确是一个很好的工具,不过随着研究的深入发现,其中还有有一些不尽人意,让初学者摸不着头脑的情况. 源码 using System; using System ...

  7. vue代码可以反编译吗_微信小程序源码提取反编译

    一.前言 微信小程序源码提取反编译,听起来很屌,其实还是简单的,基本是傻瓜式操作.要想拿到微信小程序源码,找到源文件在手机存放的位置就行,源文件拿到,用反编译脚本跑一下,微信小程序代码包里的所有文件. ...

  8. 反编译获取任何微信小程序源码——看这篇就够了(最新)

    一 准备工具 1 node.js 运行环境 下载地址:https://nodejs.org/en/ 2 反编译的脚本 链接:https://pan.baidu.com/s/1InxRoozDDb-C- ...

  9. 微信小程序源代码丢失怎么办?通过反编译工具获取微信小程序源码

    1. 安装nodejs环境 https://nodejs.org/zh-cn/ 2. 下载编译脚本 链接: https://pan.baidu.com/s/1xskmRTV4Ou80c8ZTCNowi ...

最新文章

  1. Access中复制表
  2. hadoop重命名文件_面试系列:深入理解hadoop架构体系
  3. dns组件能够删除后恢复
  4. [C++11]委托构造函数
  5. hibernate正向生成数据库表以及配置——Student.hbm.xml
  6. 前端学习(489):文本格式化
  7. [bzoj 3110][zjoi 2013]K大数查询
  8. 样条曲线_概念设计:如何控制相关样条曲线几何图形?
  9. vue中 jsbarcode的使用技巧
  10. 圆柱体积计算机公式,圆柱的体积怎么算公式
  11. python3安装失败_python3安装失败如何处理
  12. 找不到服务器或应用项目,版本找不到服务器应用程序、源文件或项目的解决办法...
  13. Android大话设计模式 第一章----针对接口编程---问世间情为何物 直教人生死相许
  14. vue-composition-api.mjs:1:7: ERROR: No matching export in “node_modules/vue/dist/vue.runtime.esm-bun
  15. Atmel和SIGFOX在远程物联网连接领域开展合作
  16. 物联网平台搭建的全过程介绍(五)——基于阿里云物联网平台的Android聊天app源码
  17. 怪物之心无法触发_《异度神剑2》力男支线任务怪物之心流程介绍
  18. Java后端学习路线图
  19. 【小白笔记】常见网页访问状态码及网页请求
  20. python电路仿真_蔡氏电路仿真实验

热门文章

  1. java随手笔记 接口的理解
  2. web基础设施知识;web前端安全***,客户端安全基础
  3. 陪外公看花鼓戏,回忆经典
  4. 伺服电机脉冲控制方式
  5. Linux学习|什么是GPL(General Public License,GNU通用公共许可协议?
  6. Unity中实现溶解(Dissolve)特效及其原理解析
  7. Java面试灵魂拷问
  8. 统计学笔记1:截尾分布的矩估计与极大似然估计
  9. 7000字长文|拆解淘金币运营策略,学习阿里怎么运营平台型积分体系运营
  10. 华为认证考试需要准备什么