Java下载文件加文字水印(Excel、PDF、图片)
下载PDF、图片加入文字水印,导出的Excel加入水印。后续再添加…
一、导出Excel加文字水印
(参考了:https://www.cnblogs.com/scuury/p/10234744.htmlhttps://www.cnblogs.com/scuury/p/10234744.html)
方法:通过实现准备一个带有水印的Excel文件,然后将数据覆盖该文件然后输出。
比如我准备了如下的一个带水印的模板,我起名为water.xlsx(网上有如何给Excel加水印)
我是在原有导出的方法上进行改造,原方法使用的正是POI。
1、改造创建工作簿的方法
this.wb指的就是Workbook类。
/** * 创建一个工作簿 */ public void createWorkbook() throws Exception { //获取有水印的excel模板文件 File finalXlsxFile = new File("src/main/resources/static/water.xlsx"); //获取excel文件流 FileInputStream inputStream = new FileInputStream(finalXlsxFile);
this.wb = new XSSFWorkbook(inputStream); }
2、改造创建工作表的方法
this.sheet指的就是Sheet类。
// 原来创建空的Sheet为方法: // this.sheet = wb.createSheet(); // 现在改为: this.sheet = wb.getSheetAt(0);
通过以上改造就可导出带有水印的Excel。
二、下载PDF加入文字水印
(参考了:https://github.com/yhxu/PdfUtil/blob/master/src/com/xuyh/PDFUtils.java)
方法:itext提供了添加水印的方法。
1、首先加入依赖
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
2、加入以下代码
/** * 设置文字水印 * * @param os 输出流 * @param srcFile 源文件 * @param waterMarkName 水印文字 * @throws DocumentException * @throws IOException */ public static void setWordMark(OutputStream os, String srcFile, String waterMarkName) throws DocumentException, IOException { // 如果你想直接输出到某个路径,将os参数改为descFile(具体输出路径) //BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(descFile))); PdfReader reader = new PdfReader(srcFile); PdfStamper stamper = new PdfStamper(reader, os); int total = reader.getNumberOfPages() + 1; PdfContentByte content; BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED); PdfGState gs = new PdfGState(); 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, "奥里给");
三、下载图片加文字水印
(参考了:https://blog.csdn.net/zengshunyao/article/details/44758297)
方法:使用Graphics2D在图片上直接绘画出水印。
1、直接复制以下代码
注意我这里也是用输出流作为参数。
/** * 图片水印处理*/ public class ImageUtils { // 水印透明度 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; /** * 给图片添加水印文字、可设置水印文字的旋转角度 * * @param logoText 水印文字 * @param srcImgPath 源文件路径 * @param os 输出流 * @param degree 设置角度 */ public static void markImageByText(String logoText, String srcImgPath, OutputStream os, Integer degree) { InputStream is = null; try { // 1、源图片 Image srcImg = ImageIO.read(new File(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加水印
(参考了:https://www.cnblogs.com/Yesi/p/10894596.html)
方法:使用工具Spire.Doc for Java(免费版),文档开头会有工具自带的文字水印,付费可以去。
1、在pom.xml文件中配置Maven仓库路径
<repositories> <repository> <id>com.e-iceblue</id> <url>http://repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories>
2、添加依赖
<dependency> <groupId>e-iceblue</groupId> <artifactId>spire.doc</artifactId> <version>3.7.2</version> </dependency>
3、使用示例
import com.spire.doc.*; import com.spire.doc.documents.WatermarkLayout; import java.awt.*; public class Main { public static void main(String[] args) { //加载测试文档 Document document = new Document(); document.loadFromFile("sample.docx"); //插入文本水印 InsertTextWatermark(document.getSections().get(0)); //保存文档 document.saveToFile("textwatermark.docx",FileFormat.Docx ); } //自定义方法指定文本水印字样,并设置成水印 private static void InsertTextWatermark(Section section){ TextWatermark txtWatermark = new TextWatermark(); txtWatermark.setText("内部使用"); txtWatermark.setFontSize(40); txtWatermark.setColor(Color.red); txtWatermark.setLayout(WatermarkLayout.Diagonal); section.getDocument().setWatermark(txtWatermark); } }
如果有其他需求的请参考我放的链接,感谢原作者。