java实现给pdf文件添加水印效果
1.导入jar包
链接:https://pan.baidu.com/s/1yf7HYIxTrCuPGnkL9fjKmw 提取码:8jd0
2.开始吧
//处理pdf文件
public void loadPdf(HttpServletRequest request,HttpServletResponse response, String strUrl) throws Exception {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//得到输入流
InputStream inputStream = conn.getInputStream();
String[] urlSplit = strUrl.split("/");
int i = urlSplit.length;
String[] nextSplit = urlSplit[i - 1].split("\\.");
//解析出名字
String fileName = nextSplit[0];
//来使得唯一
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
String str = sdf.format(System.currentTimeMillis());
for (int m = 1; m < 3; m++) {
int rd = (int) (Math.random() * 10);
str = str + rd;
}
//保存路径
String filePath = "D:\\" + fileName + "-" + str + ".pdf";
File file = new File(filePath);
// 将输入流转为文件
FileUtils.copyInputStreamToFile(inputStream, file);
//获取当前登陆用户
User user = ToolsUtil.getUser();
String outputFilePath = "D:\\b.pdf";
// 给获取到的pdf添加水印
waterMark(filePath, outputFilePath, user.getName());
// 下载pdf
downPdf(request,response, outputFilePath);
}
//给PDF添加水印
//inputFile 文件路径+名称
//outputFile 添加水印后输出文件保存的路径+名称
//waterMarkName 添加水印的内容
public static void waterMark(String inputFile,String outputFile, String waterMarkName) {
try {
//切记这里的参数是文件的路径 ,路径必须是双斜杠的如F:\\test.pdf,不能是F:/test.pdf 或者F:\test.pdf
PdfReader reader = new PdfReader(inputFile);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.2f);//改透明度
gs.setStrokeOpacity(0.4f);
int total = reader.getNumberOfPages() + 1;
JLabel label = new JLabel();
label.setText(waterMarkName);
PdfContentByte under;
// 仅添加一个水印
for (int i = 1; i < total; i++) {
under = stamper.getOverContent(i);// 在内容上方加水印
//under = stamper.getUnderContent(i);//在内容下方加水印
gs.setFillOpacity(0.2f);
under.setGState(gs);
under.beginText();
under.setColorFill(BaseColor.LIGHT_GRAY);//改变颜色
under.setFontAndSize(base, 200);//改水印文字大小
under.setTextMatrix(70, 200);
//后3个参数,x坐标,y坐标,角度
under.showTextAligned(Element.ALIGN_CENTER, waterMarkName, 300, 350, 55);
under.endText();
}
//下边这一段可添加多个水印
// Rectangle pageRect = null;
// FontMetrics metrics;
// int interval = -5;
// int textH = 0;
// int textW = 0;
// label.setText(waterMarkName);
// metrics = label.getFontMetrics(label.getFont());
// textH = metrics.getHeight();
// textW = metrics.stringWidth(label.getText());
// for (int i = 1; i < total; i++) {
// pageRect = reader.getPageSizeWithRotation(i);
// under = stamper.getOverContent(i);//在内容上方加水印
// //under = stamper.getUnderContent(i);//在内容下方加水印
// under.saveState();
// under.setGState(gs);
// under.beginText();
// under.setFontAndSize(base, 20);
//
// // 水印文字成30度角倾斜
// for (int height = interval + textH; height < pageRect.getHeight();
// height = height + textH * 3) {
// for (int width = interval + textW; width < pageRect.getWidth() + textW;
// width = width + textW * 2) {
// under.showTextAligned(Element.ALIGN_LEFT
// , waterMarkName, width - textW,
// height - textH, 30);
// }
// }
// // 添加水印文字
// under.endText();
// }
stamper.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 下载加水印之后的文件
public void downPdf(HttpServletRequest httprequest,HttpServletResponse response, String fileName) throws IOException{
String filename = "test.pdf";
File file = new File(fileName);
// 文件存在才下载
if (file.exists()) {
OutputStream out = null;
FileInputStream in = null;
try {
// 读取要下载的内容
in = new FileInputStream(file);
// 告诉浏览器下载的方式以及一些设置
// 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码
String agent = httprequest.getHeader("user-agent");
if (agent.contains("FireFox")) {
filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
} else {
filename = URLEncoder.encode(filename, "UTF-8");
}
// 设置下载文件的mineType,告诉浏览器下载文件类型
String mineType = httprequest.getServletContext().getMimeType(filename);
response.setContentType(mineType);
// 设置一个响应头,无论是否被浏览器解析,都下载
response.setHeader("Content-disposition", "attachment; filename=" + filename);
// 将要下载的文件内容通过输出流写到浏览器
out = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
}
}
}
3.效果展示
一个大水印
多个小水印