package com.tythin.tyboot.core.util; import com.itextpdf.text.BaseColor; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfGState; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * @author kuangQingLin * @version 1.0 * @date 2019/11/26/026 18:07 **/ public class PdfWaterUtil { public static void main(String[] args) throws IOException { setWatermark(new BufferedOutputStream(new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\2019-11-26-1.pdf"))), new FileInputStream("C:\\Users\\Administrator\\Desktop\\2019-11-26.pdf"), "借閱水印", 1); } /** * 中間或者兩邊水印 * @param bos 添加完水印的輸出 * @param input 原PDF文件輸入 * @param word 水印內容 * @param model 水印添加位置1中間,2兩邊 */ public static void setWatermark(BufferedOutputStream bos, InputStream input, String word, int model) { PdfReader reader = null; try { reader = new PdfReader(input); PdfStamper stamper = new PdfStamper(reader, bos); PdfContentByte content; // 創建字體,第一個參數是字體路徑,itext有一些默認的字體比如說: //1 BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED); //2 BaseFont base = BaseFont.createFont("/msyh.ttf", BaseFont.IDENTITY_H, // BaseFont.EMBEDDED);
//這個是為了解決linux服務器,水印亂碼問題,如果是windows服務器,用第一個就可以。
// 需要指定的字體,用第2,3個寫法,在resources文件夾下放置對應字體就行。
// 3 BaseFont base = BaseFont.createFont("/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); PdfGState gs = new PdfGState(); // 獲取PDF頁數 int total = reader.getNumberOfPages(); // 遍歷每一頁 for (int i = 0; i < total; i++) { // 頁寬度 float width = reader.getPageSize(i + 1).getWidth(); // 頁高度 float height = reader.getPageSize(i + 1).getHeight(); // 內容 content = stamper.getOverContent(i + 1); //開始寫入文本 content.beginText(); //水印透明度 gs.setFillOpacity(0.8f); content.setGState(gs); content.setColorFill(BaseColor.LIGHT_GRAY); //設置字體的輸出位置 content.setTextMatrix(70, 200); if (model == 1) { //平行居中的3條水印 //字體大小 content.setFontAndSize(base, 50); //showTextAligned 方法的參數分別是(文字對齊方式,位置內容,輸出水印X軸位置,Y軸位置,旋轉角度) content.showTextAligned(Element.ALIGN_CENTER, word, width / 2, 650, 30); content.showTextAligned(Element.ALIGN_CENTER, word, width / 2, 400, 30); content.showTextAligned(Element.ALIGN_CENTER, word, width / 2, 150, 30); } else { // 左右兩邊個從上到下4條水印 // 水印旋轉度數 float rotation = 30; content.setFontAndSize(base, 20); content.showTextAligned(Element.ALIGN_LEFT, word, 20, height - 50, rotation); content.showTextAligned(Element.ALIGN_LEFT, word, 20, height / 4 * 3 - 50, rotation); content.showTextAligned(Element.ALIGN_LEFT, word, 20, height / 2 - 50, rotation); content.showTextAligned(Element.ALIGN_LEFT, word, 20, height / 4 - 50, rotation); content.setFontAndSize(base, 22); content.showTextAligned(Element.ALIGN_RIGHT, word, width - 20, height - 50, rotation); content.showTextAligned(Element.ALIGN_RIGHT, word, width - 20, height / 4 * 3 - 50, rotation); content.showTextAligned(Element.ALIGN_RIGHT, word, width - 20, height / 2 - 50, rotation); content.showTextAligned(Element.ALIGN_RIGHT, word, width - 20, height / 4 - 50, rotation); } //結束寫入文本 content.endText(); //要打圖片水印的話 //Image image = Image.getInstance("c:/1.jpg"); //content.addImage(image); } stamper.close(); } catch (IOException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } } }
引入的pom依賴如下:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
