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

Java实现自动化pdf打水印小项目 使用技术pdfbox、Documents4j

文章目录

  • 前言
  • 源码获取
  • 一、需求说明
  • 二、 调研
    • pdf处理工具
    • word处理工具
  • 三、技术栈选择
  • 四、功能实现
    • 实现效果
    • 详细功能介绍
    • 详细代码实现
      • 项目目录
      • WordUtils
      • Main类实现部分:第一部分
      • Main类实现部分:第二部分
      • Main类实现部分:第三部分
  • 资料获取

前言

博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。

博主所有博客文件目录索引:博客目录索引(持续更新)

视频平台:b站-Coder长路


源码获取

项目源码:Gitee、Github

本篇文档的视频系列讲解:Java实现自动化pdf打水印工具 开源PDF工具PDFBoxWord、Word转PDF开源工具Documents4j


一、需求说明

背景:做默默学代理需要去给每日日日练打上水印,对于重复性操作pdf编辑统一通过程序来批量处理。

目标:实现一个自定义的pdf水印工具。

第一部分:word转pdf

第二部分:pdf编辑

页眉:咨询专转本默默学课程联系官方报名处QQ:3503851091,更多资料可加群828303961
页脚:江苏专转本公众号:专转本智慧树
水印:江苏专转本网课报名vx:mmxchanglu属性:旋转45°,不透明度30%
右上角图片:专转本咨询群二维码.jpg属性:缩小比例30%

二、 调研

pdf处理工具

开源项目-pdfbox:

  • 官方网站:https://pdfbox.apache.org/

x-easypdf:国内开发,基于pdfbox。

Stirling-PDF:一款优秀的开源PDF处理工具:Stirling-PDF(Github)

  • 引用开源工具:org.apache.pdfbox

ttf文件:

  • 阿里巴巴普惠体:https://www.iconfont.cn/fonts/

word处理工具

word相关开源工具如下:

  1. Apache POI:
    • Apache POI 是一个 Java 库,可以用于处理 Microsoft Office 文档,包括 Word 文档。您可以使用 Apache POI 来读取 Word 文档并将其转换为 PDF。需要注意的是,Apache POI 主要用于读取和编辑 Word 文档,转换为 PDF 需要额外的步骤。
  2. iText:
    • iText 是一个流行的 Java 库,用于处理 PDF 文档。它可以用于将 Word 文档转换为 PDF。请注意,iText 并不是完全开源的,它有一些限制,具体取决于您的使用情况。
  3. LibreOffice:
    • LibreOffice 是一个开源办公套件,包括一个强大的文档编辑器。您可以使用 LibreOffice 的命令行接口(soffice)来将 Word 文档转换为 PDF。LibreOffice 在许多平台上都可用,并且支持多种文档格式的转换。
  4. Pandoc:
    • Pandoc 是一个通用文档转换工具,支持多种输入和输出格式。它可以将 Word 文档转换为 PDF,同时还支持许多其他文档格式。Pandoc 使用命令行进行操作。

实际选择:Documents4j

	Documents4j 是一个开源的 Java 库,用于在 Java 应用程序中进行 Microsoft Office 文档(如 Word、Excel、PowerPoint 等)的转换。它利用 Microsoft Office 的本机 API,通过启动 Microsoft Office 进程来执行文档转换。Documents4j 提供了一种简单的方式来将 Office 文档转换为其他格式,例如将 Word 文档转换为 PDF、将 Excel 表格转换为 CSV 等。Documents4j 的工作原理是通过将 Microsoft Office 作为外部进程启动,并与其进行通信来执行文档转换任务。这种方法使得可以利用 Microsoft Office 的强大功能来执行文档转换,同时又能够在 Java 环境中方便地进行集成和控制。Documents4j 提供了一个简单的 API,使得在 Java 应用程序中执行文档转换变得简单。它支持多线程操作,并且具有一定的性能优化,使得可以高效地处理大量文档转换任务。

相关实际案例:

  1. 不要在去充VIP啦 ,Java 实现 PDF、Word 互转:公众号 WeDayDayUp ,发送 案例 即可,gitee地址,https://gitee.com/HelloWangXianLin/xiaoxiao-demo

三、技术栈选择

语言选择:Java

pdf水印、编辑开源工具:pdfbox

word转pdf:Documents4j


四、功能实现

实现效果

实现功能效果:最终得到的是已经打上广告以及水印的pdf文件

