Java 实现 文档 添加 水印 工具类

一、pom 文件引用

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.0</version><exclusions><!--解决含嵌入文件ppt转换报错 ArrayStoreException--><exclusion><artifactId>xmlbeans</artifactId><groupId>org.apache.xmlbeans</groupId></exclusion></exclusions></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.16</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency>

二、代码展示

2.1,ImageUtil 图片工具类

package cn.piesat.space.watermark.util;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;/*** @author: wangjing* @createTime: 2023-12-05 15:01* @version: 1.0.0* @Description: 图片工具类*/
public class ImageUtil {/*** 调整图片尺寸** @param inputPath 原图片地址* @param outPath   新图片地址* @param newWidth  新图片宽* @param newHeight 新图片高*/public static void resizeImage(String inputPath, String outPath, Integer newWidth, Integer newHeight) {try {BufferedImage bufferedImage = readPicture(inputPath);// 创建新的 BufferedImage,并设置绘制质量BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g2d = resizedImage.createGraphics();g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);// 绘制原始图像到新的 BufferedImage,并进行缩放Image scaledImage = bufferedImage.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);g2d.drawImage(scaledImage, 0, 0, null);g2d.dispose();// 保存新的图片ImageIO.write(resizedImage, "jpg", new File(outPath));System.out.println("图片尺寸调整完成!");} catch (IOException e) {e.printStackTrace();}}/*** 读取图片** @param path* @return*/public static BufferedImage readPicture(String path) {try {// 尝试获取本地return readLocalPicture(path);} catch (Exception e) {// 尝试获取网路return readNetworkPicture(path);}}/*** 读取本地图片** @param path* @return*/public static BufferedImage readLocalPicture(String path) {if (null == path) {throw new RuntimeException("本地图片路径不能为空");}// 读取原图片信息 得到文件File srcImgFile = new File(path);try {// 将文件对象转化为图片对象return ImageIO.read(srcImgFile);} catch (IOException e) {throw new RuntimeException(e);}}/*** 读取网络图片** @param path 网络图片地址*/public static BufferedImage readNetworkPicture(String path) {if (null == path) {throw new RuntimeException("网络图片路径不能为空");}try {// 创建一个URL对象,获取网络图片的地址信息URL url = new URL(path);// 将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)BufferedImage bugImg = ImageIO.read(url.openStream());if (null == bugImg) {throw new RuntimeException("网络图片地址不正确");}return bugImg;} catch (IOException e) {throw new RuntimeException(e);}}
}

2.1,DocumentWaterMarkUtils 文档水印工具类

package cn.piesat.space.watermark.util;import cn.piesat.space.watermark.enums.WatermarkTypeEnum;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.*;
import com.microsoft.schemas.vml.CTShape;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlObject;import javax.imageio.ImageIO;
import javax.swing.*;
import javax.xml.namespace.QName;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.lang.reflect.Field;/*** @author: wangjing* @createTime: 2023-12-05 15:01* @version: 1.0.0* @Description: 文档水印工具类*/
@Slf4j
public class DocumentWaterMarkUtils {/*** 水印默认字体*/private static Font defaultFont = new Font("宋体", Font.PLAIN, 70);/*** 水印默认字体颜色*/private static Color defaultColor = new Color(0, 0, 0, 60);/*** 水印透明度*/private static float alpha = 0.5f;/*** 水印之间的间隔*/private static final int xMove = 200;/*** 水印之间的间隔*/private static final int yMove = 200;public static void main(String[] args) {String watermarkText = "测试水印";String watermarkImage = "/Users/wangjing/Desktop/watermark/test.jpeg";// pdfString pdfInputPath = "/Users/wangjing/Desktop/watermark/pdf/test.pdf";String pdfOutPath = "/Users/wangjing/Desktop/watermark/pdf/test2.pdf";addPdfWatermark(pdfInputPath, pdfOutPath, watermarkText);// pptString pptInputPath = "/Users/wangjing/Desktop/watermark/ppt/test.pptx";// excel 文字水印String pptOutPath = "/Users/wangjing/Desktop/watermark/ppt/test2.pptx";addPPTWatermark(pptInputPath, pptOutPath, 1, watermarkText, defaultFont, defaultColor);// excel 图片水印String pptOutPathImage = "/Users/wangjing/Desktop/watermark/ppt/test3.pptx";addPPTWatermark(pptInputPath, pptOutPathImage, 2, watermarkImage, null, null);// excelString watermarkImageExcel = "/Users/wangjing/Desktop/watermark/image/test1.jpg";String excelInputPath = "/Users/wangjing/Desktop/watermark/excel/test.xlsx";// excel 文字水印String excelOutPath = "/Users/wangjing/Desktop/watermark/excel/test2.xlsx";addExcelWatermark(excelInputPath, excelOutPath, 1, watermarkText, defaultFont, defaultColor);// excel 图片水印String excelOutPathImage = "/Users/wangjing/Desktop/watermark/excel/test3.xlsx";addExcelWatermark(excelInputPath, excelOutPathImage, 2, watermarkImageExcel, null, null);//word 添加文字水印String wordInputPath = "/Users/wangjing/Desktop/watermark/word/test.docx";String wordOutPath = "/Users/wangjing/Desktop/watermark/word/test2.docx";addWordWatermark(wordInputPath, wordOutPath, watermarkText, "#D3D3D3", true, false);}/*** pdf设置文字水印** @param inputPath* @param outPath* @param watermark*/public static void addPdfWatermark(String inputPath, String outPath, String watermark) {// 创建输出文件File file = new File(outPath);if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {log.error("addPdfWatermark fail: 创建输出文件IO异常", e);throw new RuntimeException("addPdfWatermark fail: 创建输出文件IO异常");}}BufferedOutputStream outBufferedOutputStream = null;try {outBufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));} catch (FileNotFoundException e) {log.error("addPdfWatermark fail: 源文件不存在", e);throw new RuntimeException("addPdfWatermark fail: 源文件不存在");}PdfStamper pdfStamper = null;int total = 0;PdfContentByte content;com.itextpdf.text.Rectangle pageSizeWithRotation = null;BaseFont base = null;PdfReader inputPdfReader = null;try {inputPdfReader = new PdfReader(inputPath);// 解决PdfReader not opened with owner passwordField f = PdfReader.class.getDeclaredField("ownerPasswordUsed");f.setAccessible(true);f.set(inputPdfReader, Boolean.TRUE);pdfStamper = new PdfStamper(inputPdfReader, outBufferedOutputStream);total = inputPdfReader.getNumberOfPages() + 1;base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);} catch (IOException e) {log.error("addPdfWatermark fail:", e);throw new RuntimeException("addPdfWatermark fail:IOException");} catch (DocumentException e) {log.error("addPdfWatermark fail:", e);throw new RuntimeException("addPdfWatermark fail: DocumentException");} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}// 获取水印文字的高度和宽度Integer textH = 0;Integer textW = 0;JLabel label = new JLabel();label.setText(watermark);FontMetrics metrics = label.getFontMetrics(label.getFont());textH = metrics.getHeight();textW = metrics.stringWidth(label.getText());PdfGState gs = new PdfGState();for (Integer i = 1; i < total; i++) {//在内容上方加水印content = pdfStamper.getOverContent(i);gs.setFillOpacity(alpha);content.saveState();content.setGState(gs);content.beginText();content.setFontAndSize(base, 20);// 获取每一页的高度、宽度pageSizeWithRotation = inputPdfReader.getPageSizeWithRotation(i);float pageHeight = pageSizeWithRotation.getHeight();float pageWidth = pageSizeWithRotation.getWidth();// 根据纸张大小多次添加, 水印文字成30度角倾斜for (int height = -5 + textH; height < pageHeight; height = height + yMove) {for (int width = -5 + textW; width < pageWidth + textW; width = width + xMove) {content.showTextAligned(Element.ALIGN_LEFT, watermark, width - textW, height - textH, 30);}}content.endText();}// 管理所有流try {pdfStamper.close();outBufferedOutputStream.flush();outBufferedOutputStream.close();inputPdfReader.close();} catch (IOException e) {log.error("addPdfWatermark fail:", e);throw new RuntimeException("addPdfWatermark fail: 关闭流异常,IOException");} catch (DocumentException e) {log.error("addPdfWatermark fail:", e);throw new RuntimeException("addPdfWatermark fail: 关闭流异常,DocumentException");}}/*** PPT 添加水印** @param inputPath     原ppt地址* @param targetpath    新ppt地址* @param watermarkType 水印类型(1:文字水印;2:图片水印)* @param watermark     水印* @param font          字体* @param color         颜色*/public static void addPPTWatermark(String inputPath, String targetpath, Integer watermarkType, String watermark,Font font, Color color) {XMLSlideShow slideShow = null;try {slideShow = new XMLSlideShow(new FileInputStream(inputPath));} catch (IOException e) {log.error("addPPTWatermark fail:", e);throw new RuntimeException("addPPTWatermark fail: 获取PPT文件失败");}ByteArrayOutputStream os = null;FileOutputStream out = null;try {//获取水印os = getWatermarkImage(watermarkType, watermark, font, color, 1280, 720);PictureData pictureData = slideShow.addPicture(os.toByteArray(), PictureData.PictureType.PNG);for (XSLFSlideMaster xslfSlideMaster : slideShow.getSlideMasters()) {XSLFPictureShape pictureShape = xslfSlideMaster.createPicture(pictureData);
//                pictureShape.setAnchor(new java.awt.Rectangle(0, 0, -1 , -1));pictureShape.setAnchor(pictureShape.getAnchor());}out = new FileOutputStream(targetpath);slideShow.write(out);} catch (IOException e) {log.error("addPPTWatermark fail:" + e);throw new RuntimeException("addPPTWatermark fail: 生成ppt文件失败");} finally {if (slideShow != null) {try {slideShow.close();} catch (IOException e) {e.printStackTrace();}}if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}/*** excel 添加水印** @param inputPath     原excel地址* @param outPath       新excel地址* @param watermarkType 水印类型:1:文本水印;2:图片水印;* @param watermark     水印(文字或图片URL)* @param font          字体* @param color         颜色*/public static void addExcelWatermark(String inputPath, String outPath, Integer watermarkType, String watermark,Font font, Color color) {//读取excel文件XSSFWorkbook workbook = null;try {workbook = new XSSFWorkbook(new FileInputStream(inputPath));} catch (FileNotFoundException e) {log.error("addExcelWaterMark fail: 源文件不存在", e);throw new RuntimeException("addExcelWaterMark fail: 源文件不存在");} catch (IOException e) {log.error("addExcelWaterMark fail: 读取源文件IO异常", e);throw new RuntimeException("addExcelWaterMark fail: 读取源文件IO异常");}OutputStream fos = null;ByteArrayOutputStream os = new ByteArrayOutputStream();try {//获取水印os = getWatermarkImage(watermarkType, watermark, font, color, 1000, 800);int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);// 获取每个Sheet表for (int i = 0; i < workbook.getNumberOfSheets(); i++) {XSSFSheet xssfSheet = workbook.getSheetAt(i);String rID =xssfSheet.addRelation(null, XSSFRelation.IMAGES, workbook.getAllPictures().get(pictureIdx)).getRelationship().getId();xssfSheet.getCTWorksheet().addNewPicture().setId(rID);}// Excel文件生成后存储的位置。File file = new File(outPath);fos = new FileOutputStream(file);workbook.write(fos);} catch (Exception e) {log.error("addExcelWaterMark fail: 创建输出文件IO异常", e);throw new RuntimeException("addExcelWaterMark fail: 创建输出文件IO异常");} finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (workbook != null) {try {workbook.close();} catch (IOException e) {e.printStackTrace();}}}}/*** word 添加文字水印** @param inputPath      原文件地址* @param outPath        新文件地址* @param watermark      水印文字* @param watermarkColor 水印字体颜色* @param incline        是否倾斜(true 倾斜,false 不倾斜)* @param readable       是否设置仅可读(true 仅可读,false 可编辑)*/public static void addWordWatermark(String inputPath, String outPath, String watermark, String watermarkColor,Boolean incline, Boolean readable) {// 根据URL 获取 XWPFDocument 对象XWPFDocument xwpfDocument = null;try {xwpfDocument = new XWPFDocument(new FileInputStream(new File(inputPath)));} catch (FileNotFoundException fileNotFoundException) {log.error("addWordWaterMark fail: ", fileNotFoundException);throw new RuntimeException("addWordWaterMark fail: 源文件不存在");} catch (IOException ioException) {log.error("addWordWaterMark fail: ", ioException);throw new RuntimeException("addWordWaterMark fail: 读取源文件IO异常");} catch (Exception exception) {log.error("addWordWaterMark fail: ", exception);throw new RuntimeException("addWordWaterMark fail: 不支持的文档格式");}XWPFHeaderFooterPolicy headerFooterPolicy = xwpfDocument.getHeaderFooterPolicy();if (headerFooterPolicy == null) {//兼容处理headerFooterPolicy = xwpfDocument.createHeaderFooterPolicy();}//调用API添加水印,效果不好为水平居中headerFooterPolicy.createWatermark(watermark);//处理后续文档更新水印逻辑XWPFHeader xwpfHeader = headerFooterPolicy.getHeader(XWPFHeaderFooterPolicy.DEFAULT);XWPFParagraph xwpfParagraph = xwpfHeader.getParagraphArray(0);//设置水印样式和位置,保持倾斜角度更好看和实用xwpfParagraph.getCTP().newCursor();XmlObject[] xmlobjects = xwpfParagraph.getCTP().getRArray(0).getPictArray(0).selectChildren(new QName("urn:schemas-microsoft-com:vml", "shape"));if (xmlobjects.length > 0) {CTShape ctshape = (CTShape) xmlobjects[0];// 水印字体颜色ctshape.setFillcolor(watermarkColor);// 水印是否倾斜if (incline) {ctshape.setStyle(ctshape.getStyle() + ";rotation:315");}}// 设置文档只读if (readable) {xwpfDocument.enforceReadonlyProtection();}File file = new File(outPath);if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {log.error("addWordWaterMark fail: 创建输出文件IO异常", e);throw new RuntimeException("addWordWaterMark fail: 创建输出文件失败");}}try {xwpfDocument.write(new FileOutputStream(outPath));} catch (FileNotFoundException e) {log.error("addWordWaterMark fail: 输出文件不存在", e);throw new RuntimeException("addWordWaterMark fail: 创建输出文件失败");} catch (IOException e) {log.error("addWordWaterMark fail: ", e);throw new RuntimeException("addWordWaterMark fail");} finally {if (xwpfDocument != null) {try {xwpfDocument.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 获取水印图片文件流** @param watermarkType 水印类型(1:文字水印;2:图片水印)* @param watermark     水印* @param font          字体* @param color         颜色* @param width         图片宽* @param height        图片高* @return*/private static ByteArrayOutputStream getWatermarkImage(Integer watermarkType, String watermark, Font font,Color color, Integer width, Integer height) {ByteArrayOutputStream os = new ByteArrayOutputStream();try {// 导出到字节流BBufferedImage bufferedImage = null;if (WatermarkTypeEnum.TEXT_WATERMARK.getCode().equals(watermarkType)) {bufferedImage = createWaterMarkImageBig(watermark, font, color, width, height);} else {// 图片水印bufferedImage = ImageUtil.readPicture(watermark);}ImageIO.write(bufferedImage, "png", os);} catch (IOException e) {log.error("testToImage fail: 创建水印图片IO异常", e);throw new RuntimeException("testToImage fail: 创建水印图片IO异常");}return os;}/*** 根据文字生成水印图片(大号 平铺)** @param text  文本文字* @param font  字体* @param color 颜色* @return*/public static BufferedImage createWaterMarkImageBig(String text, Font font, Color color, Integer width,Integer height) {// 获取bufferedImage对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g2d = image.createGraphics();image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);g2d.dispose();g2d = image.createGraphics();//设置字体颜色和透明度g2d.setColor(color);//设置字体g2d.setStroke(new BasicStroke(1));//设置字体类型  加粗 大小g2d.setFont(font);//设置倾斜度g2d.rotate(Math.toRadians(-30), (double) image.getWidth() / 2, (double) image.getHeight() / 2);FontRenderContext context = g2d.getFontRenderContext();Rectangle2D bounds = font.getStringBounds(text, context);double x = (width - bounds.getWidth()) / 2;double y = (height - bounds.getHeight()) / 2;double ascent = -bounds.getY();double baseY = y + ascent;//写入水印文字原定高度过小,所以累计写水印,增加高度g2d.drawString(text, (int) x, (int) baseY);//设置透明度g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));//释放对象g2d.dispose();return image;}}

三、效果展示

3.1,word 水印

3.2,excel 水印

3.2.1,文字水印

3.2.2,图片水印

3.3,ppt 水印

3.3.1,文字水印

3.3.2,图片水印

3.4,PDF 水印

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MeterSphere实战(一)

MeterSphere是一位朋友讲到的测试平台&#xff0c;说这东西是开源的&#xff0c;因为我是做测试的&#xff0c;很乐意了解一些新鲜事物。在我看来&#xff0c;测试就是要专注一些领域&#xff0c;然后要啥都会一点点&#xff0c;接着融会贯通起来&#xff0c;这样就可以万变不离…

C语言--不使用库函数,把一个数字转为字符串【详细解释】

一.题目描述 输入一个数字&#xff0c;把他转为字符串 比如&#xff1a;输入数字&#xff1a;12345 输出&#xff1a;12345&#xff08;这里的12345是字符串12345&#xff09; 二.思路分析 比如给定一个数字12345&#xff0c;先把它转为字符54321&#xff08;“54321”&#…

线程互斥与同步

用户级线程 内核的LWP Linux线程 OS概念中经常说的 用户级线程 和 内核级线程 也就是线程实现真的是在OS内部实现&#xff0c;还是应用层或用户层实现 很明显Linux是属于用户级线程 用户级执行流&#xff08;用户级线程&#xff09; &#xff1a;内核lwp 1 : 1 也有1&…

骁龙8 Gen 3 vs A17 Pro

骁龙8 Gen 3 vs A17 Pro——谁会更胜一筹&#xff1f; Geekbench、AnTuTu 和 3DMark 等基准测试在智能手机领域发挥着至关重要的作用。它们为制造商和手机爱好者提供了设备性能的客观衡量标准。这些测试有助于评估难以测量的无形方面。然而&#xff0c;值得注意的是&#xff0c…

骚操作:NanoDrop测蛋白浓度

​大家好&#xff0c;最近实验室的BCA仪器坏了&#xff0c;偶然发现nanodrop也可以测蛋白浓度&#xff0c;省不少时间&#xff01;本方法原理是&#xff1a;紫外吸收 友情提示&#xff1a;由于表格的存在&#xff0c;用电脑看本推文&#xff0c;效果更好 紫外吸收法 较为灵…

31条PCB设计布线技巧:

大家在做PCB设计时&#xff0c;都会发现布线这个环节必不可少&#xff0c;而且布线的合理性&#xff0c;也决定了PCB的美观度和其生产成本的高低&#xff0c;同时还能体现出电路性能和散热性能的好坏&#xff0c;以及是否可以让器件的性能达到最优等。 本篇内容&#xff0c;将…

分布式锁实现方案 - Lock4j 使用

一、Lock4j 分布式锁工具 你是不是在使用分布式锁的时候&#xff0c;还在自己用 AOP 封装框架&#xff1f;那么 Lock4j 你可以考虑一下。 Lock4j 是一个分布式锁组件&#xff0c;其提供了多种不同的支持以满足不同性能和环境的需求。 立志打造一个简单但富有内涵的分布式锁组…

Redis分布式缓存超详细总结!

文章目录 前言一、Redis持久化解决数据丢失问题1.RDB&#xff08;Redis Database Backup file&#xff09;持久化&#xff08;1&#xff09;执行RDB&#xff08;2&#xff09;RDB方式bgsave的基本流程&#xff08;3&#xff09;RDB会在什么时候执行&#xff1f;save 60 1000代表…

VBA信息获取与处理:在EXCEL中随机函数的利用

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

计算机网络(三) | 数据链路层 PPP协议、广播CSMA/CD协议、集线器、交换器、扩展and高速以太网

文章目录 1 数据链路基本概念和问题1.1 基本概念1.2 基本问题&#xff08;1&#xff09;封装成帧&#xff08;2&#xff09;透明传输&#xff08;3&#xff09;差错控制 2.数据链路层协议2.1 点对点 PPP协议2.1.1 需要实现的2.1.2 PPP组成2.1.3 帧格式2.1.4 工作流程 2.2 广播 …

内网穿透的应用-如何结合Cpolar内网穿透工具实现在IDEA中远程访问家里或者公司的数据库

文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具&#xff0c;在开发过程中需要经常用到数据库&#xff0c;如Mysql数据库&#xff0c;但是在IDEA中只能连接本…

配置BFD多跳检测示例

BFD简介 定义 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网…

【链表Linked List】力扣-117 填充每个节点的下一个右侧节点指针II

目录 问题描述 解题过程 官方题解 问题描述 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 N…

C++中字符串详解

在C语言中只能通过字符串数组来模拟字符串&#xff0c;没有字符串类型。在C引入了string类来表示字符串类型。从而用它定义字符串。 在C语言中&#xff1a; char str[] "abc"; char str[] {a&#xff0c;b,c,\0}; char* str "abc"; //这三种形式是C语言…

因为高考考砸了,我学了计算机

2015年&#xff0c;是我高中的最后一年。 2023年&#xff0c;我已在计算机领域工作十多个年头。 我出生在东部省份的一个不沿海小县城&#xff0c;在那里度过了我高考前的17年。起点平平&#xff0c;没有任何特长傍身&#xff0c;也可以说是毫无亮点&#xff1b;成绩中等&#…

中文语音标注工具FunASR(语音识别)

全称 A Fundamental End-to-End Speech Recognition Toolkit&#xff08;一个语音识别工具&#xff09; 可能大家用过whisper&#xff08;openAi&#xff09;&#xff0c;它【标注英语的确很完美】&#xff0c;【但中文会出现标注错误】或搞了个没说的词替换上去&#xff0c;所…

APP备案,最新获取安卓签名文件中MD5等信息方法

1.通过签名文件获取SHA1和SHA256 直接通过cmd执行命令 keytool -list -v -keystore xxxxx/xxx/xx/xxx.keystore输入后回车会提示输入密码库口令&#xff0c;直接输入Keystore密码&#xff08;输入过程中终端上不会显示&#xff0c;输完回车就行&#xff09; 2.获取md5 由于…

redis集群(cluster)笔记

1. 定义&#xff1a; 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序…

IDEA启动失败报错解决思路

IDEA启动失败报错解决思路 背景&#xff1a;在IDEA里安装插件失败&#xff0c;重启后直接进不去了&#xff0c;然后分析问题解决问题的过程记录下来。方便下次遇到快速解决。也是一种解决问题的思路&#xff0c;分享出去。 启动报错信息 Internal error. Please refer to https…

ke14--10章-1数据库JDBC介绍

注册数据库(两种方式),获取连接,通过Connection对象获取Statement对象,使用Statement执行SQL语句。操作ResultSet结果集 ,回收数据库资源. 需要语句: 1Class.forName("DriverName");2Connection conn DriverManager.getConnection(String url, String user, String…