`

使用过滤器移除Word文件水印

 
阅读更多

还是移除Word水印的问题,这次需要在应用系统上实现用户请求Word文件时,自动把Word的水印移除。这次的重点不是如何移除Word水印的问题,而是如何实现在response发送给客户端之前对数据流进行修改。实现的方式是实现自己的HttpServletResponseWrapper类并进行相应的修改操作。

直接上代码:

 

/**
 * @CopyRright (c)2011: BrokenStone
 * @Project: WordWatermark
 * @File:    RemoveWordWatermarkFilter.java
 * @JDK version used:  JDK1.6
 * @<br/>
 * @Author: BrokenStone
 * @Blog:   http://sheng.javaeye.com)
 * @Email:  wdmsyf@yahoo.com
 * @since:  2012-1-13
 * @Ver:    1.0
 */
package com.iteye.sheng.utils.office.tools;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

/**
 * @author ShengYoufu
 *
 */
public class RemoveWordWatermarkFilter implements Filter {
	private static final Logger log = Logger.getLogger(RemoveWordWatermarkFilter.class);

	//需要过过滤的请求服务器IP,因为mastudio没有较好的办法让应用系统知道是mastudio发起的请求,所以就先按IP来区分
	//如果有更好的办法,建议改成更好的办法来处理
	private static String[] filterSourceIPs = {"145.24.16.134"};
	
	/* (non-Javadoc)
	 * @see javax.servlet.Filter#destroy()
	 */
	public void destroy() {
		//
	}

	/* (non-Javadoc)
	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
	 */
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		log.debug("Enter into doFilter...");
		if(resp instanceof HttpServletResponse){
			String requestIP = getRealRemoteAddress((HttpServletRequest)req, (HttpServletResponse)resp);
			log.debug("Remote address(IP):" + requestIP);
			if(needProcess(requestIP)){
				log.debug("Begin process...");
				RemoveWordWatermarkResponse response = new RemoveWordWatermarkResponse((HttpServletResponse)resp);
				chain.doFilter(req, response);
				log.debug("End process.");
				return;
			}
		}
		chain.doFilter(req, resp);
	}

	/* (non-Javadoc)
	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
	 */
	public void init(FilterConfig config) throws ServletException {
		String sourceIP = config.getInitParameter("filterSourceIP");
		String[] temp = sourceIP.split(";");
		if(temp!=null && temp.length>0)
			filterSourceIPs = temp;
	}
	
	protected boolean needProcess(String requestIP){
		for(int ii=0; ii<filterSourceIPs.length; ii++){
			if(filterSourceIPs[ii].equals(requestIP)) return true;
		}
		return false;
	}
	
	protected String getRealRemoteAddress(HttpServletRequest req, HttpServletResponse resp){
		if(req == null){
			return null;
		}
		// 如果有apache
		String ip = req.getHeader("X-Forwarded-For");
		
		if (ip == null || ip.length() == 0) {
			// 如果有weblogic配置
			ip = req.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0) {
			ip = req.getRemoteAddr();
		}
		return ip;
	}

}

 

/**
 * @CopyRright (c)2011: BrokenStone
 * @Project: WordWatermark
 * @File: RemoveWordWatermarkResponse.java
 * @JDK version used: JDK1.6 @<br/>
 * @Author: BrokenStone
 * @Blog: http://sheng.javaeye.com)
 * @Email: wdmsyf@yahoo.com
 * @since: 2012-1-13
 * @Ver: 1.0
 */
package com.iteye.sheng.utils.office.tools;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.apache.log4j.Logger;

/**
 * @author ShengYoufu
 * 
 */
public class RemoveWordWatermarkResponse extends HttpServletResponseWrapper {
	private static final Logger log = Logger.getLogger(RemoveWordWatermarkResponse.class);
	
	protected ServletOutputStream stream = null;
	protected PrintWriter writer = null;
	public HttpServletResponse origResponse = null;
	protected static Pattern pattern = Pattern.compile("attachment;filename=(.*)(\\.doc)$");  //判断是否word文件正则表达式
	protected Map headerMap = new HashMap();
	protected int contentLength = 0;

	/**
	 * 
	 * @param response
	 */
	public RemoveWordWatermarkResponse(HttpServletResponse response) {
		super(response);
		origResponse = response;
	}

	public void addHeader(String name, String value){
		super.addHeader(name, value);
		this.headerMap.put(name, value);
	}

	public Map getAllHeaders(){
		return this.headerMap;
	}
	
	public String getHeader(String name){
		return (String)this.headerMap.get(name);
	}
	
	/**
	 * 重载setContentLength是为了能取得原来写入response的数据长度
	 */
	public void setContentLength(int contentLength){
		super.setContentLength(contentLength);
		this.contentLength = contentLength;
	}

	public int getContentLength(){
		return this.contentLength;
	}
	
	/**
	 * 判断是否是Word文档
	 * @return
	 */
	public boolean isWordDocument(){
		Iterator it = this.headerMap.keySet().iterator();
		while(it.hasNext()){
			String name = (String)it.next();
			if("Content-Disposition".equals(name)){
				String val = (String)this.headerMap.get(name);
				Matcher matcher = pattern.matcher(val);
				if(matcher.find()) return true;
			}
		}
		return false;
	}
	
	/**
	 * 创建自定义OutputStream
	 * @return
	 * @throws IOException
	 */
	public ServletOutputStream createOutputStream() throws IOException {
		//只处理Word文件
		if(isWordDocument()){
			log.debug("Create RemoveWordWatermarkFilterServletOutputStream...");
			return (new RemoveWordWatermarkFilterServletOutputStream(this));
		} else
			return origResponse.getOutputStream();
	}

	/**
	 * 返回自定义的OutputStream(自动把Word文件的水印删除)
	 */
	public ServletOutputStream getOutputStream() throws IOException {
		if (writer != null) {
			throw new IllegalStateException("getWriter() has already been " + "called for this response");
		}
		if (stream == null) {
			stream = createOutputStream();
		}
		return stream;
	}

	/**
	 * 返回包装自定义OutputStream的Writer(自动把水印删除)
	 */
	public PrintWriter getWriter() throws IOException {
		if (writer != null) {
			return writer;
		}
		if (stream != null) {
			throw new IllegalStateException("getOutputStream() has already " + "been called for this response");
		}
		stream = createOutputStream();
		writer = new PrintWriter(stream);
		return writer;
	}
	
	
}

 

 

/**
 * @CopyRright (c)2011: BrokenStone
 * @Project: WordWatermark
 * @File: RemoveWordWatermarkFilterServletOutputStream.java
 * @JDK version used: JDK1.6 @<br/>
 * @Author: BrokenStone
 * @Blog: http://sheng.javaeye.com)
 * @Email: wdmsyf@yahoo.com
 * @since: 2012-1-13
 * @Ver: 1.0
 */
package com.iteye.sheng.utils.office.tools;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletOutputStream;

import org.apache.log4j.Logger;

import com.aspose.words.Document;

/**
 * @author ShengYoufu
 * 
 */
public class RemoveWordWatermarkFilterServletOutputStream extends ServletOutputStream {
	private static final Logger log = Logger.getLogger(RemoveWordWatermarkFilterServletOutputStream.class);
	
	private OutputStream _out;
	private RemoveWordWatermarkResponse _response = null;
	private ByteArrayOutputStream _buffer;
	private boolean closed = false;
	private int ContentLength = 0;
	private int _bufferSize = 0;

	public RemoveWordWatermarkFilterServletOutputStream( RemoveWordWatermarkResponse resp ) throws IOException{
		_buffer = new ByteArrayOutputStream();
//		_out = resp.getOutputStream();
		_out = resp.getResponse().getOutputStream();
		_response = resp;
	}
	protected RemoveWordWatermarkFilterServletOutputStream( OutputStream realStream ) throws IOException{
		_buffer = new ByteArrayOutputStream();
		_out = realStream;
	}

	public void close() throws IOException {
		if (closed) {
			throw new IOException("This output stream has already been closed");
		}

		//移除水印
		try{
			removeWatermark();
		}catch(Exception ex){
			throw new IOException("移除Word水印失败: "+ ex.getMessage());
		}

		_out.flush();
		_out.close();
		closed = true;
	}

	public void flush() throws IOException {
		if (closed) {
			throw new IOException("Cannot flush a closed output stream");
		}

		//移除水印
		try{
			removeWatermark();
		}catch(Exception ex){
			throw new IOException("移除Word水印失败: "+ ex.getMessage());
		}
		_out.flush();
	}

	public void write(int b) throws IOException {
		if (closed) {
			throw new IOException("Cannot write to a closed output stream");
		}
		//对于单个字节,不需要执行移除水印操作
//		_buffer.write((byte) b);
		_out.write(b);
	}

	public void write(byte b[]) throws IOException {
		write(b, 0, b.length);
	}

	public void write(byte b[], int off, int len) throws IOException {
		if (closed) {
			throw new IOException("Cannot write to a closed output stream");
		}

//		log.debug("Enter into write...");

		_buffer.write(b, off, len);

		_bufferSize += len;
		
		//当写入的数据小于1024(缓冲区大小)时,则认为写入数据已经结束,可以进行移除水印操作了。
		//当总的数据长度已经达到原Response中设定值,则认为写入数据已经结束,可以进行移除水印操作了。
		if(len<1024 || _bufferSize >= _response.getContentLength()){	
			try {
				removeWatermark();
			} catch (Exception ex) {
				log.error("移除水印失败。",ex);
				throw new IOException("移除水印失败。");
			}
		}
	}

	/**
	 * 移除水印操作
	 * @throws Exception
	 */
	public void removeWatermark() throws Exception {
		log.debug("Enter into removeWatermark...");
		
		//载入Aspose.Words组件的许可证
		WordWatermarkUtil.loadLicense();

		ByteArrayInputStream bais = null;
		byte[] buff = null;
		byte[] buf = new byte[1024];
		int len = 0;

		long beginTime = System.currentTimeMillis();  

		//记下新的ContentLength
		this.setContentLength(_buffer.size());
		if(_response!=null){
			_response.setContentLength(_buffer.size());
		}

		try{
			try{
				_buffer.flush();
				buff = _buffer.toByteArray();
				bais = new ByteArrayInputStream(_buffer.toByteArray());
				_buffer.close();
			}catch(IOException ex){
				throw new Exception("缓冲字节流flush失败。", ex);
			}
			
			try{
				Document doc = new Document(bais);
				bais.close();
				WordWatermarkUtil.removeWatermark(doc);
				_buffer = new ByteArrayOutputStream();
				doc.save(_buffer, null);
				if(_response!=null){
					_response.setContentLength(_buffer.size());
				}
				bais = new ByteArrayInputStream(_buffer.toByteArray());
				while( (len = bais.read(buf))>0){
					_out.write(buf, 0, len);
				}
				log.debug("Remove watermark from doc succeed.");
			}catch(Exception ex){
				log.error("从Word文件中移除水印失败,直接用原文件返回.", ex);

				bais = new ByteArrayInputStream(buff);

				while( (len = bais.read(buf)) > 0){
					_out.write(buf, 0, len);
				}
			}
		}finally{
			try {
				_buffer.close();
			} catch (IOException ex) {
				log.warn("关闭临时缓冲字节流失败.", ex);
			}
			if(bais!=null){
				bais.close();
			}
			bais = null;
			
			long endTime = System.currentTimeMillis();
			log.debug("移除Word文档水印耗时:"+String.valueOf( endTime - beginTime) + " ms");
		}
	}
	
	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args){
		FileInputStream fis = null;
		FileOutputStream fos = null;

		//载入Aspose.Words的许可证
		WordWatermarkUtil.loadLicense();

		try {
			fis = new FileInputStream("C:\\with_watermark.doc");
			fos = new FileOutputStream("C:\\test1.doc");
			RemoveWordWatermarkFilterServletOutputStream os = new RemoveWordWatermarkFilterServletOutputStream(fos);
			byte[] buf = new byte[1024];
			int len = 0;
			while( (len = fis.read(buf))>0){
				os.write(buf, 0, len);
			}
			os.flush();
			os.close();
			fos.flush();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(fis!=null){
				try {
					fis.close();
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}
			fis = null;

			if(fos!=null){
				try {
					fos.flush();
				} catch (IOException ex){
					ex.printStackTrace();
				}
				try {
					fos.close();
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}
			fos = null;
		}
	}

	public int getContentLength() {
		return ContentLength;
	}

	public void setContentLength(int contentLength) {
		ContentLength = contentLength;
	}
}

 

 

/**
 * @CopyRright (c)2011: BrokenStone
 * @Project: WordWatermark
 * @File:    WordWatermarkUtil.java
 * @JDK version used:  JDK1.6
 * @<br/>
 * @Author: BrokenStone
 * @Blog:   http://sheng.javaeye.com)
 * @Email:  wdmsyf@yahoo.com
 * @since:  2012-1-13
 * @Ver:    1.0
 */
package com.iteye.sheng.utils.office.tools;

import java.awt.Color;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

import com.aspose.words.Document;
import com.aspose.words.HeaderFooter;
import com.aspose.words.HeaderFooterType;
import com.aspose.words.HorizontalAlignment;
import com.aspose.words.License;
import com.aspose.words.Paragraph;
import com.aspose.words.RelativeHorizontalPosition;
import com.aspose.words.RelativeVerticalPosition;
import com.aspose.words.Section;
import com.aspose.words.SectionCollection;
import com.aspose.words.Shape;
import com.aspose.words.ShapeType;
import com.aspose.words.VerticalAlignment;
import com.aspose.words.WrapType;

/**
 * @author ShengYoufu
 *
 */
public class WordWatermarkUtil {


	/**
	 * 
	 * Inserts a watermark into a document.
	 * 
	 * @param doc The input document.
	 * @param watermarkText Text of the watermark.
	 * 
	 */
	public static void insertWatermarkText(Document doc, String watermarkText) throws Exception {
		// Create a watermark shape. This will be a WordArt shape.
		// You are free to try other shape types as watermarks.
		Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
		// Set up the text of the watermark.
		watermark.getTextPath().setText(watermarkText);
		watermark.getTextPath().setFontFamily("Arial");
		watermark.setWidth(500);
		watermark.setHeight(100);
		// Text will be directed from the bottom-left to the top-right corner.
		watermark.setRotation(-40);
		// Remove the following two lines if you need a solid black text.
		watermark.getFill().setColor(Color.GRAY); // Try LightGray to get more Word-style watermark
		watermark.setStrokeColor(Color.GRAY); // Try LightGray to get more Word-style watermark
		// Place the watermark in the page center.
		watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
		watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
		watermark.setWrapType(WrapType.NONE);
		watermark.setVerticalAlignment(VerticalAlignment.CENTER);
		watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
		// Create a new paragraph and append the watermark to this paragraph.
		Paragraph watermarkPara = new Paragraph(doc);
		watermarkPara.appendChild(watermark);
		
		// Insert the watermark into all headers of each document section.
		SectionCollection sects = doc.getSections();
		Iterator it = sects.iterator();
		while(it.hasNext()){
			Section sect = (Section)it.next();
			// There could be up to three different headers in each section, since we want
			// the watermark to appear on all pages, insert into all headers.
			insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
			insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
			insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
		}
	}

	/**
	 * 插入水印
	 * @param watermarkPara
	 * @param sect
	 * @param headerType
	 * @throws Exception
	 */
	public static void insertWatermarkIntoHeader(Paragraph watermarkPara, Section sect, int headerType) throws Exception {
		HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);
		if (header == null) {
			// There is no header of the specified type in the current section, create it.
			header = new HeaderFooter(sect.getDocument(), headerType);
			sect.getHeadersFooters().add(header);
		}

		// Insert a clone of the watermark into the header.
		header.appendChild(watermarkPara.deepClone(true));
	}

	/**
	 * 移除全部水印
	 * @param inStream
	 * @throws Exception
	 */
	public static void removeWatermark(InputStream inStream) throws Exception {
		Document doc = new Document(inStream);
		removeWatermark(doc);
	}
	
	/**
	 * 移除全部水印
	 * @param doc
	 * @throws Exception
	 */
	public static void removeWatermark(Document doc) throws Exception {
		SectionCollection sects = doc.getSections();
		Iterator it = sects.iterator();
		while(it.hasNext()){
			Section sect = (Section)it.next();
			// There could be up to three different headers in each section, since we want
			// the watermark to appear on all pages, insert into all headers.
			removeWatermarkFromHeader(sect, HeaderFooterType.HEADER_PRIMARY);
			removeWatermarkFromHeader(sect, HeaderFooterType.HEADER_FIRST);
			removeWatermarkFromHeader(sect, HeaderFooterType.HEADER_EVEN);
		}
	}
	
	/**
	 * 移除指定Section的水印
	 * @param sect
	 * @param headerType
	 * @throws Exception
	 */
	public static void removeWatermarkFromHeader(Section sect, int headerType) throws Exception {
		HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);
		if (header != null) {
			header.removeAllChildren();
		}
	}
	
	/**
	 * 从Classpath(jar文件中)中读取License
	 */
	public static void loadLicense() {
	  //返回读取指定资源的输入流
	  License license = new License();
	  InputStream is = null;
	  try {
	    is = WordWatermarkUtil.class.getResourceAsStream("/resources/aspose.word.license.xml");
	    if(is==null) 
	      throw new RuntimeException("Cannot find licenses file. Please contact wdmsyf@yahoo.com or visit http://sheng.javaeye.com for get more information.");
	    license.setLicense(is);
	  } catch (Exception ex) {
	    ex.printStackTrace();
	  }finally{
	    if(is!=null){
	      try{ is.close(); }catch(IOException ex){ };
	      is = null;
	    }
	  }
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		loadLicense();
		Document doc = new Document("c:/with_watermark.doc");
		removeWatermark(doc);
		doc.save("c:/without_watermark.doc");
	}

}

 

分享到:
评论
1 楼 duohuoteng 2012-03-08  
aspose.words java 用收费哎,有破解办的吗

相关推荐

    使用python移除水印

    使用python移除pdf水印

    aspose实现word转pdf功能(去水印)

    在这段代码中,我们首先加载Word文档,然后遍历每个段落,检查并移除任何被视为水印的段落。最后,我们创建一个PDF保存选项对象,并设置保存格式为PDF,然后将处理后的文档保存为新的PDF文件。 3. **运行程序**:...

    过滤器文档过滤器使用中的方法过滤器.pdf

    本文档将深入探讨过滤器的使用及其功能。 **过滤器概述** 过滤器(Filter)的主要作用是对客户端发起的HTTP请求进行预处理,也可以在响应返回给客户端之前进行后处理。例如,过滤器可以用于以下用途: 1. **敏感...

    可以移除PDF水印的软件

    PDF水印移除软件是一种专门针对PDF文档设计的工具,其主要功能是帮助用户去除PDF文件中的水印、标识或任何不必要的视觉元素,以便于更好地编辑、分享或打印文档。在许多情况下,PDF水印可能由版权声明、公司标志或者...

    C#利用word原生组件给word文档添加和移除密码

    同时,为了避免使用第三方组件(如Spire)的限制,直接使用原生组件可以更好地控制文档处理流程,特别是对于大型文档。 总结一下,通过C#利用Microsoft.Office.Interop.Word库,我们可以方便地为Word文档添加和移除...

    万能Word密码移除器

    软件支持恢复密码(恢复密码以打开Word文件)和一键移除限制(移除密码以修改Word文件),恢复密码支持组合破解、字典破解、掩码破解(根据你知道的密码信息更快的查找密码)和暴力破解。如果你忘了密码一定试试这个软件!

    水印移除软件

    水印通常被添加到各种文件类型中,如照片、PDF文档、视频等,以表明版权归属、公司标识或者防止未经授权的使用。然而,在某些情况下,水印可能会影响内容的观看体验或者需要去除以便于编辑或重新发布。这就催生了...

    java aspose文件转化-去水印(保证可用)

    `Doc2pdf.java`是一个示例代码文件,展示了如何使用Aspose.Words将Word文档转换为PDF。在Java程序中,你需要导入Aspose库,然后加载Word文档,创建一个PdfSaveOptions对象,设置相关选项,最后调用save方法,将Word...

    Excel密码清除工具、PPT文档密码密码移除、PDF文档密码密码移除、Word文档密码密码移除、压缩包密码移除破解.rar

    重要文件加了密码,用个隐私锁,文件进行隐藏加密,不想让这些文件随意被别人看到。但有时候自己也会忘记这些密码,工具箱里有压缩包密码移除破解、Word文档密码密码移除、Excel文档密码密码移除、PPT文档密码密码...

    pdf水印移除工具

    PDF水印移除工具是一种专门用于处理PDF文档的软件,主要功能是帮助用户删除或去除PDF文件中的水印。在日常工作中,PDF文件常被用作正式文档的格式,但有时由于版权保护或其他原因,文件可能被添加了水印,这可能对...

    如何去word的水印.docx

    记得定期更新你的Word软件以获取最新的功能和修复,同时,关注官方教程和用户社区,可以获取更多关于Word使用技巧的信息。如果你对Word有任何其他问题,可以加入相关技术论坛或群组,如文中提到的三联电脑办公群,与...

    使用ultralytics-YOLO8对水印位置进行模型训练&检测,然后使用IOPaint移除检测到的水印

    YOLO(You Only Look ...总之,通过使用YOLOv8进行水印位置的训练和检测,结合IOPaint进行水印移除,我们可以实现一个自动化的工作流程,有效地处理图像中的水印问题。这展示了深度学习在图像处理领域的强大应用潜力。

    servlet过滤器技术实例,

    Servlet 3.0及以上版本引入了动态过滤器链,允许在运行时添加和移除过滤器,增强了过滤器的灵活性。 六、实际项目中的使用 在实际项目中,我们经常结合Spring框架使用过滤器。例如,Spring Security就是通过过滤器...

    去除Word水印的两个实用方法.docx

    在使用Microsoft Word进行文档编辑时,有时会遇到带有水印的文档,这可能是为了保护版权或增添特定样式。然而,当不再需要这些水印时,了解如何去除它们变得至关重要。以下将详细介绍两种实用方法,帮助你成功移除...

    Aspose.Words for .NET 18.7(.net+.net core) 去水印,学习使用

    2. 加载文档:使用Document类加载含有水印的Word文档。 3. 查找水印:通过循环遍历文档的段落和形状,检查是否包含水印元素,例如特定颜色、透明度或文本内容。 4. 删除水印:一旦找到水印,可以调用相应的删除方法...

    WORD文档此文件正由另一应用程序或用户使用的解决办法!

    "WORD文档此文件正由另一应用程序或用户使用的解决办法" 在 Microsoft Office Word 中,用户可能会遇到一个问题,即当打开多个 Word 文档时,关闭其中一个文档时,系统会弹出对话框,提示“此文件正由另一应用程序...

    Spire.Doc 去水印版本.

    它提供了专门的API,允许开发者在代码中轻松移除Word文档中的水印,无论是文字型水印还是图像型水印,都可以一并处理。 **使用步骤** 1. **下载解压**:首先,你需要下载提供的压缩包文件,包含Spire.Pdf.dll、...

    简易视频logo水印移除工具

    在提供的压缩包文件名称列表中,“简易视频logo水印移除工具”可能是该软件的可执行文件,用户解压后可以直接运行。这样的命名方式直观明了,用户能快速识别出这是他们需要的工具。 关于视频水印移除的技术,通常...

    Java过滤器,字符过滤,标签过滤

    通过在web.xml配置文件中定义过滤器,我们可以指定它应用到哪些Servlet或URL模式上。 字符过滤是过滤器的一个常见应用场景。例如,在这个项目中,开发者可能创建了一个自定义的Filter类,该类检查请求参数或响应...

    Word2021文档怎么样去水印_1.docx

    完成以上步骤后,文档中的水印就会被成功移除。 #### 三、去除特殊类型的水印 对于第二种类型的水印,即特殊类型的水印,我们需要采取不同的策略: 1. **打开文档并进入页眉和页脚模式**:打开带有水印的Word2021...

Global site tag (gtag.js) - Google Analytics