image-20240215121714140

代码运行效果:

image-20240215121533848


详细功能介绍

实现思路如下

1、给定一个目录,检索该目录下所有文件,筛选出所有的docx以及PDF文件。

2、将目录下docx文件转为pdf文件,并将docx文件统一剪切到tmp目录。

3、对所有的pdf文件来进行最定义【水印+广告】处理,将所有水印处理过的pdf文件统一输出到pdf目录。【其中文件名包含有如:高数,最终输出的名字转为 2024.2.15高数日日练及答案】

页眉:咨询专转本默默学课程联系官方报名处QQ:3503851091,更多资料可加群828303961
页脚:江苏专转本公众号:专转本智慧树
水印:江苏专转本网课报名vx:mmxchanglu属性:旋转45°,不透明度30%
右上角图片:专转本咨询群二维码.jpg属性:缩小比例30%

pdf中水印增加的效果:主要就是这四个部分

image-20240215121938960


详细代码实现

项目目录

image-20240215120327526

WordUtils:word转pdf工具类
Main:任务类
images/:水印素材图片
ttfs/:ttf字体

WordUtils

package com.changlu.utils;import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import java.io.*;public class WordUtils {/*** Word转PDF* @param filePath 源docx文件目录及名称  示例:C:\Users\93997\Desktop\watermark tools\watermarkTools\src\main\resources\2024-2-8计算机.docx* @param outFilePath 输出文件目录及名称 示例:C:\Users\93997\Desktop\watermark tools\watermarkTools\src\main\resources\2024-2-8.pdf*/public static void wordToPdf(String filePath, String outFilePath) {//源文件地址File inputWord = new File(filePath);//导出文件地址File outputFile = new File(outFilePath);InputStream doc = null;OutputStream outputStream = null;try {doc = new FileInputStream(inputWord);outputStream = new FileOutputStream(outputFile);IConverter converter = LocalConverter.builder().build();//转换docx=>pdfboolean flag = converter.convert(doc).as(DocumentType.DOC).to(outputStream).as(DocumentType.PDF).execute();if (flag) {converter.shutDown();}doc.close();outputStream.close();System.out.println("文件名:" + outFilePath + " 转换成功!");} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {String filePath = "C:\\Users\\93997\\Desktop\\watermark tools\\watermarkTools\\src\\main\\resources\\2024-2-8计算机.docx";String outFilePath = "C:\\Users\\93997\\Desktop\\watermark tools\\watermarkTools\\src\\main\\resources\\2024-2-8.pdf";//word转pdfWordUtils.wordToPdf(filePath, outFilePath);}}

Main类实现部分:第一部分

功能描述:给定一个目录,检索该目录下所有文件,筛选出所有的docx以及PDF文件。

package com.changlu;import com.changlu.utils.WordUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Description:* @Author: changlu* @Date: 11:19 AM*/
public class Main {//处理文件目录private static String directoryPath = "C:\\Users\\93997\\Desktop\\日日练";public static void main(String[] args) {//任务1:给定一个目录,检索该目录下所有文件,筛选出所有的docx以及PDF文件。File directory = new File(directoryPath);//搜集所有的docx文档List<String> waitWorkDocs = new ArrayList<>();//搜集所有的pdf名称List<String> waitWorkPDFs = new ArrayList<>();//遍历目录下所有的文件for (File file : directory.listFiles()) {//筛选不是目录if (!file.isDirectory()) {if (file.getName().endsWith(".docx")) {//添加docx的文件名waitWorkDocs.add(file.getName());}else if (file.getName().endsWith(".pdf")) {waitWorkPDFs.add(file.getName());}}}   }
}

Main类实现部分:第二部分

功能描述:将目录下docx文件转为pdf文件,并将docx文件统一剪切到tmp目录。

/*** @Description:* @Author: changlu* @Date: 11:19 AM*/
public class Main {//处理文件目录private static String directoryPath = "C:\\Users\\93997\\Desktop\\日日练";private static String docxDirectoryPath = "tmp";//docs临时存放目录public static void main(String[] args) {//任务1:xxx//任务2:将目录下docx文件转为pdf文件,并将docx文件统一剪切到tmp目录。System.out.println("开始执行word转pdf任务...");//临时存放docx文件的目录 tmp,若是不存在创建String targetTmpDirectory = directoryPath + File.separator + docxDirectoryPath;if (!Files.exists(Paths.get(targetTmpDirectory))) {new File(targetTmpDirectory).mkdirs();}//将所有的docx进行转换,word转pdffor (String docxName : waitWorkDocs) {String originPath = directoryPath + File.separator + docxName;String targetPath = originPath.replace(".docx", ".pdf");//docx转为pdf文件WordUtils.wordToPdf(originPath, targetPath);//将docx剪切到tmp文件String targetTmpPath = targetTmpDirectory + File.separator + docxName;try {Files.move(Paths.get(originPath), Paths.get(targetTmpPath));} catch (IOException e) {e.printStackTrace();}//添加pdf名称到pdf集合中String pdfName = targetPath.substring(targetPath.lastIndexOf(File.separator) + 1);waitWorkPDFs.add(pdfName);}}
}

Main类实现部分:第三部分

/*** @Description:* @Author: changlu* @Date: 11:19 AM*/
public class Main {//处理文件目录private static String directoryPath = "C:\\Users\\93997\\Desktop\\日日练";private static String docxDirectoryPath = "tmp";//docs临时存放目录public static void main(String[] args) {//任务1:xxx//任务2:xxx//任务3:对所有的pdf文件来进行最定义【水印+广告】处理,将所有水印处理过的pdf文件统一输出到pdf目录。System.out.println();System.out.println("开始处理pdf打水印、广告任务....");//临时存放docx文件的目录 tmp,若是不存在创建String targetPDFDirectory = directoryPath + File.separator + pdfDirectoryPath;if (!Files.exists(Paths.get(targetPDFDirectory))) {new File(targetPDFDirectory).mkdirs();}//遍历所有的pdf文件来去添加水印及其他任务并输出pdffor (String waitWorkPDFName : waitWorkPDFs) {String originPDFPath = directoryPath + File.separator + waitWorkPDFName;String targetPDFPath = targetPDFDirectory + File.separator + fileNameTransfer(waitWorkPDFName);//执行真正的水印+广告任务try {work(originPDFPath, targetPDFPath);} catch (Exception e) {e.printStackTrace();}}}//根据当前文件名称来匹配相应的文件名称public static String fileNameTransfer(String originName) {for (Map.Entry<String, String> entry : subjectNamesMap.entrySet()) {String name = entry.getKey();//若是当前名称中包含有科目名称if (originName.contains(name)) {return entry.getValue();}}return "未知" + System.currentTimeMillis() + ".pdf";}/*** 实际水印处理任务*/public static void work(String originPDFPath, String targetPDFPath) throws Exception{//读取resources目录下input.pdf文件
//        InputStream is = Main.class.getClassLoader().getResourceAsStream("input.pdf");InputStream is = new FileInputStream(originPDFPath);PDDocument pdDocument = PDDocument.load(is);//自定义字体 C:\Users\93997\Desktop\watermark tools\watermarkTools\target\classes\ttfs//URLDecoder.decode() 方法来解码 URL 编码的路径,将 %20 转换回空格
//        PDType0Font font = PDType0Font.load(pdDocument, new File("C:\\Users\\93997\\Desktop\\watermark tools\\watermarkTools\\src\\main\\resources\\ttfs\\Alibaba_PuHuiTi_2.0_65_Medium_65_Medium.ttf"));String fontFile = URLDecoder.decode(Main.class.getClassLoader().getResource(File.separator + "ttfs" + File.separator + "Alibaba_PuHuiTi_2.0_65_Medium_65_Medium.ttf").getFile(), "UTF-8");PDType0Font font = PDType0Font.load(pdDocument, new File(fontFile));float fontSize = 10; // 设置字体大小为12// 设置透明度状态对象PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();graphicsState.setNonStrokingAlphaConstant(0.2f);graphicsState.setAlphaSourceFlag(true);graphicsState.setStrokingAlphaConstant(0.2f);//设置新的页眉String headerText = "咨询专转本默默学课程联系官方报名处QQ:3503851091,更多资料可加群828303961";String footerText = "江苏专转本公众号:专转本智慧树";String waterText = "江苏专转本网课报名vx:mmxchanglu";//遍历原先的pdf文档for (PDPage page : pdDocument.getPages()) {float pageWidth = page.getMediaBox().getWidth();float pageHeight = page.getMediaBox().getHeight();//计算页眉的居中位置float headerTextWidth = font.getStringWidth(headerText) / 1000 * fontSize;float headerCenteredX = (pageWidth - headerTextWidth) / 2; // 计算水平居中位置//计算页脚的居中位置float footerTextWidth = font.getStringWidth(footerText) / 1000 * fontSize;float footerCenteredX = (pageWidth - footerTextWidth) / 2; // 计算水平居中位置// 创建用于页眉的内容流PDPageContentStream headerContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);headerContentStream.beginText(); // 开始文本操作headerContentStream.setFont(font, fontSize); // 设置字体和字号headerContentStream.newLineAtOffset(headerCenteredX, page.getMediaBox().getHeight() - 30); // 设置文本起始位置headerContentStream.showText(headerText); // 绘制页眉内容headerContentStream.endText(); // 结束文本操作headerContentStream.close(); // 关闭内容流// 添加页脚PDPageContentStream footerContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);footerContentStream.beginText(); // 开始文本操作footerContentStream.setFont(font, fontSize); // 设置字体和字号footerContentStream.newLineAtOffset(footerCenteredX, 30); // 设置文本起始位置footerContentStream.showText(footerText); // 绘制页脚内容footerContentStream.endText(); // 结束文本操作footerContentStream.close(); // 关闭内容流//添加水印   要求:旋转45°,不透明度30%float waterTextWidth = font.getStringWidth(waterText) / 1000 * 30;float waterCenteredX = (pageWidth - waterTextWidth) / 2;float waterCenteredY = pageHeight / 2;//创建一个水印内容流PDPageContentStream waterContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);waterContentStream.beginText();waterContentStream.setFont(font, 30);// 设置不透明度waterContentStream.setNonStrokingColor(0, 0, 0); // black colorwaterContentStream.setStrokingColor(0, 0, 0); // black colorwaterContentStream.setGraphicsStateParameters(graphicsState);//设置透明度//设置旋转文本 45° 对于tx、ty是以左下角为偏移位置中心来进行旋转角度waterContentStream.setTextRotation(Math.toRadians(45), 400, -50);//设置文本waterContentStream.newLineAtOffset(waterCenteredX, waterCenteredY);waterContentStream.showText(waterText);waterContentStream.endText();waterContentStream.close();//添加图片水印//创建一个水印内容流PDPageContentStream imageContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);// 创建图像对象
//            PDImageXObject image = PDImageXObject.createFromFile("C:\\Users\\93997\\Desktop\\watermark tools\\watermarkTools\\src\\main\\resources\\images\\ConsultationGroupQRCode.jpg", pdDocument);String pictureFile = URLDecoder.decode(Main.class.getClassLoader().getResource(File.separator + "images" + File.separator + "ConsultationGroupQRCode.jpg").getFile(), "UTF-8");PDImageXObject image = PDImageXObject.createFromFile(pictureFile, pdDocument);// 计算图像的宽度和高度(缩小比例为0.3)float imageWidth = (float) (image.getWidth() * 0.25);float imageHeight = (float) (image.getHeight() * 0.25);//具体图片位置float imageX = pageWidth - imageWidth - 10;float imageY = pageHeight - imageHeight - 10;// 在指定位置绘制图像imageContentStream.drawImage(image, imageX, imageY, imageWidth, imageHeight);imageContentStream.close();}//目标目录
//        File outputFile = new File("C:\\Users\\93997\\Desktop\\watermark tools\\watermarkTools\\src\\main\\resources\\output.pdf");File outputFile = new File(targetPDFPath);// 若是文件存在先进行删除Files.deleteIfExists(Paths.get(outputFile.toURI()));// 保存修改后的文档pdDocument.save(outputFile);System.out.println("转换任务:" + originPDFPath + "=>" + targetPDFPath + " 成功!");// 关闭文档pdDocument.close(); // 关闭文档}
}

资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

  • 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
  • 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
  • 学习与生活-专栏:可以了解博主的学习历程
  • 算法专栏:算法收录

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅


整理者:长路 时间:2024.2.16

相关文章:

Java实现自动化pdf打水印小项目 使用技术pdfbox、Documents4j

文章目录 前言源码获取一、需求说明二、 调研pdf处理工具word处理工具 三、技术栈选择四、功能实现实现效果详细功能介绍详细代码实现项目目录WordUtilsMain类实现部分&#xff1a;第一部分Main类实现部分&#xff1a;第二部分Main类实现部分&#xff1a;第三部分 资料获取 前言…...

hive load data未正确读取到日期

1.源数据CSV文件日期字段值&#xff1a; 2.hive DDL语句&#xff1a; CREATE EXTERNAL TABLE test.textfile_table1(id int COMMENT ????, name string COMMENT ??, gender string COMMENT ??, birthday date COMMENT ????,.......) ROW FORMAT SERDE org.apache.…...

C++ 遍历map的3中方法

方法1 #include <iostream> #include <string> #include <map> using namespace std;int main() {map<string, string> nameList {{"张三丰", "武当山"},{"张无忌", "光明顶"},{"张二蛋", "…...

redis 主从模式,sentinel 模式配置

编辑 sentinel.xml 和 redis.conf redis.conf 中核心是配置 bind 192.168.64.144 daemonize yes protected-mode no dbfilename redis-6379.rdb #默认dump.rdb replica-read-only yes # 自动2.6副本默认只读&#xff0c;也就是slave只有只读权限 replicationOf myapplicat…...

小型医院医疗设备管理系统|基于springboot小型医院医疗设备管理系统设计与实现(源码+数据库+文档)

小型医院医疗设备管理系统目录 目录 基于springboot小型医院医疗设备管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、职员信息管理 2、设备信息管理 3、库房信息管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、…...

CSS学习(三)

目录&#xff1a; 1. CSS引入方式 1.1 三种样式表 1.2 内部样式表&#xff08;嵌入式引入&#xff09; 1.3 行内样式表&#xff08;内联样式表&#xff09; 1.4 外部样式表 1.5 总结 1. CSS引入方式 1.1 三种样式表 1.2 内部样式表&#xff08;嵌入式引入&#xff09; …...

CentOS7安装InfluxDB2简易教程

InfluxDB是一个开源的时间序列数据库&#xff0c;它专门用于处理大规模的时间序列数据。时间序列数据是在特定时间点上收集的数据&#xff0c;例如传感器数据、监控数据、应用程序日志等。 InfluxDB设计用于高效地存储、查询和分析大量的时间序列数据。它具有高性能、可扩展性和…...

数据库:信息存储与管理的关键

数据库&#xff1a;信息存储与管理的关键 数据库是现代信息系统中不可或缺的组成部分&#xff0c;它承担着存储、管理和检索数据的重要任务。本文将详细介绍数据库的定义、分类、作用以及特点。 1. 数据库的介绍 数据库是一个有组织的数据集合&#xff0c;用于存储和管理大量…...

极智芯 | 解读NVIDIA RTX5090 又是一波被禁售的节奏

欢迎关注我的公众号「极智视界」,获取我的更多技术分享 大家好,我是极智视界,本文分享一下 解读NVIDIA RTX5090 又是一波被禁售的节奏。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 按 NVIDIA GPU …...

rtt的io设备框架面向对象学习-硬件rtc设备

目录 1.硬件rtc设备基类2.硬件rtc设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 硬件rtc和软件rtc设备是互斥的。因为它们的名字都叫"rtc"&#xff0c;在对象容器中不允许重名。 1.硬件rtc设备基类 此层处于设备驱…...

产品经理学习-产品运营《流程管理》

如何进行流程管理 信息可视化 甘特图-流程管理思维导图-方案讨论原型图-活动文档 明确责任制 分工明确&#xff0c;关键环境有主负责人通过时间倒推督促管理 沟通技巧 明确共同利益以结果激励做好信息同步 如何进行监控活动效果 监控活动的效果是要监控数据 活动每个环境的…...

压缩感知——革新数据采集的科学魔法

引言&#xff1a; 在数字时代&#xff0c;数据以及数据的收集和处理无处不在。压缩感知(Compressed Sensing, CS)是一种新兴的数学框架&#xff0c;它挑战了我们传统上对数据采集和压缩的看法&#xff0c;给医学图像、天文观测、环境监测等领域带来了颠覆性的影响。但到底什么…...

华为配置直连三层组网直接转发示例

华为配置直连三层组网直接转发示例 组网图形 图1 配置直连三层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff…...

MCAL知识点(二十八):TC275如何通过EB-Tresos配置实现硬件触发ADC同步采样(电机控制器三相电流同步采样)

目录 1、概述 2、实现目标 3、EB-Tresos配置 3.1、AdcGeneral 3.2、AdcGlobInputClass 3.3、AdcHwUnit_X...

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计&#xff0c;比7.8版本方便多了&#xff0c;有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包&#xff0c;解压如下&#xff0c;右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…...

ACP科普:敏捷开发之kanban

Q1: Kanban是什么&#xff1f; A1:敏捷开发中的Kanban是一种项目管理方法&#xff0c;其核心理念是通过可视化管理来提高生产效率和任务交付速度。Kanban来自日本&#xff0c;意为“看板”&#xff0c;最初是由丰田汽车公司引入生产线上的生产控制系统&#xff0c;后来被引入到…...

代理模式(Proxy模式)

所谓的代理&#xff0c;就是一个人或者一个机构代替另一个人或者另一个机构去做一些事情&#xff08;类似于中介或者代理商&#xff09;。 代理的种类 远程代理&#xff1a;为一个位于不同的地址空间的对象提供一个局域代表对象。 虚拟代理&#xff1a;根据需要创建一个资源消…...

Android使用shape定义带渐变色的背景

在drawable目录下创建文件bg_gradient.xml 文件内的内容如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape android:shape"rectangle" xmlns:android"http://schemas.android.com/apk/res/android"> <…...

轻松搞定Makefile

编译&#xff1a;将源文件(.cpp)编译生成目标文件(.o) gcc -c main.cpp -o main.o 链接&#xff1a;将目标文件(.o)生成可执行文件 gcc main.o -o main 合并&#xff1a; gcc main.cpp -o main -lstdc -I 指定头文件目录 -L 指定库文件依赖路径 -l 指明库文件名 查看版本 m…...

【C++之类和对象篇002】

C学习笔记---005 C知识类和对象篇1、类的6个默认成员函数2、构造函数2.1、构造函数的特性2.2、内置类型和自定义类型2.3、什么是默认构造函数&#xff1f; 3、析构函数3.1、什么是析构函数&#xff1f;3.2、析构函数的特性3.3、析构函数的释放顺序 4、拷贝构造函数4.1、什么是拷…...

k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(三)

3.19.切换RKE用户&#xff0c;并做免密登录&#xff08;三台机器相互免密&#xff09; su rke cd~ ssh-keygen[rkemaster.ssh]$ssh-copy-id rkeslaver2 [rkemaster.ssh]$ssh-copy-id rkeslaver1 [rkemaster.ssh]$ssh-copy-id rkemaster3.20.搭建RKE集群 为了方便理解&#…...

基于SSM的疫情期间学生信息管理平台的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的疫情期间学生信息管理平台的设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…...

LeetCode_20_简单_有效的括号

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 栈 1. 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型…...

gRPC 备查

简介 HTTP/2 HTTP/2 的三个概念 架构 使用流程 gRPC 的接口类型 1.单一RPC 2.服务器流式RPC 3.客户端式流式RPC 4.双向流式RPC...

MySQL 基础知识(十)之 MySQL 架构

目录 1 MySQL 架构说明 2 连接层 3 核心业务层 3.1 查询缓存 3.2 解析器 3.3 优化器 3.4 执行器 4 存储引擎层 5 参考文档 1 MySQL 架构说明 下图是 MySQL 5.7 及其之前版本的逻辑架构示意图 MySQL 架构大致可分为以下三层&#xff1a; 连接层&#xff1a;负责跟客户…...

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型

专属领域论文订阅 VX关注{晓理紫},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起免费为300名读者提供订阅主题论文服务,只需VX关注公号并回复{邮箱+论文主题}(如…...

Delphi v11 安卓权限申请

问题 Delphi 10.4 的安卓权限申请代码&#xff0c;在 Delphi 11 下面编译无法通过。 原因 原因是里面有几个变量类型的定义有所不同。 procedure TDmBLE.RequestPermissionsResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TAr…...

频谱仿真平台HTZ Communications为私有5G建设铺平道路

韩国的国家监管机构韩国通信委员会&#xff08;KCA&#xff09;计划在德思特频谱仿真平台HTZ Communications的支持下加快扩大无线电接入范围&#xff0c;提升全国电信服务的质量和效率。 韩国通信委员会&#xff08;KCA&#xff09;在韩国的监管环境中扮演着至关重要的角色&am…...

【高效开发工具系列】PyCharm使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

进程终止与进程等待

fork 函数 fork 函数是 Linux 中一个非常重要的函数&#xff0c;它的作用是从已存在的进程中创建一个新进程。这个新进程就是当前进程的子进程。 fork() 函数使用方法&#xff1a;它在头文件 #include <unistd.h> 中&#xff0c;函数原型为 pid_t fork(void); 用一个…...