NPOI生成word浮动图标

1、NPOI版本2.7.0, net框架4.8

2、安装OpenXMLSDKToolV25.msi

3、先创建一个word文档,并设置图片为浮于文字之上

4、OpenXML显示的结果

5、实际代码如下:

public class GenerateWordDemo
{
	public GenerateWordDemo()
	{
	}

	//https://blog.fileformat.com/zh/word-processing/npoi-api-for-processing-word-documents-in-net-an-overview/
	//https://blog.csdn.net/sD7O95O/article/details/114108985
	//https://blog.csdn.net/qq_38544249/article/details/124923848

	private void SetPage(XWPFDocument doc)
	{
		// 设置页面的大小
		CT_SectPr m_SectPr = new CT_SectPr();       //实例一个尺寸类的实例
		m_SectPr.pgSz.w = 11906;        //设置宽度(这里是一个ulong类型)
		m_SectPr.pgSz.h = 16838;        //设置高度(这里是一个ulong类型)                    
										//页面边距
		m_SectPr.pgMar.left = (ulong)80;//左边距
		m_SectPr.pgMar.right = (ulong)80;//右边距
		m_SectPr.pgMar.top = 80;//上边距
		m_SectPr.pgMar.bottom = 80;//下边距

		doc.Document.body.sectPr = m_SectPr;          //设置页面的尺寸
	}

	/// <summary>
	/// 加入内联二维码
	/// </summary>
	/// <param name="doc"></param>
	/// <param name="paragraphy"></param>
	private void AddInlineBarCode(XWPFDocument doc, XWPFParagraph paragraphy)
	{
		string appPath = System.AppDomain.CurrentDomain.BaseDirectory;
		string imagePath = System.IO.Path.Combine(appPath, "Images");
		string imageFile = System.IO.Path.Combine(imagePath, "BarCode.jpg");

		// 二维码            
		XWPFRun run = paragraphy.CreateRun();
		using (FileStream picFile = new FileStream(imageFile, FileMode.Open, FileAccess.Read))
		{
			XWPFPicture pic = run.AddPicture(picFile, (int)PictureType.PNG, "barcode.png", 100 * 10857, 100 * 12857);
		}
	}

	private T LoadWordCT<T>(string xml, Func<XmlElement, T> act) where T : class
	{
		XmlDocument xmlDoc = new XmlDocument();
		try
		{
			xmlDoc.LoadXml(xml);
			var element = xmlDoc.DocumentElement;
			return act(element);                
		}
		catch (XmlException xe)
		{
			return null;
		}
	}

