当前位置: 首页 > news >正文

电商网站开发教材营销型网站名词解释

电商网站开发教材,营销型网站名词解释,怀化网站建设设计,荆门做网站itext PDF文件打印水印 前言:公司有个需求,打印的合同模板要加上水印,但是由于itext版本问题,网上千篇一律的方法基本都没办法有效使用,然后自己琢磨下,记录下实现水印的功能的笔记。多页上都加上水印&…

itext PDF文件打印水印

前言:公司有个需求,打印的合同模板要加上水印,但是由于itext版本问题,网上千篇一律的方法基本都没办法有效使用,然后自己琢磨下,记录下实现水印的功能的笔记。多页上都加上水印,核心就是加上自定义处理器实现水印功能.

PS: 这个也不是适用于itextpdf的所有版本,项目中引用的版本是: com.itextpdf:kernel:7.2.3,如其他版本不适用请自行调整代码

1.实现文字水印

实现的效果:水印加上透明度,不影响原先的内容,文字45度倾斜,文体是自定义字体,然后就是平铺真个整个页面。

TextWatermarkEventHandler
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class TextWatermarkEventHandler implements IEventHandler {private String watermarkText;private PdfFont font;private float fontSize;private static final float WIDTH_SPACING = 20;private static final float HEIGHT_SPACING = 130;private static final float ANGLE = 45;private static final float TRANSPARENCY = 0.3f;// 构造函数,传入水印文字、字体、大小、水平间距、垂直间距和旋转角度public TextWatermarkEventHandler(String text, PdfFont font, float fontSize) {this.watermarkText = text;this.font = font;this.fontSize = fontSize;}@Overridepublic void handleEvent(Event event) {PdfDocumentEvent docEvent = (PdfDocumentEvent) event;PdfDocument pdfDoc = docEvent.getDocument();PdfPage page = docEvent.getPage();// 获取页面大小Rectangle pageSize = page.getPageSize();PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);// 计算可用的页面宽度和高度float availableWidth = pageSize.getWidth();float availableHeight = pageSize.getHeight();// 创建图形状态并设置透明度PdfExtGState gState = new PdfExtGState();gState.setFillOpacity(TRANSPARENCY); // 设置透明度为 0.3// 文字的宽度float textWidth = font.getWidth(watermarkText, fontSize);// 调整初始绘制位置float startXOffset = -textWidth; // 从负数开始float startYOffset = -availableWidth;  // 从负数开始// 绘制每一行水印文字for (float startY = startYOffset; startY < availableHeight + fontSize; startY += fontSize + HEIGHT_SPACING) {// 保存当前画布状态,确保透明度只影响水印canvas.saveState();// 设置透明度,仅影响水印canvas.setExtGState(gState);// 设置字体和大小canvas.setFontAndSize(font, fontSize);// 设置文字颜色(灰色水印)canvas.setFillColor(ColorConstants.LIGHT_GRAY);// 整行旋转canvas.concatMatrix((float) Math.cos(Math.toRadians(ANGLE)), (float) Math.sin(Math.toRadians(ANGLE)),(float) -Math.sin(Math.toRadians(ANGLE)), (float) Math.cos(Math.toRadians(ANGLE)),0, startY);// 绘制这一行的文字水印for (float x = startXOffset; x < availableWidth + textWidth; x += textWidth + WIDTH_SPACING) {canvas.beginText();canvas.moveText(x, 0);canvas.showText(watermarkText);canvas.endText();}// 恢复画布状态,确保透明度只影响水印canvas.restoreState();}// 释放画布资源canvas.release();}
}
调用TextWatermarkEventHandler监听器
// 自定义字体
String fontPath = WebUtils.getClasspath()+ File.separator+ "static" + File.separator + "font" + File.separator+"simsun.ttf";
PdfFont watermarkFont = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
TextWatermarkEventHandler watermarkEventHandler = new TextWatermarkEventHandler("你是个大聪明呀",watermarkFont,30);
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, watermarkEventHandler);
实现的效果(截取部分)

在这里插入图片描述

2.实现图片水印

实现的效果:水印加上透明度,不影响原先的内容,图片45度倾斜,图片进行缩放处理,然后就是平铺真个整个页面。(ps:此处的图片是经过缩放处理后的图片了)

