一、概述
在上一篇博客中,介绍了excel转pdf的方法;在这里,整理了一些方法:在生成pdf时,插入图片、新增水印、添加文字等。
二、依赖
依赖和上一篇博客相同,在这里不再赘述。
三、相关工具类
1. FontGenerater.java (在上篇博客中,已贴出)
2. Excel2Pdf.java (在上篇博客中,已贴出)
3. PDFUtil.java
public class PDFUtil {
/**
* 给pdf添加图片水印
* @param waterMar
* @param imgpath 图片路径
* @throws Exception
*/
public static void addImgWaterMark(PdfContentByte waterMar, String imgpath) throws Exception {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.4f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 40);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
Image img = Image.getInstance(imgpath);
img.setAbsolutePosition(200, 380);
img.scaleAbsolute(200, 200);
waterMar.addImage(img);
// 设置水印颜色
waterMar.setColorFill(BaseColor.GRAY);
//结束设置
waterMar.endText();
waterMar.stroke();
}
/**
* 给pdf添加文字水印(平铺)
* @param waterMar
* @param text 水印文本
* @throws Exception
*/
public static void addTextFullWaterMark(PdfContentByte waterMar, String text) throws Exception {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.4f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 40);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
for (int x = 0; x <= 700; x += 200) {
for (int y = 0; y <= 800; y += 200) {
waterMar.showTextAligned(Element.ALIGN_RIGHT, text, x, y, 35);
}
}
// 设置水印颜色
waterMar.setColorFill(BaseColor.GRAY);
//结束设置
waterMar.endText();
waterMar.stroke();
}
/**
* 给pdf添加文字水印(单个)
* @param waterMar
* @param text 水印文本
* @throws Exception
*/
public static void addTextWaterMark(PdfContentByte waterMar, String text) throws Exception {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.4f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 80);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
waterMar.showTextAligned(Element.ALIGN_RIGHT, text, 475, 600, 45);
// 设置水印颜色
waterMar.setColorFill(BaseColor.GRAY);
//结束设置
waterMar.endText();
waterMar.stroke();
}
/**
* 添加页眉、页脚
* @param writer
* @param content
* @param pagewidth
* @param pageheight
* @throws Exception
*/
public static void addText(PdfWriter writer, String content, int pagewidth, int pageheight) throws Exception {
PdfPTable table = new PdfPTable(1);
table.setTotalWidth(530);
PdfPCell cell = new PdfPCell(new Phrase(content, Excel2Pdf.getFont(FontGenerater.FONT_SONTI_NAME, 12, false)));
cell.setBorder(0);
// cell.setPaddingLeft(30f);
cell.setPaddingTop(-15f);
cell.setPaddingRight(20f);
table.addCell(cell);
Header event = new Header(table, pagewidth, pageheight);
writer.setPageEvent(null);
writer.setPageEvent(event);
}
//页眉事件
private static class Header extends PdfPageEventHelper {
public static PdfPTable header;
public int pagewidth;
public int pageheight;
public Header(PdfPTable header, int pagewidth, int pageheight) {
Header.header = header;
this.pagewidth = pagewidth;
this.pageheight = pageheight;
}
@Override
public void onEndPage(PdfWriter writer, Document document) {
//把页眉表格定位
header.writeSelectedRows(0, -1, this.pagewidth, this.pageheight, writer.getDirectContent());
}
}
/**
* 添加图片
* @param document
* @param imgPath
* @param newWidth
* @param newHeight
* @param absoluteX
* @param absoluteY
* @throws IOException
* @throws DocumentException
*/
public static void addImg(Document document, String imgPath, float newWidth, float newHeight,
float absoluteX, float absoluteY) throws IOException, DocumentException {
Image img1 = Image.getInstance(imgPath);
img1.setAbsolutePosition(absoluteX, absoluteY);
img1.scaleAbsolute(newWidth, newHeight);
document.add(img1);
}
}
四、示例
1.添加图片水印
// A4大小
RectangleReadOnly shuban = new RectangleReadOnly(PageSize.A4);
Document document = new Document(shuban);
// 获取一个pdfwriter实例
FileOutputStream stream = new FileOutputStream("D:\\website\\demo.pdf");
PdfWriter writer = PdfWriter.getInstance(document, stream);
// 打开document
document.open();
// 新增页
document.newPage();
// **************添加水印**************
PdfContentByte waterMar = writer.getDirectContentUnder();
PDFUtil.addImgWaterMark(waterMar, "D:\\website\\java.png");
// **************完成图片水印添加***********
// 关闭
document.close();
writer.close();
stream.close();

2.添加平铺的文字水印
// **************添加平铺的文字水印**************
PdfContentByte waterMar = writer.getDirectContentUnder();
String text = "这是一个示例";
PDFUtil.addTextFullWaterMark(waterMar, text);
// **************完成水印***********************

3.添加单个文字水印
// **************添加单个的文字水印**************
PdfContentByte waterMar = writer.getDirectContentUnder();
String text = "这是一个示例";
PDFUtil.addTextWaterMark(waterMar, text);
// **************完成水印***********************

4.插入文字、图片
// 插入文字,最后两个参数是文字的位置
PDFUtil.addText(writer, "这是一段文字", 480, 802);
// 插入图片,第二、三个参数表示图片宽高,第四、五个参数表示位置
PDFUtil.addImg(document, "D:\\website\\start.png", 100, 100, 70, 700);

有不足之处,望留言指出!萌新上路,请多多指教。
网友评论