	/// <summary>
	/// 加入二维码
	/// </summary>
	/// <param name="doc"></param>
	private void AddBarCode(XWPFDocument doc, XWPFParagraph paragraphy)
	{
		String relationId;
		XWPFPictureData picData;
		string appPath = System.AppDomain.CurrentDomain.BaseDirectory;
		string imagePath = System.IO.Path.Combine(appPath, "Images");
		string imageFile = System.IO.Path.Combine(imagePath, "BarCode.jpg");

		using (FileStream picFile = new FileStream(imageFile, FileMode.Open, FileAccess.Read))
		{
			relationId = doc.AddPictureData(picFile, (int)PictureType.PNG);
			picData = (XWPFPictureData)doc.GetRelationById(relationId);
		}
   
		XWPFRun run = paragraphy.CreateRun();
		CT_RPr rpr = new CT_RPr();
		rpr.AddNewNoProof();
		run.GetCTR().rPr = rpr;
		CT_Drawing drawing = run.GetCTR().AddNewDrawing();

		drawing.anchor = new List<CT_Anchor>();
		CT_Anchor an = new CT_Anchor();            
		//图片距正文上(distT)、下(distB)、左(distL)、右(distR)的距离。114300EMUS=3.1mm
		an.distT = 0;
		an.distB = 0;
		an.distL = (uint)114300;
		an.distR = (uint)114300;
		an.relativeHeight = 251658240u;
		an.behindDoc = false; //"0",图与文字的上下关系
		an.locked = false;  //"0"
		an.layoutInCell = true;  //"1"
		an.allowOverlap = true;  //"1" 
		an.simplePos1 = false;
		an.simplePos1Specified = false;

		//CT_Point2D simplePos = new CT_Point2D();
		//simplePos.x = (long)0;
		//simplePos.y = (long)0;
		//an.simplePos = simplePos;

		// https://www.cnblogs.com/zhangliming/archive/2013/04/02/2995655.html
		string xml = "<wp:simplePos x=\"0\" y=\"0\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" />";
		an.simplePos = LoadWordCT<CT_Point2D>(xml, x => CT_Point2D.Parse(x, null));

		//图左上角坐标
		CT_PosH posH = new CT_PosH();
		posH.relativeFrom = ST_RelFromH.column;
		posH.posOffset = -1292;   //单位:EMUS,1CM=360000EMUS
		an.positionH = posH;

		CT_PosV posV = new CT_PosV();
		posV.relativeFrom = ST_RelFromV.paragraph;
		posV.posOffset = 51661;
		an.positionV = posV;

		an.extent = new NPOI.OpenXmlFormats.Dml.WordProcessing.CT_PositiveSize2D();
		an.extent.cx = 1085700;
		an.extent.cy = 1285700;

		CT_EffectExtent effectExtent = new CT_EffectExtent();
		effectExtent.b = 0L;
		effectExtent.l = 0L;
		effectExtent.r = 0L;
		effectExtent.t = 0L;
		an.effectExtent = effectExtent;
		an.wrapNone = new CT_WrapNone();

		an.docPr = new NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualDrawingProps();
		long id = run.Document.GetNextPicNameNumber((int)PictureType.PNG);
		an.docPr.id = (uint)(id);
		an.docPr.name = ("Drawing " + id);
		an.docPr.descr = "barcode.png";
		an.cNvGraphicFramePr = new NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualGraphicFrameProperties();

		an.graphic = new CT_GraphicalObject();
		CT_GraphicalObjectData gd = new CT_GraphicalObjectData();
		gd.uri = "http://schemas.openxmlformats.org/drawingml/2006/picture";
		an.graphic.graphicData = gd;

		// Grab the picture object
		NPOI.OpenXmlFormats.Dml.Picture.CT_Picture pic = new NPOI.OpenXmlFormats.Dml.Picture.CT_Picture();

		// Set it up
		NPOI.OpenXmlFormats.Dml.Picture.CT_PictureNonVisual nvPicPr = pic.AddNewNvPicPr();

		NPOI.OpenXmlFormats.Dml.CT_NonVisualDrawingProps cNvPr = nvPicPr.AddNewCNvPr();
		/* use "0" for the id. See ECM-576, 20.2.2.3 */
		cNvPr.id = (0);
		/* This name is not visible in Word 2010 anywhere */
		cNvPr.name = ("Picture " + id);
		cNvPr.descr = "barcode.png";

		CT_NonVisualPictureProperties cNvPicPr = nvPicPr.AddNewCNvPicPr();
		cNvPicPr.AddNewPicLocks().noChangeAspect = true;

		CT_BlipFillProperties blipFill = pic.AddNewBlipFill();
		CT_Blip blip = blipFill.AddNewBlip();
		blip.embed = run.Paragraph.Part.GetRelationId(picData);
		blipFill.AddNewStretch().AddNewFillRect();

		CT_ShapeProperties spPr = pic.AddNewSpPr();
		CT_Transform2D xfrm = spPr.AddNewXfrm();

		CT_Point2D off = xfrm.AddNewOff();
		off.x = (0);
		off.y = (0);

		NPOI.OpenXmlFormats.Dml.CT_PositiveSize2D ext = xfrm.AddNewExt();
		ext.cx = 100;
		ext.cy = 100;

		CT_PresetGeometry2D prstGeom = spPr.AddNewPrstGeom();
		prstGeom.prst = (ST_ShapeType.rect);
		prstGeom.AddNewAvLst();

		using (var ms = RecyclableMemory.GetStream())
		{
			StreamWriter sw = new StreamWriter(ms);
			pic.Write(sw, "pic:pic");
			sw.Flush();
			ms.Position = 0;
			var sr = new StreamReader(ms);
			var picXml = sr.ReadToEnd();
			gd.AddPicElement(picXml);
		}

		drawing.anchor.Add(an);
	}

