itextpdf5.5.13给pdf添加图片水印、添加文字水印(平铺)、添加文字水印(单个)、添加页眉、页脚、页眉事件、添加图片
转载自简书用户:alex很累,感谢分享。原地址:https://www.jianshu.com/p/2b9c7a0300e4
一、相关工具类
1. Excel2Pdf.java (如代码不可用请查看原地址:https://www.jianshu.com/p/be82e26622a1)
import cn.hutool.core.util.StrUtil;
import com.itextpdf.text.Font;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
import xyz.xunfan.xbs.constant.FontGenerater; import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID; public class Excel2Pdf {
public static PdfPTable excelToPdf(Workbook workbook, String filename, float pagewidth, int sheetindex) throws Exception {
Sheet sheet = workbook.getSheetAt(sheetindex); float[] widths = getColWidth(sheet); PdfPTable table = new PdfPTable(widths);
table.setWidthPercentage(90);
table.setLockedWidth(true);
table.setTotalWidth(pagewidth);
int colCount = widths.length; for (int r = 0; r < sheet.getPhysicalNumberOfRows(); r++) {
Row row = sheet.getRow(r);
if (row != null) {
for (int c = 0; c < colCount; c++) { Cell excelCell = row.getCell(c);
if (excelCell == null) {
excelCell = row.createCell(c);
}
String value = "";
if (excelCell != null) {
excelCell.setCellType(CellType.STRING);
value = excelCell.getStringCellValue() == null ? "" : excelCell.getStringCellValue();
}
org.apache.poi.ss.usermodel.Font excelFont = getExcelFont(workbook, excelCell, filename); short fontsize = excelFont.getFontHeightInPoints();
if (!StrUtil.isEmpty(value) && value.length() > FontGenerater.FONT_SMALL_VALUELENGTH && value.split(FontGenerater.HG).length >= 3 && r <= 1) {
fontsize = FontGenerater.FONT_SMALL_SIZE;
}
Font pdFont = getFont(excelFont.getFontName(), fontsize, excelFont.getBold()); PdfPCell pCell = null;
if (value.indexOf(FontGenerater.REPORT_UNDERLINE) >= 0) {
pCell = new PdfPCell(new Phrase(FontGenerater.EMPTY, pdFont));
Paragraph para = new Paragraph();
String[] values = value.split(FontGenerater.REPORT_UNDERLINE_SUFFIX);
for (String v : values) {
if (v.indexOf(FontGenerater.REPORT_UNDERLINE) >= 0) {
v = v.replace(FontGenerater.REPORT_UNDERLINE, FontGenerater.EMPTY);
Chunk dateUnderline = new Chunk(v);
dateUnderline.setUnderline(0.1f, -2f); para.add(dateUnderline);
} else {
para.add(new Chunk(v));
}
}
pCell.getPhrase().add(para);
} else {
pCell = new PdfPCell(new Phrase(value, pdFont));
} List<PicturesInfo> infos = POIExtend.getAllPictureInfos(sheet, r, r, c, c, false);
if (!infos.isEmpty()) {
PicturesInfo info = infos.get(0);
Image img = Image.getInstance(infos.get(0).getPictureData());
img.scaleToFit(120, 120);
pCell = new PdfPCell(img);
pCell.setUseAscender(true);
pCell.setHorizontalAlignment(Element.ALIGN_CENTER);
pCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
} pCell.setBorder(0);
pCell.setHorizontalAlignment(getHorAglin(excelCell.getCellStyle().getAlignment().getCode()));
pCell.setVerticalAlignment(getVerAglin(excelCell.getCellStyle().getVerticalAlignment().getCode())); pCell.setMinimumHeight(row.getHeightInPoints()); if (isMergedRegion(sheet, r, c)) { int[] line = getMerged(sheet, r, c);
if (r == line[0]) {
pCell.setBorderWidthLeft(excelCell.getCellStyle().getBorderLeft().getCode());
pCell.setBorderWidthTop(excelCell.getCellStyle().getBorderTop().getCode());
}
if (line[1] == sheet.getPhysicalNumberOfRows() - 1) {
pCell.setBorderWidthBottom(sheet.getRow(line[1]).getCell(line[2]).getCellStyle().getBorderBottom().getCode());
} int[] span = getMergedSpan(sheet, r, c);
if (span[0] == 1 && span[1] == 1) {//忽略合并过的单元格
continue;
}
pCell.setRowspan(span[0]);
pCell.setColspan(span[1]);
c = c + span[1] - 1;//合并过的列直接跳过
} else {
pCell.setBorderWidthTop(excelCell.getCellStyle().getBorderTop().getCode());
pCell.setBorderWidthLeft(excelCell.getCellStyle().getBorderLeft().getCode());
} if (r == sheet.getPhysicalNumberOfRows() - 1) {
pCell.setBorderWidthBottom(excelCell.getCellStyle().getBorderBottom().getCode());
} if (c == row.getPhysicalNumberOfCells() - 1) {
pCell.setBorderWidthRight(excelCell.getCellStyle().getBorderRight().getCode());
}
table.addCell(pCell);
}
} else {
PdfPCell pCell = new PdfPCell(new Phrase(FontGenerater.EMPTY)); pCell.setBorder(0);
pCell.setMinimumHeight(13);
table.addCell(pCell);
}
} return table;
} //获取字体
private static org.apache.poi.ss.usermodel.Font getExcelFont(Workbook workbook, Cell cell, String excelName) { if (excelName.endsWith(".xls")) {
return ((HSSFCell) cell).getCellStyle().getFont(workbook);
}
return ((XSSFCell) cell).getCellStyle().getFont();
} /**
* 判断excel单元格是否有边框
*
* @param excelCell
* @return
*/
private static boolean hasBorder(Cell excelCell) {
short top = excelCell.getCellStyle().getBorderTop().getCode();
short bottom = excelCell.getCellStyle().getBorderBottom().getCode();
short left = excelCell.getCellStyle().getBorderLeft().getCode();
short right = excelCell.getCellStyle().getBorderRight().getCode();
return top + bottom + left + right > 2;
} private static void setBorder(Cell excelCell, PdfPCell pCell) {
pCell.setBorderWidthTop(excelCell.getCellStyle().getBorderTop().getCode());
pCell.setBorderWidthBottom(excelCell.getCellStyle().getBorderBottom().getCode());
pCell.setBorderWidthLeft(excelCell.getCellStyle().getBorderLeft().getCode());
pCell.setBorderWidthRight(excelCell.getCellStyle().getBorderRight().getCode());
} /**
* 获取excel单元格数据显示格式
*
* @param dataFormat
* @return
* @throws Exception
*/
private static String getNumStyle(String dataFormat) throws Exception {
if (dataFormat == null || dataFormat.length() == 0) {
throw new Exception("");
}
if (dataFormat.indexOf("%") > -1) {
return dataFormat;
} else {
return dataFormat.substring(0, dataFormat.length() - 2);
}
} /**
* 判断单元格是否是合并单元格
*
* @param sheet
* @param row
* @param column
* @return
*/
private static boolean isMergedRegion(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return true;
}
}
}
return false;
} private static int[] getMerged(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
int[] span = {0, 0, 0, 0};
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
span[0] = firstRow;
span[1] = lastRow;
span[2] = firstColumn;
span[3] = lastColumn;
break;
}
}
}
return span;
} /**
* 计算合并单元格合并的跨行跨列数
*
* @param sheet
* @param row
* @param column
* @return
*/
private static int[] getMergedSpan(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
int[] span = {1, 1};
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (firstColumn == column && firstRow == row) {
span[0] = lastRow - firstRow + 1;
span[1] = lastColumn - firstColumn + 1;
break;
}
} return span;
} /**
* 获取excel中每列宽度的占比
*
* @param sheet
* @return
*/
private static float[] getColWidth(Sheet sheet) {
int rowNum = getMaxColRowNum(sheet);
Row row = sheet.getRow(rowNum);
int cellCount = row.getPhysicalNumberOfCells();
int[] colWidths = new int[cellCount];
int sum = 0; for (int i = 0; i < cellCount; i++) {
Cell cell = row.getCell(i);
if (cell != null) {
colWidths[i] = sheet.getColumnWidth(i);
sum += sheet.getColumnWidth(i);
}
} float[] colWidthPer = new float[cellCount];
for (int i = 0; i < cellCount; i++) {
colWidthPer[i] = (float) colWidths[i] / sum * 100;
}
return colWidthPer;
} /**
* 获取excel中列数最多的行号
*
* @param sheet
* @return
*/
private static int getMaxColRowNum(Sheet sheet) {
int rowNum = 0;
int maxCol = 0;
for (int r = 0; r < sheet.getPhysicalNumberOfRows(); r++) {
Row row = sheet.getRow(r);
if (row != null && maxCol < row.getPhysicalNumberOfCells()) {
maxCol = row.getPhysicalNumberOfCells();
rowNum = r;
}
}
return rowNum;
} /**
* excel垂直对齐方式映射到pdf对齐方式
*
* @param aglin
* @return
*/
private static int getVerAglin(int aglin) {
switch (aglin) {
case 1:
return Element.ALIGN_MIDDLE;
case 2:
return Element.ALIGN_BOTTOM;
case 0:
return Element.ALIGN_TOP;
default:
return Element.ALIGN_MIDDLE;
}
} /**
* excel水平对齐方式映射到pdf水平对齐方式
*
* @param aglin
* @return
*/
private static int getHorAglin(int aglin) {
switch (aglin) {
case 2:
return Element.ALIGN_CENTER;
case 3:
return Element.ALIGN_RIGHT;
case 1:
return Element.ALIGN_LEFT;
default:
return Element.ALIGN_CENTER;
}
} /**
* 格式化数字
*
* @param pattern
* @param num
* @return
*/
private static String numFormat(String pattern, double num) {
DecimalFormat format = new DecimalFormat(pattern);
return format.format(num);
} private static int[] getImgPostion(String imgKey) {
String[] arr = imgKey.split("_");
int[] position = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
position[i] = Integer.parseInt(arr[i]);
}
return position;
} public static Map<String, HSSFPictureData> getPictrues(HSSFWorkbook wb) {
Map<String, HSSFPictureData> map = new HashMap<String, HSSFPictureData>();
// getAllPictures方法只能获取不同的图片,如果Excel中存在相同的图片,只能得到一张图片
List<HSSFPictureData> pics = wb.getAllPictures();
if (pics.size() == 0) {
return map;
}
for (Integer sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
HSSFSheet sheet = wb.getSheetAt(sheetIndex);
HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
if (patriarch == null) {
continue;
}
for (HSSFShape shape : patriarch.getChildren()) {
HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
if (shape instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shape;
int picIndex = pic.getPictureIndex() - 1;
HSSFPictureData picData = pics.get(picIndex);
// 键格式:sheet索引_行号_列号_单元格内的上边距_单元格内的左边距_uuid
String key = sheetIndex + "_" + anchor.getRow1() + "_" + anchor.getCol1() + "_" + anchor.getRow2() + "_" + anchor.getCol2();
key += "_" + anchor.getDx1() + "_" + anchor.getDy1() + "_" + anchor.getDx2() + "_" + anchor.getDy2();
key += "_" + UUID.randomUUID();
map.put(key, picData);
}
}
}
return map;
} public static Map<String, PictureData> getPictrues(Workbook wb, int type) {
Map<String, PictureData> map = new HashMap<String, PictureData>();
// getAllPictures方法只能获取不同的图片,如果Excel中存在相同的图片,只能得到一张图片
List<? extends PictureData> pics = wb.getAllPictures();
if (pics.size() == 0) {
return map;
}
for (Integer sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
Sheet sheet = wb.getSheetAt(sheetIndex);
Drawing<?> patriarch = sheet.getDrawingPatriarch();
if (patriarch == null) {
continue;
}
if (type == 2) {
HSSFPatriarch hssfpatriarch = (HSSFPatriarch) patriarch;
for (HSSFShape shape : hssfpatriarch.getChildren()) {
HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
if (shape instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shape;
int picIndex = pic.getPictureIndex() - 1;
HSSFPictureData picData = (HSSFPictureData) pics.get(picIndex);
// 键格式:sheet索引_行号_列号_单元格内的上边距_单元格内的左边距_uuid
String key = sheetIndex + "_" + anchor.getRow1() + "_" + anchor.getCol1() + "_" + anchor.getRow2() + "_" + anchor.getCol2();
key += "_" + anchor.getDx1() + "_" + anchor.getDy1() + "_" + anchor.getDx2() + "_" + anchor.getDy2();
key += "_" + UUID.randomUUID();
map.put(key, picData);
}
}
} else if (type == 1) {
XSSFSheet xssfsheet = (XSSFSheet) sheet;
for (POIXMLDocumentPart dr : xssfsheet.getRelations()) {
if (dr instanceof XSSFDrawing) {
XSSFDrawing drawing = (XSSFDrawing) dr;
List<XSSFShape> shapes = drawing.getShapes();
for (XSSFShape shape : shapes) {
XSSFPicture pic = (XSSFPicture) shape;
XSSFPictureData data = pic.getPictureData();
XSSFClientAnchor aaa = pic.getClientAnchor();
CTMarker ccc = aaa.getFrom();
int ddd = ccc.getRow();
int eee = ccc.getCol();
// XSSFClientAnchor anchor = pic.getPreferredSize();
// CTMarker ctMarker = anchor.getFrom();
// String picIndex = String.valueOf(0) + "_" + ctMarker.getRow() + "_" + ctMarker.getCol();
String picIndex = String.valueOf(0) + "_" + ddd + "_" + eee;
map.put(picIndex, pic.getPictureData());
}
}
}
}
} return map;
} /**
* 单元格是否是图片的起始位置
*
* @return 单元格是否是图片的起始位置
*/
public static BaseColor parseBackgroundColor(Color hssfColor) {
if (hssfColor == null) {
// 白色
return new BaseColor(255, 255, 255);
}
short[] rgb = new short[]{255, 255, 255};
if (rgb[0] == 0 && rgb[1] == 0 && rgb[2] == 0) {
rgb = new short[]{255, 255, 255};
}
return new BaseColor(rgb[0], rgb[1], rgb[2]);
} public static PdfPCell parseImgPCell(Cell cell) {
PdfPCell pdfpCell = new PdfPCell();
CellStyle cellStyle = cell.getCellStyle();
pdfpCell.setUseAscender(true);
// 水平对齐方式
int halign_itext = cellStyle.getAlignment().getCode();
//int halign_itext = parseHorizontalAlignmen(halign);
pdfpCell.setHorizontalAlignment(halign_itext);
// 垂直对齐方式
int valign_itext = cellStyle.getVerticalAlignment().getCode();
// int valign_itext = parseVerticalAlignment(valign);
pdfpCell.setVerticalAlignment(valign_itext);
// 填充色(背景色)
// HSSFColor backgroundColor = cellStyle.getFillBackgroundColorColor();
Color backgroundColor = cellStyle.getFillForegroundColorColor();
BaseColor backgroundColor_itext = parseBackgroundColor(backgroundColor);
pdfpCell.setBackgroundColor(backgroundColor_itext);
// 自动换行
boolean noWrap = !cellStyle.getWrapText();
pdfpCell.setNoWrap(noWrap); // 边框样式
// 下边框
float borderWidth = cellStyle.getBorderBottom().getCode() / 32.00f;
//float borderWidth = borderStyle ;
pdfpCell.setBorderWidthBottom(borderWidth);
// 上框线
// borderStyle = cellStyle.getBorderTop();
pdfpCell.setBorderWidthTop(cellStyle.getBorderTop().getCode() / 32.00f);
// 左框线
// borderStyle = cellStyle.getBorderLeft();
pdfpCell.setBorderWidthLeft(cellStyle.getBorderLeft().getCode() / 32.00f);
// 右框线
//borderStyle = cellStyle.getBorderRight();
pdfpCell.setBorderWidthRight(cellStyle.getBorderRight().getCode() / 32.00f); pdfpCell.normalize();
// pdfpCell.disableBorderSide(9);
return pdfpCell;
} public static BaseColor parseColor(HSSFColor hssfColor) {
if (hssfColor == null) {
return new BaseColor(255, 255, 255);
}
short[] rgb = hssfColor.getTriplet();
return new BaseColor(rgb[0], rgb[1], rgb[2]);
} public static Font getFont(String fontname, int heigth, boolean bold) throws Exception {
BaseFont font = FontGenerater.getFont(fontname);
if (font == null) {
font = (BaseFont) FontGenerater.FONTMAP.get(FontGenerater.FONT_SONTI_NAME);
} return new Font(font, heigth, bold ? Font.BOLD : Font.NORMAL, BaseColor.BLACK); }
}
2. 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);
itextpdf5.5.13给pdf添加图片水印、添加文字水印(平铺)、添加文字水印(单个)、添加页眉、页脚、页眉事件、添加图片的更多相关文章
- C# 处理PPT水印(三)—— 在PPT中添加多行(平铺)文本水印效果
在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即幻灯片中只有一个文本水印:也可以添加多行(平铺)文本水印效果,即幻灯片中以一定方式平铺排列多个文本水印效果.本文 ...
- 如何用vue封装一个防用户删除的平铺页面的水印组件
需求 为了防止截图等安全问题,在web项目页面中生成一个平铺全屏的水印 要求水印内容为用户名,水印节点用户不能通过开发者工具等删除 效果 如上图 在body节点下插入水印DOM节点,水印节点覆盖在页面 ...
- Java 在PPT中添加文本水印的简易方法(单一/平铺水印)
[前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...
- Java 在Excel中添加水印(单一水印、平铺水印)
在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...
- css如何将图片横向平铺?
在CSS中,可以使用background(背景)属性来添加图片,默认图片是向x轴和y轴重复.那么css如何将图片横向平铺?下面本篇文章就来给大家介绍一下使用CSS将图片横向平铺的方法,希望对大家有所帮 ...
- canvas实现平铺水印
欲实现的水印平铺的效果图如下: 从图上看,应该做到以下几点: 文字在X和Y方向上进行平铺: 文字进行了一定的角度的旋转: 水印作为背景,其z-index位置应位于页面内容底部, 即不能覆盖页面主内容: ...
- Android 背景图片重复平铺
有时候我们需要将一个图片横向或者纵向的平铺(重复循环),这个时候我们需要创建一个xml文件,如下: <?xml version ="1.0" encoding =" ...
- android中可以使用bitmap的平铺,镜像平铺等减小图片带来的apk过大的问题
bitmap的平铺.镜像drawable文件夹中新建bitmap,其中的tileMode属性 tileMode 属性就是用于定义背景的显示模式: disabled 默认值,表示不使用平铺 cla ...
- java实现图片和pdf添加铺满文字水印
依赖jar包 <!-- pdf start --> <dependency> <groupId>com.itextpdf</groupId> <a ...
- Java 设置PDF平铺图片背景(水印)
一.概述及环境准备 本文介绍使用免费版PDF库-Free Spire.PDF for Java加载图片来设置成PDF平铺图片背景的效果,也可以作为平铺图片水印来使用:编辑代码前,需要先导入jar文件, ...
随机推荐
- redo log的用处
redo log用途 1. 用途 保证数据的更新操作不丢失,同时保证了性能 2. 如何没有redo log,如何保证数据库的更新操作不会由于数据库的宕机而丢失? 对数据库进行修改,应该是先从磁盘读取数 ...
- 利用selenium爬取前程无忧招聘数据
1.背景介绍 selenium通过驱动浏览器,模拟浏览器的操作,进而爬取数据.此外,还需要安装浏览器驱动,相关步骤自行解决. 2.导入库 import csv import random import ...
- 基于springboot实现SSM整合
(1)SpringBoot整合Spring(不存在) (2)SpringBoot整合SpringMVC(不存在) (3)SpringBoot整合MyBatis(主要) 一.新建springboot项目 ...
- Java面试——锁
公平锁:是指多个线程按照申请锁的顺序来获取锁,有点先来后到的意思.在并发环境中,每个线程在获取锁时会先查看此锁维护的队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中, ...
- 选择KV数据库最重要的是什么
本文分享自华为云社区<选择KV数据库最重要的是什么?>,作者:GaussDB 数据库 . 经常有客户提到KV数据库,但却偏偏"不要Redis".比如有个做安全威胁分析平 ...
- 【Visual Leak Detector】QT 中 VLD 输出解析(四)
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 目录 说明 1. 使用方式 2. 测试代码 3. 使用 32 bit 编译器时的输出 4. 使用 64 bit 编译器时的输出 5. 输 ...
- 网络调试助手|网络调试助手(CM精装版) V4.1.0 绿色版
http://www.winwin7.com/soft/16987.html#xiazai 网络调试助手软件功能 1.支持UDP,TCP协议2.支持单播/广播,集成TCP服务器和客户端3.支持ASCI ...
- 通俗易懂的spring事务的传播机制讲解!
spring事务理解 前提两个都是事务的方法,并且两个方法会进行调用,调用方统一使用required 举例有两个方法: required 如果当前上下文存在事务,被调用方则加入该调用方的事务,没有的话 ...
- MySQL(九)InnoDB行格式
InnoDB行格式 查看默认行格式: select @@innodb_default_row_format; 查看数据库表使用的行格式 mysql> use atguigudb; Reading ...
- 容易忽视的细节:Log4j 配置导致的零点接口严重超时
作者:vivo 互联网服务器团队- Jiang Ye 本文详细的记录了一次0点接口严重超时的问题排查经历.本文以作者自身视角极具代入感的描绘了从问题定位到具体的问题排查过程,并通过根因分析并最终解决问 ...