一、导出Excel加文字水印
方法:通过实现准备一个带有水印的Excel文件,然后将数据覆盖该文件然后输出。
比如我准备了如下的一个带水印的模板,我起名为water.xlsx(网上有如何给Excel加水印)
我是在原有导出的方法上进行改造,原方法使用的正是POI。
1、改造创建工作簿的方法
this.wb指的就是Workbook类。
/*** 创建一个工作簿*/
public void createWorkbook() throwsException {//获取有水印的excel模板文件
File finalXlsxFile = new File("src/main/resources/static/water.xlsx");//获取excel文件流
FileInputStream inputStream = newFileInputStream(finalXlsxFile);this.wb = newXSSFWorkbook(inputStream);
}
2、改造创建工作表的方法
this.sheet指的就是Sheet类。
//原来创建空的Sheet为方法://this.sheet = wb.createSheet();//现在改为:
this.sheet = wb.getSheetAt(0);
通过以上改造就可导出带有水印的Excel。
二、下载PDF加入文字水印
方法:itext提供了添加水印的方法。
1、首先加入依赖
com.itextpdf
itextpdf
5.2.0
com.itextpdf
itext-asian
5.2.0
2、加入以下代码
/*** 设置文字水印
*
*@paramos 输出流
*@paramsrcFile 源文件
*@paramwaterMarkName 水印文字
*@throwsDocumentException
*@throwsIOException*/
public static void setWordMark(OutputStream os, String srcFile, String waterMarkName) throwsDocumentException, IOException {//如果你想直接输出到某个路径,将os参数改为descFile(具体输出路径)//BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(descFile)));
PdfReader reader= newPdfReader(srcFile);
PdfStamper stamper= newPdfStamper(reader, os);int total = reader.getNumberOfPages() + 1;
PdfContentByte content;
BaseFont base= BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
PdfGState gs= newPdfGState();for (int i = 1; i < total; i++) {
content= stamper.getOverContent(i); //在内容上方加水印//content = stamper.getUnderContent(i);//在内容下方加水印
gs.setFillOpacity(0.2f); //透明度
content.setGState(gs);
content.beginText();
content.setColorFill(BaseColor.BLACK);
content.setFontAndSize(base,50);
content.setTextMatrix(70, 200);
content.showTextAligned(Element.ALIGN_CENTER, waterMarkName,300, 350, 55);
content.endText();
}
stamper.close();
}
3、直接使用
你下载请求Controller的时候,直接使用,例如:
这里的downloadPath指的是要下载的文件路径,"奥里给"为水印文字。
PDFUtils.setWordMark(response.getOutputStream(), downloadPath, "奥里给");
三、下载图片加文字水印
方法:使用Graphics2D在图片上直接绘画出水印。
1、直接复制以下代码
注意我这里也是用输出流作为参数。
/*** 图片水印处理*/
public classImageUtils {//水印透明度
private static float alpha = 0.5f;//水印横向位置
private static int positionWidth = 150;//水印纵向位置
private static int positionHeight = 300;//水印文字字体
private static Font font = new Font("宋体", Font.BOLD, 72);//水印文字颜色
private static Color color =Color.red;/*** 给图片添加水印文字、可设置水印文字的旋转角度
*
*@paramlogoText 水印文字
*@paramsrcImgPath 源文件路径
*@paramos 输出流
*@paramdegree 设置角度*/
public static voidmarkImageByText(String logoText, String srcImgPath,
OutputStream os, Integer degree) {
InputStream is= null;try{//1、源图片
Image srcImg = ImageIO.read(newFile(srcImgPath));
BufferedImage buffImg= new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);//2、得到画笔对象
Graphics2D g =buffImg.createGraphics();//3、设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(
srcImg.getScaledInstance(srcImg.getWidth(null),
srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,null);//4、设置水印旋转
if (null !=degree) {
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2,
(double) buffImg.getHeight() / 2);
}//5、设置水印文字颜色
g.setColor(color);//6、设置水印文字Font
g.setFont(font);//7、设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));//8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
g.drawString(logoText, positionWidth, positionHeight);//9、释放资源
g.dispose();//10、生成图片
ImageIO.write(buffImg, "JPG", os);
System.out.println("图片完成添加水印文字");
}catch(Exception e) {
e.printStackTrace();
}finally{try{if (null !=is)
is.close();
}catch(Exception e) {
e.printStackTrace();
}try{if (null !=os)
os.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
2、直接调用
“奥里给”为水印文字,downloadPath为 源文件地址,最后一个参数应该是设置角度的,我这里设置为null。
ImageUtils.markImageByText("奥里给", downloadPath, response.getOutputStream(), null);
四、Word加水印
方法:使用工具Spire.Doc for Java(免费版),文档开头会有工具自带的文字水印,付费可以去。
1、在pom.xml文件中配置Maven仓库路径
com.e-iceblue
http://repo.e-iceblue.cn/repository/maven-public/
2、添加依赖
e-iceblue
spire.doc
3.7.2
3、使用示例
import com.spire.doc.*;importcom.spire.doc.documents.WatermarkLayout;import java.awt.*;public classMain {public static voidmain(String[] args) {//加载测试文档
Document document = newDocument();
document.loadFromFile("sample.docx");//插入文本水印
InsertTextWatermark(document.getSections().get(0));//保存文档
document.saveToFile("textwatermark.docx",FileFormat.Docx );
}//自定义方法指定文本水印字样,并设置成水印
private static voidInsertTextWatermark(Section section){
TextWatermark txtWatermark= newTextWatermark();
txtWatermark.setText("内部使用");
txtWatermark.setFontSize(40);
txtWatermark.setColor(Color.red);
txtWatermark.setLayout(WatermarkLayout.Diagonal);
section.getDocument().setWatermark(txtWatermark);
}
}
如果有其他需求的请参考我放的链接,感谢原作者。