上篇文章使用了inline方式往页眉中插入图片,因为这种方式插入的图片不好按照坐标定位方式调整图片的摆放位置,所以只能参考NPOI 源码中inline的方式修改添加CT_Anchor 锚点的方式
首先下载含有页眉添加图片的NPOI dll文件:https://download.youkuaiyun.com/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_Drawing
CT_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);//直接取ID
properties2.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.youkuaiyun.com/download/dengxt/10823924
本文介绍如何使用NPOI库自定义在Word文档页眉中插入图片的位置,通过修改源码添加CT_Anchor锚点实现精确坐标定位,提供了一种新的AddPicture方法实现方案。
6838

被折叠的 条评论
为什么被折叠?



