Java 与 LibreOffice 集成开发指南
1. 引言
Java 与 LibreOffice 的集成开发为开发者提供了一种强大的工具,用于实现文档自动化处理、文档转换、内容编辑等任务。通过 Java 调用 LibreOffice 提供的 API,可以实现跨平台的文档处理功能,满足各种业务需求。本文将详细介绍如何使用 Java 与 LibreOffice 进行集成开发,包括环境搭建、代码示例、常见问题解决等内容。
2. 环境搭建
2.1 安装 LibreOffice
在开始开发之前,需要确保系统中已安装 LibreOffice。LibreOffice 是一个开源的办公软件套件,支持多种操作系统,包括 Windows、macOS 和 Linux。可以从 LibreOffice 官方网站下载并安装适合您操作系统的版本。
2.2 配置 Java 开发环境
确保您的系统中已安装 Java 开发工具包(JDK)。可以通过访问 Oracle 官方网站 或使用 OpenJDK 来下载和安装 JDK。安装完成后,设置环境变量 JAVA_HOME
指向 JDK 的安装目录,并确保 javac
和 java
命令可以在命令行中正常使用。
2.3 配置 LibreOffice SDK
LibreOffice 提供了强大的 SDK,用于支持 Java 开发。安装 LibreOffice SDK 的步骤如下:
- 在 LibreOffice 安装目录中找到
SDK
文件夹。例如,在 Windows 系统中,路径通常为C:\Program Files\LibreOffice\program\SDK
。 - 将
SDK
文件夹中的lib
子文件夹添加到项目的类路径中。这通常可以通过在 IDE(如 IntelliJ IDEA 或 Eclipse)中配置项目的构建路径来完成。 - 确保
unoil.jar
和其他相关 JAR 文件已正确添加到项目的依赖中。
3. Java 与 LibreOffice 的基本集成
添加依赖库:在Java项目中添加LibreOffice的依赖库。可以通过以下命令添加Maven依赖:
<dependency><groupId>org.libreoffice</groupId><artifactId>libreoffice</artifactId><version>版本号</version>
</dependency>
3.1 启动 LibreOffice
在 Java 程序中启动 LibreOffice 的基本代码如下:
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.uno.XComponentContext;public class LibreOfficeStarter {public static void main(String[] args) {try {// 启动 LibreOfficeXComponentContext xContext = Bootstrap.bootstrap();System.out.println("LibreOffice started successfully.");} catch (Exception e) {e.printStackTrace();}}
}
3.2 加载和保存文档
以下代码展示了如何加载一个现有的 LibreOffice 文档,并将其保存为 PDF 格式:
import com.sun.star.beans.PropertyValue;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.XComponent;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;public class DocumentLoaderAndSaver {public static void main(String[] args) {try {// 启动 LibreOfficeXComponentContext xContext = Bootstrap.bootstrap();// 获取服务管理器com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager();// 加载文档XComponentLoader xComponentLoader = UnoRuntime.queryInterface(XComponentLoader.class,xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext));String inputFilePath = "file:///path/to/your/document.docx"; // 替换为你的文件路径String outputFilePath = "file:///path/to/save/document.pdf"; // 替换为保存路径XComponent xComponent = xComponentLoader.loadComponentFromURL(inputFilePath, "_blank", 0, new PropertyValue[0]);// 保存为 PDFPropertyValue[] properties = new PropertyValue[1];properties[0] = new PropertyValue();properties[0].Name = "FilterName";properties[0].Value = "writer_pdf_Export";xComponent.storeToURL(outputFilePath, properties);System.out.println("Document converted to PDF successfully.");} catch (Exception e) {e.printStackTrace();}}
}
3.3 创建新文档并插入内容
以下代码展示了如何创建一个新的 LibreOffice 文档,并在其中插入文本内容:
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XComponent;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XText;
import com.sun.star.text.XTextCursor;public class DocumentCreator {public static void main(String[] args) {try {// 获取 LibreOffice 的组件上下文XComponentContext xContext = UnoRuntime.createXComponentContext(null);// 获取多服务工厂XMultiServiceFactory xFactory = (XMultiServiceFactory) xContext.getServiceManager();// 获取桌面组件XDesktop xDesktop = (XDesktop) xFactory.createInstance("com.sun.star.frame.Desktop");// 创建一个新文档XComponent xComponent = xDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, null);// 获取文档XTextDocument xTextDocument = (XTextDocument) xComponent.getModel();// 获取文本XText xText = xTextDocument.getText();// 获取文本游标XTextCursor xTextCursor = xText.createTextCursor();// 写入内容xTextCursor.setString("这是一个通过 Java 创建的 LibreOffice 文档。");// 保存文档xTextDocument.store();// 关闭文档xComponent.dispose();} catch (Exception e) {e.printStackTrace();}}
}
4. 高级功能
4.1 文档转换服务
可以通过 Java 调用一个运行 LibreOffice 服务的服务器,实现文档的转换。以下是一个基于 Java 调用 LibreOffice 服务器将 PPT 转换为 PDF 的示例:
package com.litongjava.libreoffice;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class LibreOfficeClient {public static void convertToPdf(String filePath, String outputFilePath) {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpPost uploadFile = new HttpPost("http://127.0.0.1/api/ppt/pdf"); // 替换为 LibreOffice 服务器的地址File file = new File(filePath);HttpEntity multipartEntity = MultipartEntityBuilder.create().addBinaryBody("file", file, ContentType.APPLICATION_OCTET_STREAM, file.getName()).build();uploadFile.setEntity(multipartEntity);HttpResponse response = httpClient.execute(uploadFile);HttpEntity responseEntity = response.getEntity();if (responseEntity != null) {byte[] pdfBytes = EntityUtils.toByteArray(responseEntity);Files.write(Paths.get(outputFilePath), pdfBytes);System.out.println("PDF file saved to: " + outputFilePath);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String filePath = "path/to/your/presentation.pptx"; // 替换为 PPT 文件路径String outputFilePath = "path/to/save/presentation.pdf"; // 替换为保存 PDF 的路径convertToPdf(filePath, outputFilePath);}
}
4.2 使用 Apache POI 结合 LibreOffice
Apache POI 是一个流行的 Java 库,用于处理 Microsoft Office 格式的文件。虽然它主要用于处理 .docx
、.xlsx
等格式,但可以通过结合 LibreOffice 的 UNO 桥接技术,实现对 LibreOffice 文档的处理。以下是一个使用 Apache POI 创建 Word 文档的示例:
import org.apache.poi.xwpf.usermodel.*;public class LibreOfficeWithApachePOI {public static void main(String[] args) {try (XWPFDocument document = new XWPFDocument()) {XWPFParagraph paragraph = document.createParagraph();XWPFRun run = paragraph.createRun();run.setText("Hello, LibreOffice with Apache POI!");// 保存文档document.write(new FileOutputStream("example.docx"));System.out.println("Document created successfully.");} catch (IOException e) {e.printStackTrace();}}
}
4.3 使用 UNO 平台调用 LibreOffice 功能(续)
UNO 平台是一个开源的跨平台框架,用于调用 LibreOffice 的功能。通过 UNO 平台,开发者可以轻松地将 LibreOffice 集成到 Java 应用程序中。以下是一个使用 UNO 平台将文档转换为 PDF 的示例:
示例代码
import org.unoconv.Unoconv;
import org.unoconv.UnoconvBuilder;public class UnoPlatformExample {public static void main(String[] args) {try {// 创建 Unoconv 实例Unoconv unoconv = new UnoconvBuilder().build();// 调用 LibreOffice 转换命令unoconv.run("libreoffice", "--convert-to", "pdf", "--outdir", "output", "input.docx");System.out.println("Document processed successfully.");} catch (Exception e) {e.printStackTrace();}}
}
说明
Unoconv
是一个命令行工具,用于调用 LibreOffice 的转换功能。UnoconvBuilder
用于创建Unoconv
实例。run
方法用于执行具体的转换命令,其中"libreoffice"
是 LibreOffice 的命令行工具路径,"--convert-to"
指定目标格式,"--outdir"
指定输出目录,"input.docx"
是要转换的文件路径。
4.4 使用 REST API 调用 LibreOffice
除了直接使用 Java API 或 UNO 平台,还可以通过 REST API 调用 LibreOffice 的功能。这种方式特别适合在分布式系统中使用,例如通过一个独立的 LibreOffice 服务器来处理文档转换任务。
示例代码
以下是一个使用 Java 调用 LibreOffice REST API 将文档转换为 PDF 的示例:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class LibreOfficeRestClient {public static void convertToPdf(String filePath, String outputFilePath) {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建 HTTP POST 请求HttpPost httpPost = new HttpPost("http://127.0.0.1:8080/api/convert"); // 替换为 LibreOffice REST API 的地址// 创建文件实体File file = new File(filePath);HttpEntity multipartEntity = MultipartEntityBuilder.create().addBinaryBody("file", file, ContentType.APPLICATION_OCTET_STREAM, file.getName()).build();// 设置请求实体httpPost.setEntity(multipartEntity);// 发送请求HttpResponse response = httpClient.execute(httpPost);// 检查响应状态if (response.getStatusLine().getStatusCode() == 200) {HttpEntity responseEntity = response.getEntity();byte[] pdfBytes = EntityUtils.toByteArray(responseEntity);// 保存 PDF 文件Files.write(Paths.get(outputFilePath), pdfBytes);System.out.println("PDF file saved to: " + outputFilePath);} else {System.out.println("Failed to convert document. Status code: " + response.getStatusLine().getStatusCode());}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String filePath = "path/to/your/document.docx"; // 替换为要转换的文件路径String outputFilePath = "path/to/save/document.pdf"; // 替换为保存 PDF 的路径convertToPdf(filePath, outputFilePath);}
}
说明
- 使用
HttpClient
发送 HTTP POST 请求。 - 使用
MultipartEntityBuilder
创建包含文件的请求体。 - 从响应中提取 PDF 文件并保存到指定路径。
5. 常见问题及解决方案
5.1 LibreOffice 无法启动
如果在启动 LibreOffice 时遇到问题,可能是由于以下原因之一:
- LibreOffice 未正确安装。
- JDK 版本与 LibreOffice 不兼容。
- 环境变量未正确配置。
解决方案:
- 确保 LibreOffice 已正确安装,并且可以通过命令行启动。
- 确保 JDK 版本与 LibreOffice 兼容(推荐使用 JDK 11 或更高版本)。
- 配置环境变量
JAVA_HOME
指向 JDK 的安装目录,并确保PATH
包含 JDK 的bin
目录。
5.2 文档转换失败
如果在转换文档时遇到问题,可能是由于以下原因之一:
- 输入文件路径或格式不正确。
- 输出目录不可写。
- LibreOffice 服务器未正确运行。
解决方案:
- 确保输入文件路径和格式正确。
- 确保输出目录存在且具有写权限。
- 确保 LibreOffice 服务器正在运行,并且可以通过网络访问。
5.3 性能问题
如果在处理大量文档时遇到性能问题,可能是由于以下原因之一:
- LibreOffice 服务器的资源不足。
- 网络延迟较高。
- 代码中存在性能瓶颈。
解决方案:
- 确保 LibreOffice 服务器具有足够的 CPU 和内存资源。
- 优化网络配置,减少网络延迟。
- 使用多线程或异步处理来提高性能。
6. 最佳实践
6.1 使用日志记录
在开发过程中,使用日志记录可以帮助您更好地跟踪程序的运行状态和问题。可以使用 SLF4J
或 Log4j
等日志框架来记录日志。
示例代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class DocumentProcessor {private static final Logger logger = LoggerFactory.getLogger(DocumentProcessor.class);public static void main(String[] args) {try {// 启动 LibreOfficelogger.info("Starting LibreOffice...");XComponentContext xContext = Bootstrap.bootstrap();logger.info("LibreOffice started successfully.");// 加载文档logger.info("Loading document...");XComponent xComponent = loadDocument(xContext, "file:///path/to/your/document.docx");logger.info("Document loaded successfully.");// 保存为 PDFlogger.info("Converting document to PDF...");saveAsPdf(xContext, xComponent, "file:///path/to/save/document.pdf");logger.info("Document converted to PDF successfully.");} catch (Exception e) {logger.error("Error occurred during document processing", e);}}private static XComponent loadDocument(XComponentContext xContext, String filePath) throws Exception {// 省略加载文档的代码}private static void saveAsPdf(XComponentContext xContext, XComponent xComponent, String outputFilePath) throws Exception {// 省略保存为 PDF 的代码}
}
6.2 代码复用
将常用的文档处理功能封装成方法或类,以提高代码的可复用性和可维护性。
示例代码
public class LibreOfficeUtils {public static XComponentContext startLibreOffice() throws Exception {return Bootstrap.bootstrap();}public static XComponent loadDocument(XComponentContext xContext, String filePath) throws Exception {// 省略加载文档的代码}public static void saveAsPdf(XComponentContext xContext, XComponent xComponent, String outputFilePath) throws Exception {// 省略保存为 PDF 的代码}
}
6.3 错误处理
在处理文档时,可能会遇到各种错误。合理地处理这些错误可以提高程序的健壮性。
示例代码
public class DocumentProcessor {public static void main(String[] args) {try {XComponentContext xContext = LibreOfficeUtils.startLibreOffice();XComponent xComponent = LibreOfficeUtils.loadDocument(xContext, "file:///path/to/your/document.docx");LibreOfficeUtils.saveAsPdf(xContext, xComponent, "file:///path/to/save/document.pdf");} catch (Exception e) {logger.error("Error occurred during document processing", e);}}
}
7. 总结
Java 与 LibreOffice 的集成开发为开发者提供了一种强大的工具,用于实现文档自动化处理、文档转换、内容编辑等任务。通过本文的介绍,您应该能够掌握如何使用 Java 调用 LibreOffice 提供的 API,实现跨平台的文档处理功能。希望本文对您的开发工作有所帮助。
8. 参考资料
- LibreOffice 官方文档
- LibreOffice SDK 文档
相关文章:
Java 与 LibreOffice 集成开发指南
1. 引言 Java 与 LibreOffice 的集成开发为开发者提供了一种强大的工具,用于实现文档自动化处理、文档转换、内容编辑等任务。通过 Java 调用 LibreOffice 提供的 API,可以实现跨平台的文档处理功能,满足各种业务需求。本文将详细介绍如何使…...
如果单表数据量大,只能考虑分库分表吗
程序员最怕啥?不是需求改八遍,也不是半夜报警电话,而是数据库突然卡成PPT!尤其是当单表数据冲到几千万行,查询慢得像老牛拉车,这时候团队第一反应往往是:“赶紧分库分表!” 但兄弟,分库分表可不是什么温柔小姐姐,它更像是个浑身带刺的仙人掌——你以为抱上就能解决问…...
3.3.1 spdlog异步日志
文章目录 3.3.1 spdlog异步日志1. spdlog1. 日志作用2 .同步日志和异步日志区别 2. spdlog是什么下载命令:2. spdlog为什么高效3. spdlog特征5. spdlog输出控制6. 处理流程7. 文件io8.问题 2. 如何创建logger3. 如何创建sink4. 如何自定义格式化5. 如何创建异步日志…...
【Web功能测试】注册与登录功能测试用例设计深度解析
1 注册功能测试用例设计 1.1 明确需求与测试范围 必填字段:手机号、验证码、密码 手机号规则:11位手机号 密码规则:6-16位,需包含大小写字母必须同时存在,数字或符号存在其一 协议勾选 提交后跳转登录页或显示成功…...
netstat 查看端口占用、杀死进程
文章目录 查看端口占用强制杀死 报错信息使用 lsof 查看端口占用 netstat -tanlp强制杀死 在安全的情况下,用下面命令杀死端口占用的进程 sudo kill $(sudo lsof -t -i:3128)报错信息 部署程序时,会出现这样的报错: Error response from…...
Windows 11 PowerShell重定向文本文件的编码问题
目录 问题的由来 编码导致的问题 解决办法 VSCode进行转换 记事本进行转换 直接指定输出的文本编码 总结 问题的由来 在我的嵌入式系统的课程中有一个裸机开发的实验,其中需要把图片等文件转换为C语言数组保存在程序中。课程中,我推荐了CodePlea的…...
蓝桥杯冲刺:一维差分
系列文章目录 蓝桥杯系列:一维差分 文章目录 系列文章目录前言一、一维差分: 差分数组的意义: 二、差分的性质: 差分和前缀和的关系 三、一维差分代码实现:四、典型真题(利用一维差分来实现) 这…...
理解企业内部信息集成
目录 1. 技术平台集成 2. 数据集成 3. 应用集成 4. 业务过程集成 5. 应用集成与企业内部信息集成的区别 企业内部信息集成是将分散的技术、数据、应用和业务流程整合为一个协同的整体,以提高效率、减少冗余和增强决策能力。 企业内部信息集成一般可以分为4个方…...
论文学习:《利用图注意力网络增强单细胞多组学数据的整合》
原文标题:Enhanced Integration ofSingle-Cell Multi-Omics Data Using Graph Attention Networks 原文链接:https://pubs.acs.org/doi/abs/10.1021/acssynbio.4c00864 跨不同组学层的数据集成面临的挑战:高维度、异质性和稀疏性。 变分自编码…...
HumanDil-Ox-LDL:保存:2-8℃保存,避免强光直射,不可冻存
化学试剂的基本介绍: /// 英文名称:HumanDil-Oxidized LowDensityLipoprotein /// 中文名称:人源红色荧光标记氧化型低密度脂蛋白 /// 浓度:1.0-4.0 mg/ml /// 外观:乳状液体 /// 缓冲液组分:PBS&…...
基于3d相机的点云物体检测与路径规划
🧩 代码结构和解释: 点云预处理 (preprocess_point_cloud): 使用 Voxel 下采样 来减少点云数据量,去除不必要的噪声。 使用 统计滤波器 去除离群点,以提高后续拟合的精度。 V型焊缝路径拟合 (fit_weld_path_v)&…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(2):んです
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(2):んです 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)~んです & ~の(2)意味(いみ)&形(かたち)&使い方(つかいかた)(3)そうなんですか & そうなんだ。(4)何をしているんですか & 何を…...
yolov8在windows系统的C++版本的onnxruntime部署方法
1.各个软件的的环境需要保持在统一的版本。 onnxruntime需要和cuda的版本对应上,版本号:onnxruntime-win-x64-gpu-1.18.1 ,链接: NVIDIA - CUDA | onnxruntime cuda:本机显卡支持的版本,cuda11.7,链接:CUDA Toolkit Archive | NVIDIA Developer cudnn:需要对应到cud…...
AD软件的系统设置
设置 1.自动保存(DATA -> backup) 2.原理图-复制元器件递增位号 3.原理图-用斜线表示负信号 4.PCB-选择移动重叠的元器件 5.PCB-十字光标全屏大小 6.PCB-选择部分连接网络的走线全亮/显示多个网络的颜色(TP) 7.PCB-DRC报错的图…...
算法---子序列[动态规划解决](最长递增子序列)
最长递增子序列 说白了,要用到双层循环! 用双层循环中的dp[i] class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),1);for(int i 0;i<nums.size();i){for(int j0;j<i;j){if(nums[i]>num…...
快速幂(模板)
快速幂 取余运算性质:(a*b*c)%d (a%d * b%d * c%d)%d ; #include <iostream> using namespace std; int main() {long long b,p,k;//b(底数)p(指数)k(取模数)cin>>b>>p>>k;long long ret1;b%k;//防止底数过大//模版,记…...
蓝桥杯 好数【暴力、基础知识】
题目: AC代码: #include<bits/stdc.h> using namespace std; int ans0; int n; bool check(int x){int cnt1;while(x!0){int tx%10;if(cnt%21){ if(t%20) return false; //奇数位置是偶数} if(cnt%20){if(t%21) return false; //偶数位是奇数}cnt…...
【Kubernetes】Kubernetes中如何实现灰度发布
Kubernetes中实现灰度发布 一、基于Ingress-nginx的流量切分(适用中小规模) 权重分流 在Ingress资源中通过nginx.ingress.kubernetes.io/canary-weight注解设置新版本流量比例apiVersion: networking.k8s.io/v1 kind: Ingress metadata:annotations:ng…...
【Reinforcement Learning For Quadruped Control】1
强化学习(RL)是一种机器学习范式,代理通过与环境的互动来学习做出决策。强化学习的核心概念围绕以下几个方面展开:a) 代理agent,做出决策;b) 环境environment,响应代理的决策;c) 状态…...
工程企业如何实现四算联动?预算-核算-决算系统解析
在工程行业,项目管理的高效性直接决定了企业的盈利能力和市场竞争力。尤其是在EPC(工程总承包)模式下,工程企业面临着复杂的业务场景和多维度的成本管控需求。如何通过“四算联动”(概算、预算、核算、决算)…...
【SpringBoot】处理actuator风险漏洞
最近给系统做渗透测试,扫描出了一个actuator风险漏洞,属于高危级别,通过actuator接口可以拿到用户敏感信息。这个问题处理起来倒也简单,禁用actuator或者限制访问就可以了 # 禁用actuator接口配置 management:server:port: -1# 限…...
MACOS15版本安装 python mysqlclient 以连接mysql 8.0
MACOS14/15 版本安装 python mysqlclient 以连接mysql 8.0 主要用于macos django4 mysql8.0 开发项目 准备材料 macos > 13.0 python > 3.10.0 (不强制) mysql > 8.0 安装步骤 安装 brew 使用国内源安装brew /bin/zsh -c "$(curl -f…...
KV Cache大模型推理加速功能
KV Cache KV Cache是大模型标配的推理加速功能,也是推理过程中,显存资源巨大开销的元凶之一。在模型推理时,KV Cache在显存占用量可达30%以上。 目前大部分针对KV Cache的优化工作,主要集中在工程上。比如著名的VLLM,…...
Windows下安装WSL2下的Ubuntu、docker容器的IP地址(上)
既然容器支持多个应用,那么容易想到应该有对应的ip地址和端口,这样才能和Ubuntu主机进行通讯,ubuntu访问外网也应该有ip能连接到外网才行,要搞清楚这些ip地址的关系才行。 前面两篇文章中说了怎么实现windows和wsl2下的ubuntu的文…...
vue实现中英文切换
第一步:安装插件vue-i18n,npm install vue-i18n 第二步:在src下新建locales文件夹,并在locales下新建index.js、EN.js、CN.js文件 第三步:在EN.js和CN.js文件下配置你想要的字段,例如: //CN.js…...
探索 Vue 3 中 vue-router 的 router.resolve () API
一、router.resolve() 是什么 router.resolve() 就好比是一个精准的 “导航参谋”。当我们在 Vue 3 应用里需要明确某个路由地址对应的详细信息时,它就能派上用场。我们给它传入路由信息,像路径、参数等,它会解析出对应的路由对象࿰…...
Excel 插件推荐:提升Excel能力的效率神器!
一、Excel玩家的觉醒时刻 在财务部的深夜加班现场,李师傅的咖啡杯上凝结着第3圈水渍。眼前的Excel窗口堆叠如俄罗斯方块:重复值删除进度15%、VLOOKUP公式报错3处、合并单元格序号乱成毛线团…这场景是否也戳中了你的痛点? 每个Excel高手都经…...
leetcode_383. 赎金信_java
383. 赎金信https://leetcode.cn/problems/ransom-note/ 1、题目 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字…...
应用安全系列之四十五:日志伪造(Log_Forging)之三
1、简介 针对Java的日志系统有多种,本文主要描述如何通过修改配置文件来解决logback和log4j的日志伪造问题。 2、logback 2.1、系统提供的解决方案 在logback.xml中配置编码器自动转义特殊字符: 复制 <configuration><appender name"C…...
FTPClient开发遇到的坑
1. 生成文件夹乱序 这里用分隔符把路径划分开,意在一层一层创建目录 这里可能会出现乱序 正确的代码 先换一下分隔符 再一次生成所有路径 2.ftpClient 需要指定被动模式才能绕开端口限制 有些 服务器没有打开指定端口,上传文件会出现 425 Canno…...
leetcode0155. 最小栈-medium
1 题目:最小栈 官方标定难度:中 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删…...
操作系统 3.6-内存换出
换出算法总览 页面置换算法 FIFO(先进先出): 最简单的页面置换算法,淘汰最早进入内存的页面。 优点:实现简单。 缺点:可能会导致Belady异常,即增加内存反而降低性能。如果刚换入的页面马上又要…...
Python中的数值运算函数及math库详解
文章目录 Python中的数值运算函数及math库详解一、内置数值运算函数1. 基本数值运算函数2. 类型转换函数3. 进制转换函数 二、math库中的数学常数三、math库常用数学函数1. 数论与表示函数2. 幂函数与对数函数3. 三角函数4. 角度转换5. 双曲函数6. 特殊函数 四、实际应用示例1.…...
安卓开发提示Android Gradle plugin错误
The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模块级 build.gradle(如果有独立配置):…...
《Uniapp-Vue 3-TS 实战开发》一键授权登录
在使用 UniApp 结合 Vue 3 和 TypeScript 开发时,实现一键授权登录功能通常涉及到调用微信小程序的授权接口(如 wx.getUserProfile 或 wx.login)来获取用户信息和登录凭证,然后将这些信息发送到后端进行验证和处理。以下是一个完整的实现示例,展示如何在 UniApp 中实现一键…...
Windows 图形显示驱动开发-WDDM 1.2功能_WDDM 1.2 和 Windows 8
简介 WDDM 是随 Windows Vista 一起引入的,以取代 Windows XP 或 Windows 2000 显示驱动程序模型 (XDDM) 。 随着 Windows Vista 中的引入,WDDM 体系结构提供了启用新功能的功能,例如桌面组合、增强的容错、视频内存管理器、GPU 计划程序、D…...
155.最小栈
1.题目解析 题目是让我们设计一个栈,它于STL库中栈的区别是支持检索到了最小元素的栈但是需要时间复杂度为常数,我们很容易想到的是记录最小值。但是如果中途删除的话最小值可能失效,所以我们选择用2个栈来实现。 2.算法原理 我们创建2个栈…...
[C语言笔记]10、字符串
前言: C语言的相关知识点的笔记均在下面的专栏链接中,欢迎订阅! c语言笔记_1zero10的博客-CSDN博客 10-1字符数组与字符串 1、字符数组就是一个数组,数组的每一个元素都是一个字符 首先利用字符数组,回顾以前学过…...
Windows系统备份和还原点
一、简介 系统的还原点存储了当前系统的主要状态,包括一些关键的配置信息和参数(包括注册表、系统服务设置、设备驱动程序设置等)。将此时的状态进行备份,在系统发生故障时,可以还原到此还原点的状态中,这…...
内联汇编知识点earlyclobber=
arm64内联汇编格式: asm volatile ("汇编指令1\n\t""汇编指令2\n\t""汇编指令3": 输出操作数列表: 输入操作数列表: 可能被修改的寄存器列表 );示例1:简单的寄存器操作 uint64_t add_numbers(uint64_t a, uint64_t b) {…...
修改ESP32CAM的示例CameraWebServer里的camera_index.h的方法
在这里,默认你已经会使用Arduino IDE或者PlatformIO通过烧录底座对ESP32CAM(如下图)进行烧录,并能通过浏览器对其进行访问。 我们访问到下图的界面时,不禁有个疑问,这个界面是如何生成的,如果我…...
Python学习笔记(二)(字符串)
文章目录 编写简单的程序一、标识符 (Identifiers)及关键字命名规则:命名惯例:关键字 二、变量与赋值 (Variables & Assignment)变量定义:多重赋值:变量交换:(很方便哟) 三、输入与输出 (In…...
ViewModel vs AndroidViewModel:核心区别与使用场景详解
在 Android 的 MVVM 架构中,ViewModel 和 AndroidViewModel 都是用于管理 UI 相关数据的组件,但二者有一些关键区别: 1. ViewModel 基本用途:用于存储和管理与 UI 相关的数据,生命周期与 Activity/Fragment 解耦&…...
Windows环境下 全屏显示某个字符串
case WM_PAINT: {PAINTSTRUCT ps;HDC hdc BeginPaint(hWnd, &ps);// 获取完整客户区尺寸RECT rc;GetClientRect(hWnd, &rc);// 全屏时:整个窗口作为显示区域RECT displayRect rc;// 纯黑背景FillRect(hdc, &displayRect, (HBRUSH) GetStockObject(BLA…...
禅道MCP Server开发实践与功能全解析
一、简介 1、MCP Server核心定义 MCP Server(Meta Command Protocol Server)是一种基于客户端-服务器架构的轻量级服务程序,采用统一的mcp协议格式,通过连接多样化数据源和工具为AI应用提供扩展能力。它作为中间层,实…...
Vue.js组件安全开发实战:从架构设计到攻防对抗
目录 开篇总述:安全视角下的Vue组件开发新范式 一、Vue.js组件开发现状全景扫描 二、安全驱动的Vue组件创新架构 三、工程化组件体系构建指南 四、深度攻防对抗实战解析 五、安全性能平衡策略 结语:安全基因注入前端开发的未来展望 下期预告&…...
代发考试战报:4月份最新锐捷RCNA RCNP 考试通过战报
锐捷 RCNA云计算 R4111 考试通过,RCNA 安全 R3111 考试通过,RCNP无线 R5211考试通过,RCNP路由考试通过,等等 成绩单战报...
卫星互联网技术加速发展,遨游卫星电话为生命添一份“保险”
卫星互联网通过高中低轨卫星组网,实现了对海洋、沙漠、极地等“信息盲区”的全域覆盖。据国际电信联盟(ITU)统计,截至2024年底,全球在轨卫星数量已突破1万颗,其中我国“千帆星座”“GW星座”等低轨计划加速…...
文件IO7(中文字库的原理与应用/目录检索原理与应用/并发编程的原理与应用)
中文字库的原理与应用 ⦁ 基本概念 一般在项目中都会显示汉字,都采用中文简体字符集,计算机早期只有ANSI组织设计的ANSII码,其实也属于字符集,这套字符集并未收录中文,只收录256个字符。 所以后期中国国家标准总局设…...
达梦数据库-学习-16-常用SQL记录(持续更新)
目录 一、环境信息 二、介绍 三、查询SQL 1、数据库的总使用空间大小 2、各个表空间的总大小 3、使用空间最大的50个对象 4、使用率最高的50个sequence 5、使用空间率最高的50个自增列 6、定位锁 7、支持HINT 8、表数据页使用率 9、备份文件相关信息 10、初始化库参…...