使用js做水印效果,jquery<转载>

本文详细介绍了如何使用JavaScript函数waterMark()为网页元素添加可定制的水印,包括设置水印内容、位置、大小、颜色等,并提供了示例代码。重点在于配置参数的灵活运用和布局计算方法。
/*
 * @description添加水印
 * @param {Obj} settings水印配置参数
 */
  function waterMark(markElement) {
	$('#' + markElement.waterMarkId).find('.markElement').remove();
	var settings = {
		waterMarkId:"t1",
		waterMarkContent:"我是水印内容",
		waterMarkX:-10,
		waterMarkY:40,
		waterMarkRows:10,
		waterMarkCols:20,
		waterMarkXSpace:0,
		waterMarkYSpace:0,
		waterMarkColor:'#B0C4DE',
		waterMarkAlpha:0.3,
		waterMarkFontSize:'25px',
		waterMarkFont:'微软雅黑',
		waterMarkWidth:100,
		waterMarkHeight:100,
		waterMarkAngle:15
	};
	if(arguments.length === 1 && typeof arguments[0] === "object" ) {
		var src = arguments[0]||{};
		for(key in src) {
			if(src[key]&&settings[key] && src[key] === settings[key])
				continue;
			else if(src[key])
				settings[key] = src[key];
		}
	}
	var obj = document.getElementById(settings.waterMarkId);
	var tmpObj = document.createDocumentFragment();
	var pageWidth = obj.offsetWidth; 
	var pageHeight = obj.offsetHeight ;
	if (settings.waterMarkCols == 0 || (parseInt(settings.waterMarkX + settings.waterMarkWidth *settings.waterMarkCols + settings.waterMarkXSpace * (settings.waterMarkCols - 1)) > pageWidth)) {
		settings.waterMarkCols = parseInt((pageWidth-settings.waterMarkX+settings.waterMarkXSpace) / (settings.waterMarkWidth + settings.waterMarkXSpace));
		settings.waterMarkXSpace = parseInt((pageWidth - settings.waterMarkX - settings.waterMarkWidth * settings.waterMarkCols) / (settings.waterMarkCols - 1));
	}
	if (settings.waterMarkRows == 0 || (parseInt(settings.waterMarkY + settings.waterMarkHeight * settings.waterMarkRows + settings.waterMarkYSpace * (settings.waterMarkRows - 1)) > pageHeight)) {
		settings.waterMarkRows = parseInt((settings.waterMarkYSpace + pageHeight - settings.waterMarkY) / (settings.waterMarkHeight + settings.waterMarkYSpace));
		settings.waterMarkYSpace = parseInt(((pageHeight - settings.waterMarkY) - settings.waterMarkHeight * settings.waterMarkRows) / (settings.waterMarkRows - 1));
	}
	var x;
	var y;
	settings.waterMarkRows = settings.waterMarkRows == 0 ? 6 : settings.waterMarkRows; 
	for (var i = 0; i < settings.waterMarkRows; i++) {
		y = settings.waterMarkY + (settings.waterMarkYSpace + settings.waterMarkHeight) * i;
		y = isNaN(y) ? 40 : y;
		for (var j = 0; j < settings.waterMarkCols; j++) {
			x = settings.waterMarkX + (settings.waterMarkWidth + settings.waterMarkXSpace) * j;
			var markElement = document.createElement('div');
			markElement.id = 'markElement' + i + j;
			markElement.appendChild(document.createTextNode(settings.waterMarkContent));
			//设置水印div倾斜显示
			markElement.style.webkitTransform = "rotate(-" + settings.waterMarkAngle + "deg)";
			markElement.style.MozTransform = "rotate(-" + settings.waterMarkAngle + "deg)";
			markElement.style.msTransform = "rotate(-" + settings.waterMarkAngle + "deg)";
			markElement.style.OTransform = "rotate(-" + settings.waterMarkAngle + "deg)";
			markElement.style.transform = "rotate(-" + settings.waterMarkAngle + "deg)";
			markElement.style.visibility = "";
			markElement.style.position = "absolute";
			markElement.style.left = x + 'px';
			markElement.style.top = y + 'px';
			markElement.style.overflow = "hidden";
			markElement.style.zIndex = "10";
			markElement.style.opacity = settings.waterMarkAlpha;
			markElement.style.fontSize = settings.waterMarkFontSize;
			markElement.style.fontFamily = settings.waterMarkFont;
			markElement.style.color = settings.waterMarkColor;
			markElement.style.textAlign = "center";
			markElement.style.width = settings.waterMarkWidth + 'px';
			markElement.style.height = settings.waterMarkHeight + 'px';
			markElement.style.display = "block";
			markElement.style.filter = "alpha(opacity="+ settings.waterMarkAlpha*100 +")";
			markElement.setAttribute("class","markElement");
			tmpObj.appendChild(markElement);
		};
	};
	obj.appendChild(tmpObj);
}

使用:

    waterMark({
        waterMarkContent:'我是水印内容',
        waterMarkId:'userTable'//需要做水印的元素的id
    });

