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);
}
}
}
}
}
}
}