ImageWatermarkEventHandler
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class ImageWatermarkEventHandler implements IEventHandler {private String imagePath;private static final float SCALE = 1;private static final float WIDTH_SPACING = 20;private static final float HEIGHT_SPACING = 130;private static final float ANGLE = 45;private static final float TRANSPARENCY = 0.3f;// 构造函数,传入水印图片路径public ImageWatermarkEventHandler(String imagePath) {this.imagePath = imagePath;}@Overridepublic void handleEvent(Event event) {// 获取事件类型PdfDocumentEvent docEvent = (PdfDocumentEvent) event;PdfDocument pdfDoc = docEvent.getDocument();PdfPage page = docEvent.getPage();// 获取页面尺寸Rectangle pageSize = page.getPageSize();PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);ImageData imageData = null;try {imageData = ImageDataFactory.create(imagePath);PdfImageXObject watermarkImage = new PdfImageXObject(imageData);// 获取图片的原始宽高,按比例缩放float imgWidth = watermarkImage.getWidth() ;float imgHeight = watermarkImage.getHeight() ;// 计算可用的页面宽度和高度float availableWidth = pageSize.getWidth();
//            float availableHeight = pageSize.getHeight();// 创建图形状态并设置透明度PdfExtGState gState = new PdfExtGState();gState.setFillOpacity(TRANSPARENCY); // 设置透明度为 0.3// 在页面上平铺水印图片for (float y = -availableWidth; y < pageSize.getHeight()*2; y += imgHeight + HEIGHT_SPACING) {for (float x = 0; x < pageSize.getWidth()*2; x += imgWidth + WIDTH_SPACING) {// 保存当前的画布状态canvas.saveState();// 设置水印的透明度canvas.setExtGState(gState);// 将图片水印旋转canvas.concatMatrix(Math.cos(Math.toRadians(ANGLE)),Math.sin(Math.toRadians(ANGLE)),-Math.sin(Math.toRadians(ANGLE)), Math.cos(Math.toRadians(ANGLE)),0, 0); // 旋转canvas.addXObjectAt(watermarkImage, x, y); // x, y 位置// 恢复画布状态canvas.restoreState();}}// 结束页面修改canvas.release();} catch (Exception e) {log.error("pdf添加水印报错:{}",e.getMessage());}}
}
调用TextWatermarkEventHandler监听器
String watermarkImagePath = WebUtils.getClasspath()+ File.separator+ "static" + File.separator + "image" + File.separator+"xxxx.jpg";
ImageWatermarkEventHandler watermarkEventHandler = new ImageWatermarkEventHandler(watermarkImagePath);
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, watermarkEventHandler);
实现的效果(截取部分)

在这里插入图片描述

http://www.yayakq.cn/news/646482/

相关文章:

  • 编写网站方案设计书表格什么建设网站
  • 中企动力近期做的网站广告公司广告设计
  • 阿里云空间部署网站吗创建网站平台要多少钱
  • 雷州网站建设公司株洲头条新闻
  • 青岛seo整站优化公司企业网站建设服务好
  • 我国档案网站建设研究论文wordpress博客 文章格式
  • 做网站网站湖南企业seo优化报价
  • 四川省微信网站建设推广wordpress炫酷插件
  • 模板网站的缺陷app排名优化公司
  • 宣城网站建设上位机软件开发教程
  • 洛阳市城市建设网站从事网站开发方向
  • 做微商网站公司网站建设平台招商
  • python可以做网站前端温州网站建设案例
  • 太原模板建站系统广东建设网 四川是什么网站
  • 网站h标签wordpress带微信二维码
  • 网站js代码不显示wordpress code插件
  • 虚拟服务器怎样做网站wordpress添加一个论坛
  • 长沙做网站哪里好上海有哪些互联网大厂
  • 如何线下宣传网站自己做网站要会什么
  • 上海网站建设与设计公司济南建设网站的公司哪家好
  • 网站架构图怎么做wordpress会员功能主题
  • 网站当前链接cms 网站模板
  • 嘉兴seo网站优化湖北创研楚商网站建设销售人员
  • 湖北营销网站建设联系方式做影视网站有什么风险
  • 海原网站建设天河网站建设系统
  • 企业微信手机片网站制作wordpress单页导航
  • 程序员做笔记的网站成都网站建设公司兴田德润在哪儿
  • 问答网站建设怎么提问有哪些程序网站
  • 四会网站建设做深度报道的网站
  • 沈阳企业网站制作公司黑马程序员培训价格表