<think>好的,我现在需要解决用户的问题:在使用Apache POI的poi-ooxml 4.1.0版本时,如何设置Word文档的水印显示在最上层。首先,我需要回忆一下Apache POI处理水印的相关知识,尤其是旧版本中的实现方式。用户提到的是4.1.0版本,这可能与最新版本的方法有所不同,需要注意版本差异。 根据之前的引用资料,用户可能已经尝试过添加水印的基本方法,但发现水印的位置可能被其他内容覆盖,无法显示在最上层。这时候需要调整水印的层次结构,确保它位于所有其他元素之上。 首先,我应该检查Apache POI在4.1.0版本中处理水印的方式。通常,Word文档中的水印是通过页眉或页脚部分添加的,使用XWPFPicture对象插入图片,并设置其位置和大小。但默认情况下,这些水印可能位于页面的底层,被正文内容覆盖。 接下来,我需要确定如何调整水印的Z-Order,即元素的堆叠顺序。在Word文档中,元素的Z-Index决定了它们的显示层次。较高的Z-Index值会使元素显示在更上层。因此,关键步骤是设置水印图片的Z-Order属性,使其处于最前面。 查阅Apache POI的文档,XWPFPicture可能有一个getCTPicture()方法,返回CTPicture对象,通过这个对象可以访问到图片的属性,包括层次结构。可能需要设置CTPicture的id属性或通过XML底层操作来调整层次。例如,在CTPicture中,可能有一个属性用来指定相对于其他元素的放置顺序。或者,可能需要调整水印图片所在段落的层次。 另外,考虑到水印通常是作为背景元素存在的,可能需要将其放置在页眉中,并且确保页眉的内容不会被正文覆盖。在Word中,页眉和页脚默认位于页面层,但可能需要在XML结构中调整其层次。 可能需要通过底层OOXML操作来设置水印的层次。例如,在文档的XML结构中,添加相应的属性,如relativeFrom="page",以及设置位置和Z-Order。例如,设置水印图片的<wp:position>和<wp:wrap>属性,确保其覆盖在页面的最上层。 此外,可能还需要调整水印图片的透明度,使其不影响正文内容的显示,但这属于样式调整,用户的主要需求是层次问题。 需要验证这些步骤在poi-ooxml 4.1.0版本中是否可行。可能需要查看该版本中XWPFPicture和相关类的可用方法,或者是否有已知的限制。例如,某些高版本的API可能在旧版本中不可用,需要找到替代方法。 可能的解决方案步骤包括: 1. 创建页眉并插入图片作为水印。 2. 调整图片的位置属性,使其覆盖整个页面。 3. 设置图片的Z-Order为最大值,确保显示在最上层。 4. 确保页眉部分的层次不会被正文覆盖。 在代码实现上,可能需要通过CTDrawing和CTPicture的配置来设置这些属性。例如,使用CTPositiveSize2D设置图片大小,CTPoint2D设置位置,并通过CTWrapNone设置环绕方式为无,这样水印不会被其他内容影响。 另外,可能需要手动调整XML中的元素顺序或属性,因为Apache POI的高级API可能没有直接设置Z-Order的方法,这时候需要深入到底层XML结构进行操作,使用org.openxmlformats.schemas.drawingml.x2006.main等包中的类来配置。 最后,测试代码以确保水印确实显示在页面的最上层,并且不会被其他内容遮挡。如果有问题,可能需要进一步调整位置或Z-Order的设置。</think>在使用 Apache POI 4.1.0 为 Word 文档设置顶层水印时,需通过以下步骤调整水印层次结构: ### 解决方案步骤 1. **创建水印图片对象** 使用`XWPFParagraph.createRun().addPicture()`插入水印图片,并获取其`CTPicture`对象: ```java XWPFHeader header = document.createHeader(HeaderFooterType.DEFAULT); XWPFParagraph paragraph = header.createParagraph(); XWPFRun run = paragraph.createRun(); String imagePath = "watermark.png"; InputStream is = new FileInputStream(imagePath); // 插入图片并获取CTPicture对象 CTInline ctInline = run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, imagePath, Units.toEMU(500), Units.toEMU(300)).getCTInline(); CTPicture ctPicture = ctInline.getDocPr().getParent().getParent().getParent(); ``` 2. **调整层级关系** 通过设置`Z-Order`属性强制水印置顶: ```java // 获取图片的XML结构 CTNonVisualDrawingProps docPr = ctPicture.getNvPicPr().getCNvPr(); docPr.setId(1); // 设置唯一ID docPr.setName("Watermark"); // 设置Z-Order为最大值 CTPositiveInteger2D zIndex = docPr.addNewZIndex(); zIndex.setVal(999999999); // 最大层级 ``` 3. **设置绝对定位** 修改图片布局使其覆盖整个页面: ```java CTTransform2D transform = ctPicture.getSpPr().getXfrm(); // 设置图片位置(左上角原点) CTPoint2D pos = transform.isSetOff() ? transform.getOff() : transform.addNewOff(); pos.setX(0); pos.setY(0); // 设置图片大小为页面尺寸 CTPositiveSize2D ext = transform.isSetExt() ? transform.getExt() : transform.addNewExt(); ext.setCx(Units.toEMU(595)); // A4纸宽度(21cm) ext.setCy(Units.toEMU(842)); // A4纸高度(29.7cm) ``` 4. **禁用文字环绕** 通过`CTWrapNone`取消布局干扰: ```java CTWrapNone wrapNone = CTWrapNone.Factory.newInstance(); ctPicture.getParent().setWrapNone(wrapNone); ``` ### 关键配置说明 - **Z-Order 设置**:通过`setZIndex`数值越大层级越高,需超过文档中其他元素的值 - **绝对定位**:将水印坐标原点`(0,0)`与页面左上角对齐,尺寸覆盖整个版面 - **禁用环绕**:避免正文文字排版影响水印显示 ### 效果验证 生成文档后检查以下特征: 1. 水印在页眉区域可见`alt+F9`切换域代码显示 2. 使用 Word 的「选择窗格」查看对象层级 3. 打印预览确认水印覆盖正文内容 [^1]: 引用自水印基础实现中的层次控制需求 [^2]: POI 官方文档中关于图片层级的 XML 操作说明
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值