PDFBox和Itext是操作PDF文档最常用的两种java library。
这里记录一下用两种内库给pdf添加水印的方法。
Itext
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* Title:ItextPdfUtil
*
* @author Flicker
**/
public class ItextPdfUtil {
//创建一个pdf文件
public static void createPdf(){
Document document = new Document();
try {
PdfWriter.getInstance(document,new FileOutputStream("d:\\createPdf.pdf"));
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
document.open();
try {
//设置文档文字
document.add(new Paragraph("Hello world"));
} catch (DocumentException e) {
e.printStackTrace();
}
document.close();
}
//给pdf添加水印
public static void setImage(){
try {
PdfReader reader = new PdfReader("d:\\createPdf.pdf");
PdfStamper stamper = new PdfStamper(reader,new FileOutputStream("d:\\setWatermarkPdf.pdf"));
Image image = Image.getInstance("d:\\test\\BarCode.png");
image.setAbsolutePosition(260,790);
PdfContentByte under = stamper.getUnderContent(1);
under.addImage(image);
stamper.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//createPdf();
setImage();
}
}
PdfBox
package com.zo.util;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* Title:PdfBoxUtil
*
* @author Flicker
**/
public class PdfBoxUtil {
private static final int LogoPart = 4;
//pdf转成image
public static void toImage(){
File file = new File("d:\\1.pdf");
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
// 方式1,第二个参数是设置缩放比(即像素)
//BufferedImage image = renderer.renderImageWithDPI(i, 296);
// 方式2,第二个参数是设置缩放比(即像素)
BufferedImage image = renderer.renderImage(i, 2.5f);
ImageIO.write(image, "PNG", new File("d:\\1.png"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 给图片添加水印、可设置水印图片旋转角度
*
* @param iconPath 水印图片路径
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
* @param degree 水印图片旋转角度
* @param width 宽度(与左相比)
* @param height 高度(与顶相比)
* @param clarity 透明度(小于1的数)越接近0越透明
*/
public static void waterMarkImageByIcon(String iconPath, String srcImgPath,
String targerPath, Integer degree, Integer width, Integer height,
float clarity) {
OutputStream os = null;
try {
Image srcImg = ImageIO.read(new File(srcImgPath));
System.out.println("width:" + srcImg.getWidth(null));
System.out.println("height:" + srcImg.getHeight(null));
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
// 得到画笔对象
// Graphics g= buffImg.getGraphics();
Graphics2D g = buffImg.createGraphics();
// 设置对线段的锯齿状边缘处理
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);
if (null != degree) {
// 设置水印旋转
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2,
(double) buffImg.getHeight() / 2);
}
// 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
ImageIcon imgIcon = new ImageIcon(iconPath);
// 得到Image对象。
Image img = imgIcon.getImage();
float alpha = clarity; // 透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 表示水印图片的位置
g.drawImage(img, width, height, null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
g.dispose();
os = new FileOutputStream(targerPath);
// 生成图片
ImageIO.write(buffImg, "JPG", os);
System.out.println("添加水印图片完成!");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os) {
os.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//toImage();
waterMarkImageByIcon("d:\\test\\BarCode.png","d:\\1.png","d:\\2.png"
,0,1000,10,1f);
}
}
Coody 2018-03-29 12:33