	private XWPFParagraph AddParagraph(XWPFDocument doc)
	{
		XWPFParagraph paragraphy = doc.CreateParagraph();
		CT_PPr ppr = new CT_PPr();
		CT_Spacing sp = ppr.AddNewSpacing();
		// w:spacing w:after="20" w:line="430" w:lineRule="auto" 
		sp.after = 20;
		sp.line = "430";
		sp.lineRule = ST_LineSpacingRule.auto;

		CT_Ind ind = ppr.AddNewInd();
		ind.right = "10";

		CT_Jc jc = ppr.AddNewJc();
		// 左对齐
		jc.val = ST_Jc.left;

		CT_ParaRPr rpr = ppr.AddNewRPr();
		rpr.rFonts = new CT_Fonts();
		rpr.rFonts.ascii = "宋体";
		rpr.rFonts.hAnsi = "宋体";
		rpr.rFonts.eastAsia = "宋体";
		rpr.rFonts.cs = "宋体";
		rpr.b = new CT_OnOff();
		rpr.b.val = true;
		rpr.sz = new CT_HpsMeasure();
		rpr.sz.val = 32;
		paragraphy.GetCTP().pPr = ppr;

		return paragraphy;
	}

	private XWPFParagraph AddTextParagraph(XWPFDocument doc)
	{
		XWPFParagraph paragraphy = doc.CreateParagraph();
		CT_PPr ppr = new CT_PPr();
		CT_Spacing sp = ppr.AddNewSpacing();
		sp.lineRule = ST_LineSpacingRule.auto;
		CT_Ind ind = ppr.AddNewInd();
		CT_Jc jc = ppr.AddNewJc();
		jc.val = ST_Jc.right;

		CT_ParaRPr rpr = ppr.AddNewRPr();
		rpr.rFonts = new CT_Fonts();
		rpr.rFonts.ascii = "宋体";
		rpr.rFonts.hAnsi = "宋体";
		rpr.rFonts.eastAsia = "宋体";
		rpr.rFonts.cs = "宋体";
		rpr.b = new CT_OnOff();
		rpr.b.val = true;
		rpr.sz = new CT_HpsMeasure();
		rpr.sz.val = 32;
		paragraphy.GetCTP().pPr = ppr;

		return paragraphy;
	}

	private XWPFRun AddTextRun(XWPFParagraph paragraphy, string text, ulong fontSize)
	{
		XWPFRun run = paragraphy.CreateRun();
		run.IsBold = true;
		CT_RPr rpr = new CT_RPr();
		CT_Fonts ft = rpr.AddNewRFonts();
		ft.ascii = "宋体";
		ft.hAnsi = "宋体";
		ft.eastAsia = "宋体";
		ft.cs = "宋体";
		rpr.AddNewB();
		CT_HpsMeasure sz = rpr.AddNewSz();
		sz.val = fontSize;
		run.GetCTR().rPr = rpr;
		run.SetText(text);

		return run;
	}

