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

本文介绍如何使用NPOI库自定义在Word文档页眉中插入图片的位置,通过修改源码添加CT_Anchor锚点实现精确坐标定位,提供了一种新的AddPicture方法实现方案。

上篇文章使用了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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值