NPOI word 指定位置插入图片

如果区域内没有其他内容,直接获取到该段落,插入图片即可,这里指定位置插入图片的需求比较另类,在这里抛砖引玉,这里属于个人的一点思路供大家参考,后续会继续完善。

要求:这是一个报告模板,检测人,复核人,需要用签名图片。

最终效果图:

 

 

难点:非单独区域,左右都有受害人,插入图片时,不能影响其他内容。

解决思路:将检测者与复核者分割为两个区域,互相不影响,由于在一个段落,切记不可有替换文本之类的操作,如果要替换文本,先替换后插入图片,因为替换操作会丢失图片,要保证插入图片是对该段落操作的最后一步。

如何分割两个区域呢?首先一口气打完字:     检测者:$检测者$    复核者:$复核者$

这时候都在一个区域内,必须从中间分开,在word随便复制一个空格,复制到复核者前面即可,这样就分割出2个区域,调试结果如下图:

 

 

其他内容的话可以单独区域,不要和图片在一个区域,防止成为受害者。

关键代码如下

//签名
Dictionary<string, string> dcImg = new Dictionary<string, string>();
dcImg.Add("$检测者$", @"C:\default.jpg");
dcImg.Add("$复核者$", @"C:\default.jpg");


/// <summary>
/// 遍历段落,替换图片
/// </summary>
/// <param name="doc">文档对象</param>
/// <param name="dcImg">关键字集合</param>
private void ReplaceImg(XWPFDocument doc, Dictionary<string, string> dcImg)
{
    foreach (XWPFParagraph para in doc.Paragraphs)
    {
        foreach (string keyItem in dcImg.Keys)
        {
            if (para.ParagraphText.Contains(keyItem))
            {
                foreach(XWPFRun run in para.Runs)
                {
                    if(run.Text.Contains(keyItem))
                    {
                        run.ReplaceText(keyItem,"");
                        int widthEmus = (int)(80.0 * 9525);
                        int heightEmus = (int)(50.0 * 9525);
                        using (FileStream picData = new FileStream(dcImg[keyItem], FileMode.Open, FileAccess.Read))
                        {
                            run.AddPicture(picData, (int)PictureType.PNG, "image1", widthEmus, heightEmus);
                        }
                    }
                }
            }
        }
    }

}

 

posted @ 2022-12-13 11:48  0Behavior  阅读(1723)  评论(0编辑  收藏  举报