Java相关pdf添加水印



Java相关pdf添加水印

【Java相关pdf添加水印】package com.export.utils;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Element;import com.itextpdf.text.pdf.*;import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.FileUtils;import org.junit.Test;import javax.swing.*;import java.awt.*;import java.io.*;/** * pdf 相关工具方法(添加水?。? **/@Slf4jpublic class PdfFileUtils {@Testpublic void pdfAddWaterRemark() throws IOException, DocumentException {// 要输出的pdf文件BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream(new File("E:/b.pdf")));// 要输入的PDF文件File file = new File("E:/c.pdf");byte[] bytes = FileUtils.readFileToByteArray(file);// 将pdf文件先加水印然后输出byte[] bytes1= setWatermark( bytes, "内部机密文件,请勿外传!");bos.write(bytes1);bos.flush();}/*** PDF加文字水印* @param input 源pdf文件输入数组* @param waterMarkName 水印文字* @return目标pdf的字节数组* @throws DocumentException* @throws IOException*/public static byte[] setWatermark( byte[] input, String waterMarkName) {try(ByteArrayOutputStream bos=new ByteArrayOutputStream()){PdfReaderreader = new PdfReader(input);PdfStamperstamper = new PdfStamper(reader, bos);// 获取总页数1, 下面从1开始遍历int total = reader.getNumberOfPages()1;// 使用classpath下面的字体库BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);// 水印字体加粗base.setPostscriptFontName(BaseFont.COURIER_BOLD);// 水印间隔int interval = 0;// 这个position主要是为了在换行加水印时能往右偏移起始坐标int position = 1;JLabel label = new JLabel();label.setText(waterMarkName);FontMetrics metrics = label.getFontMetrics(label.getFont());// 获取水印文字的高度和宽度int textH = metrics.getHeight();int textW = metrics.stringWidth(label.getText());// 设置水印透明度PdfGState gs = new PdfGState();gs.setFillOpacity(0.5f);gs.setStrokeOpacity(0.5f);for (int i = 1; i < total; i) {// 在内容下方加水印PdfContentByte content = stamper.getUnderContent(i);content.saveState();content.setGState(gs);// 设置字体和字体大小content.beginText();content.setFontAndSize(base, 20);// 获取每一页的高度、宽度com.itextpdf.text.Rectangle pageSizeWithRotation = reader.getPageSizeWithRotation(i);float pageHeight = pageSizeWithRotation.getHeight();float pageWidth = pageSizeWithRotation.getWidth();// 根据纸张大小多次添加,水印文字成30度角倾斜for (int height = intervaltextH; height < pageHeight; height = heighttextH * 10) {for (int width = intervaltextW - position * 150; width < pageWidthtextW; width = widthtextW80) {content.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW, height - textH, 30);}position;}content.endText();}stamper.close();reader.close();returnbos.toByteArray();}catch (Exception e){log.error("error",e);return null;}}}

相关经验推荐