	public bool CreateWordReport(string wordFile)
	{
		try
		{
			string appPath = System.AppDomain.CurrentDomain.BaseDirectory;              
			string checkTime = DateTime.Now.ToString("yyyy年MM月dd日");//检查时间

			//TODO:使用FileStream文件流来写入数据(传入参数为:文件所在路径,对文件的操作方式,对文件内数据的操作)
			//通过使用文件流,创建文件流对象,向文件流中写入内容,并保存为Word文档格式
			using (var stream = new FileStream(wordFile, FileMode.Create, FileAccess.Write))
			{
				//创建document文档对象对象实例
				XWPFDocument doc = new XWPFDocument();

				XWPFParagraph paragraphy = AddParagraph(doc);
				AddBarCode(doc, paragraphy);

				paragraphy = AddTextParagraph(doc);
				AddTextRun(paragraphy, "TEST1", 32);

				paragraphy = AddTextParagraph(doc);
				AddTextRun(paragraphy, "TEST2", 32);

				paragraphy = AddTextParagraph(doc);
				AddTextRun(paragraphy, "TEST3", 32);

				//向文档流中写入内容,生成word
				doc.Write(stream);

				return true;
			}
		}
		catch (Exception ex)
		{
			return false;
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/614092.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】卷积神经(CNN)在图像识别中的革命性应用:自动驾驶的崛起

卷积神经网络&#xff08;CNN&#xff09;在图像识别中的革命性应用&#xff1a;自动驾驶的崛起 一、卷积神经网络&#xff08;CNN&#xff09;的基本原理二、CNN在图像识别中的显著成果三、CNN在自动驾驶汽车中的物体检测和识别四、CNN在图像识别中的代码实例 随着人工智能和深…

Vue3人员选择组件封装

一、组件介绍 人员组件在各系统的应用都是比较广泛的&#xff0c;因此可以将其封装为可配置的人员组件&#xff0c;根据不同角色权限显示对应的人员供选择&#xff0c;代码目前只是一部分&#xff0c;需要源码的私聊。 二、直接上代码 use.vue 父组件 <div class&q…

干部管理系统亮点深度解析

在信息化浪潮的推动下&#xff0c;干部管理系统已成为组织高效运作的得力助手。该系统凭借一系列创新亮点&#xff0c;为干部的选拔、培养、评估和使用提供了强有力的支撑。 一、智能化与数据化&#xff1a;精准决策的基石 干部管理系统凭借大数据和人工智能技术的融合&#…

提高静态住宅代理稳定性妙招

在数字化时代的浪潮中&#xff0c;静态住宅代理因其独特的优势&#xff0c;如固定的IP地址、更高的隐私保护性等&#xff0c;逐渐成为网络爬虫、数据分析等领域不可或缺的工具。然而&#xff0c;静态住宅代理的稳定性问题一直是用户关注的焦点。本文将为您揭示提高静态住宅代理…

Linux技术---部署PXE服务器实现批量安装操作系统

部署PXE服务器实现批量安装操作系统 部署PXE服务器实现批量安装操作系统 部署PXE服务器实现批量安装操作系统1.安装相关服务组件1.1 安装tftp和xinetd1.2 安装DHCP服务1.3 准备 Linux 内核、初始化镜像文件、 PXE 引导程序、安装FTP服务并准备安装源1.4 配置启动菜单文件1.5 验…

Amazon SES邮箱API发送邮件怎么配置参数?

Amazon SES邮箱API发送邮件的步骤&#xff1f;怎么使用API发信&#xff1f; 对于希望利用Amazon SES来发送邮件的企业或个人来说&#xff0c;正确地配置参数是确保邮件能够成功发送的关键。接下来&#xff0c;AokSend就来详细探讨一下Amazon SES邮箱API发送邮件的配置参数步骤…

【系统规划与管理师】2024年5月考前最后冲刺指南

一、备考关键&#xff1a; 高效率的备考方式&#xff1a;多轮迭代学习 △ 基础阶段 △ 大面积撒网(60%) 略读&#xff0d;> 做题 &#xff0d;> 回顾 &#xff0d;> 精读 △ 积累阶段 △ 有针对性的突破(30%) 完成所有章节之后&#xff0c;进行真题测试&#x…

AI+招聘:ATS招聘系统让HR简历筛选精准度达95%!

一提起招聘过程&#xff0c;许多HR就会想到那堆叠如山的简历、让人眼花缭乱的招聘网站以及琐碎繁复的手动数据录入。据统计&#xff0c;平均每位HR每年要处理数百甚至上千份简历&#xff0c;耗费大量精力在初级筛选和跟进上。   市场调查机构近日发布的一份报告显示&#xff…

开放式服务管理系统

开放式服务管理系统&#xff08;ITILDESK&#xff09;是一个灵活且适应性强的解决方案&#xff0c;它旨在覆盖各类流程服务场景&#xff0c;以满足不同组织和行业的多样化需求。这种系统通常提供了一套完整的工具和功能&#xff0c;用于管理、监控和优化各种服务流程&#xff0…

什么是Unreal Engine游戏引擎?它有什么优势?

大家好&#xff0c;我是咕噜土豆&#xff0c;很高兴又和大家见面了。在游戏开发行业中&#xff0c;选择合适的游戏引擎是非常重要的。其中&#xff0c;Unreal Engine作为一款功能强大的游戏引擎&#xff0c;在业界非常受欢迎。今天我带大家简单的了解一下。 什么是Unreal Engi…

深兰科技荣获中国机器人行业年度独角兽企业奖

近日&#xff0c;“维科杯OFweek 2023人工智能产业大会暨行业年度评选颁奖典礼“在深圳隆重举行。经OFweek网络投票、专家组评审及组委会综合评审三轮激烈紧张的评审筛选&#xff0c;通过对近300个参评项目的综合实力考量&#xff0c;最终深兰科技成功荣膺“维科杯OFweek2023中…

洁净环境微生物监测的解决方案

药品污染控制 Manufacturing 无菌药品生产污染控制意义 01 CCS策略 无菌药品生产污染控制策略&#xff08;CCS) &#xff1a;来自于现行产品和工艺理解&#xff0c;为确保工艺性能和产品质量&#xff0c;所计划的一套体系&#xff0c;针对微生物、热原/内毒素和微粒的控制方…

Npm Install Docusaurus Demo【npm 安装 docusaurus 实践 】

文章目录 1. 简介2. 前提2.1 安装 git2.2 安装 node 3. 安装4. 项目结构5. 访问5.1 localhost 访问5.2 ip 访问 1. 简介 Docusaurus 是一个facebook的开源项目&#xff0c;旨在帮助开发者构建易于维护和部署的文档网站。它提供了一个简单的方法来创建专业的文档网站&#xff0…

网页转长图插件html2canvas【前端】

网页转长图插件html2canvas【前端】 前言版权推荐网页转长图插件html2canvas【前端】wkImageStorage流程使用后端application.propertiesWkConfigShareControllerImageCleanupTask 前端html2canvas.jsshare.htmlshare.jsgetShare.jsgetShare.html 最后 前言 2024-5-10 18:00:1…

算法金 | Xorbits,一个超强的 Python 库

本文来源公众号“算法金”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Xorbits&#xff0c;一个超强的 Python 库 1 Xorbits 库介绍 在数据科学和机器学习的世界里&#xff0c;处理大规模数据集和复杂计算的需求日益增长。 这…

YOLOv9最新改进系列:融合空间信息关注机制(SimAM)于YOLOv9网络,在通道之间和空间位置之间建立更加准确的关联,助力YOLOv9有效涨点!!!

YOLOv9最新改进系列&#xff1a;融合空间信息关注机制&#xff08;SimAM&#xff09;于YOLOv9网络&#xff0c;在通道之间和空间位置之间建立更加准确的关联,助力YOLOv9有效涨点&#xff01;&#xff01;&#xff01; 在此之前&#xff01;先恭喜两位家人&#xff01;&#xf…

uniapp下拉选择组件

uniapp下拉选择组件 背景实现思路代码实现配置项使用尾巴 背景 最近遇到一个这样的需求&#xff0c;在输入框中输入关键字&#xff0c;通过接口查询到结果之后&#xff0c;以下拉框列表形式展现供用户选择。查询了下uni-app官网和项目中使用的uv-ui库&#xff0c;没找到符合条…

sentinel搭建及使用

1.添加依赖&#xff08;版本可依赖于父pom&#xff09; SentinalResource注解&#xff1a; 添加依赖&#xff1a; blockhandler: fallback:

以Azure为例的SSO

由于文章的篇幅有限&#xff0c;无法将全部的代码贴上来&#xff0c;如想要看完整案例&#xff0c;请在公众号文章中留言(其他平台很少看…毕竟最近印度同事的UI组件库搞得我好烦) 1.关于SSO 单点登录又称之为SSO,全称为 Single Sign On &#xff0c;一般在多个应用系统中&…

文献速递:多模态深度学习在医疗中的应用--多模态深度学习用于阿尔茨海默病痴呆评估

Title 题目 Multimodal deep learning for Alzheimer’s disease dementia assessment 多模态深度学习用于阿尔茨海默病痴呆评估 01 文献速递介绍 全球每年新发痴呆症病例近1000万例&#xff0c;其中阿尔茨海默病&#xff08;AD&#xff09;最为常见。需要新的措施来改善因…