package com.fruitking.testpdf.util;
import java.awt.Color;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import com.lowagie.text.BadElementException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfPageEventHelper;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;
public class PDFCreate2WaterMark {
/**
* 根据图片文件路径构建一个图片对象
* @param waterMarkFullFilePath
* @param xPosition
* @param yPosition
* @return
* @throws BadElementException
* @throws MalformedURLException
* @throws IOException
*/
private Image getWaterMarkImage(String waterMarkFullFilePath,float xPosition,float yPosition)throws BadElementException, MalformedURLException, IOException{
Image waterMarkImage = Image.getInstance(waterMarkFullFilePath);
waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标
waterMarkImage.setRotation(-20);//旋转 弧度
waterMarkImage.setRotationDegrees(-45);//旋转 角度
waterMarkImage.scalePercent(100);//依照比例缩放
return waterMarkImage;
}
/**
* 对一个图片对象设置展示位置等信息,该对象重复利用,减少PDF文件大小
* @param waterMarkImage
* @param xPosition
* @param yPosition
* @return
*/
private Image getSingletonWaterMarkImage(Image waterMarkImage,float xPosition,float yPosition){
waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标
waterMarkImage.setRotation(-20);//旋转 弧度
waterMarkImage.setRotationDegrees(-45);//旋转 角度
waterMarkImage.scalePercent(100);//依照比例缩放
return waterMarkImage;
}
/**
* 对于已存在的PDF文件增加图片水印
* 图片水印按照两列三行模式,并旋转45度正斜形式添加水印图片
* @param pdfInputFile
* @param pdfOutputFile
* @param waterMarkFullFilePath
*/
public void addPictureWaterMark(String pdfInputFile,String pdfOutputFile,String waterMarkFullFilePath) {
PdfStamper pdfStamper = null;
PdfReader reader = null;
try {
//构造需要添加水印的PDF文件对象
reader = new PdfReader(pdfInputFile);
int pdfFileTotalPages = reader.getNumberOfPages() + 1;
//创建添加水印后的PDF文件对象
OutputStream pdfOutputStream = new FileOutputStream(pdfOutputFile);
pdfStamper = new PdfStamper(reader,pdfOutputStream);
PdfContentByte underPdfContent = null;
float pageWidth = 0;
float pageHeight = 0;
for (int i = 1; i < pdfFileTotalPages; i++) {
pageWidth = reader.getPageSize(i).getWidth();//获取pdf文档页面宽度
pageHeight = reader.getPageSize(i).getHeight();//获取pdf文档页面高度
underPdfContent = pdfStamper.getUnderContent(i);
//添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印
underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.1f));
underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.4f));
underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.7f));
underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.1f));
underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.4f));
underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.7f));
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.2f);//设置透明度为0.2
underPdfContent.setGState(gs);
}
}catch(DocumentException de){
de.printStackTrace();
System.err.println("pdf add watermark documnet opt: " + de.getMessage());
}catch(IOException ioe){
ioe.printStackTrace();
System.err.println("pdf add watermark iostream opt: " + ioe.getMessage());
}finally{
if(reader!=null){
reader.close();
}
if(pdfStamper!=null){
try{
pdfStamper.close();
}catch(DocumentException de){
de.printStackTrace();
System.err.println("pdf add watermark close stamper: " + de.getMessage());
}catch(IOException ioe){
ioe.printStackTrace();
System.err.println("pdf add watermark close stream: " + ioe.getMessage());
}
}
}
}
/**
* 对于已存在的PDF文件增加图片水印,水印图片以单例模式添加,避免极大的增加PDF文件大小
* 图片水印按照两列三行模式,并旋转45度正斜形式添加水印图片
* @param pdfInputFile
* @param pdfOutputFile
* @param waterMarkFullFilePath
*/
public void addSingletonPictureWaterMark(String pdfInputFile,String pdfOutputFile,String waterMarkFullFilePath) {
PdfStamper pdfStamper = null;
PdfReader reader = null;
try {
//构造需要添加水印的PDF文件对象
reader = new PdfReader(pdfInputFile);
int pdfFileTotalPages = reader.getNumberOfPages() + 1;
//创建添加水印后的PDF文件对象
OutputStream pdfOutputStream = new FileOutputStream(pdfOutputFile);
pdfStamper = new PdfStamper(reader,pdfOutputStream);
PdfContentByte underPdfContent = null;
float pageWidth = 0;
float pageHeight = 0;
//仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加
Image waterMarkImage = Image.getInstance(waterMarkFullFilePath);
for (int i = 1; i < pdfFileTotalPages; i++) {
pageWidth = reader.getPageSize(i).getWidth();//获取pdf文档页面宽度
pageHeight = reader.getPageSize(i).getHeight();//获取pdf文档页面高度
underPdfContent = pdfStamper.getUnderContent(i);
//添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印
underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.1f));
underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.4f));
underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.7f));
underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.1f));
underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.4f));
underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.7f));
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.2f);//设置透明度为0.2
underPdfContent.setGState(gs);
}
}catch(DocumentException de){
de.printStackTrace();
System.err.println("pdf add watermark documnet opt: " + de.getMessage());
}catch(IOException ioe){
ioe.printStackTrace();
System.err.println("pdf add watermark iostream opt: " + ioe.getMessage());
}finally{
if(reader!=null){
reader.close();
}
if(pdfStamper!=null){
try{
- 1
- 2
前往页