pdf文件签名的问题解决
今天解决冲突的jar,结果出现下面的问题
java.lang.IllegalAccessError: tried to access method org.bouncycastle.asn1.DERNull.<init>()V from class com.itextpdf.text.pdf.security.PdfPKCS7at com.itextpdf.text.pdf.security.PdfPKCS7.getEncodedPKCS7(PdfPKCS7.java:836)at com.itextpdf.text.pdf.security.MakeSignature.signDetached(MakeSignature.java:154)at com.whty.einv.sks.model.util.SignatureUtil.sign(SignatureUtil.java:97)at com.whty.einv.sks.model.util.SignatureUtil.sign(SignatureUtil.java:157)at com.whty.einv.sks.model.util.SignatureUtil.sign(SignatureUtil.java:143)at com.whty.einv.sks.model.service.impl.LocalSignatureStrategy.sign(LocalSignatureStrategy.java:38)at com.whty.einv.sks.model.service.AbstractInvoicePdfService.genPdf(AbstractInvoicePdfService.java:135)at com.whty.einv.sks.model.service.AbstractInvoicePdfService.genPdf(AbstractInvoicePdfService.java:99)at com.whty.einv.sks.model.service.AbstractInvoicePdfService.asyncGenPdf(AbstractInvoicePdfService.java:77)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Thr
按照kotlin 使用Itext5签署PDF在Quarkus中出现错误“PdfPKCS7无法访问void org.bouncycastle.asn1.DERNull.< init>()”
设置并不能解决问题。
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>
按照PDF文件的数字签名编写,再本地可以运行,但是发布到容器环境中,提示下面的错误,主要原还是因为bcprov-jdk15on,因为jar冲突被排除了。
java.lang.NoClassDefFoundError: org/bouncycastle/jcajce/provider/digest/MD2$Digestat com.whty.einv.sks.model.util.SignUtil.sign(SignUtil.java:111)at com.whty.einv.sks.model.util.SignUtil.sign(SignUtil.java:83)at com.whty.einv.sks.model.util.SignUtil.sign(SignUtil.java:69)at com.whty.einv.sks.model.service.impl.LocalSignatureStrategy.sign(LocalSignatureStrategy.java:38)at com.whty.einv.sks.model.service.AbstractInvoicePdfService.genPdf(AbstractInvoicePdfService.java:135)at com.whty.einv.sks.model.service.AbstractInvoicePdfService.genPdf(AbstractInvoicePdfService.java:99)at com.whty.einv.sks.model.service.AbstractInvoicePdfService.asyncGenPdf(AbstractInvoicePdfService.java:77)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jcajce.provider.digest.MD2$Digestat java.net.URLClassLoader.findClass(URLClassLoader.java:382)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:135)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 19 common frames omitted
现在对比一下新模式,这里的reason是必填,否则会报错,与旧模式有区别
package com.whty.einv.sks.model.util;import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.StampingProperties;
import com.itextpdf.signatures.*;
import com.itextpdf.signatures.PdfSignatureAppearance.RenderingMode;
import com.whty.framework.base.util.CheckEmptyUtil;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;/*** @author dj* @create 2023-09-05 19:00*/
public class SignUtil {public static void sign(String src, String dest, String img, KeyStore keyStore, String password, String digestAlgorithm,PdfSigner.CryptoStandard sigtype, String reason, String location) throws GeneralSecurityException, IOException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), img, chain, PrivateKey, digestAlgorithm, sigtype, reason, location);}public static void sign(String src, String dest, String img, KeyStore keyStore, String password, String digestAlgorithm,PdfSigner.CryptoStandard sigtype) throws GeneralSecurityException, IOException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), img, chain, PrivateKey, digestAlgorithm, sigtype, null, null);}public static void sign(String src, String dest, KeyStore keyStore, String password, String digestAlgorithm,PdfSigner.CryptoStandard sigtype, String reason, String location) throws GeneralSecurityException, IOException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), null, chain, PrivateKey, digestAlgorithm, sigtype, reason, location);}public static void sign(String src, String dest, KeyStore keyStore, String password, String digestAlgorithm,PdfSigner.CryptoStandard sigtype) throws GeneralSecurityException, IOException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), null, chain, PrivateKey, digestAlgorithm, sigtype, null, null);}public static void sign(String src, String dest, String img, KeyStore keyStore, String password,String reason, String location) throws GeneralSecurityException, IOException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), img, chain, PrivateKey, DigestAlgorithms.SHA1, PdfSigner.CryptoStandard.CMS, reason, location);}public static void sign(String src, OutputStream outputStream, KeyStore keyStore, String password) throws GeneralSecurityException, IOException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, outputStream, null, chain, PrivateKey, DigestAlgorithms.SHA1, PdfSigner.CryptoStandard.CMS, "岁月云", "");}public static void sign(String src, OutputStream outputStream, String img, KeyStore keyStore, String password) throws GeneralSecurityException, IOException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, outputStream, img, chain, PrivateKey, DigestAlgorithms.SHA1, PdfSigner.CryptoStandard.CMS, null, null);}public static void sign(String src, OutputStream outputStream, String img, Certificate[] chain, PrivateKey pk, String digestAlgorithm,PdfSigner.CryptoStandard sigtype, String reason, String location) throws GeneralSecurityException, IOException {PdfReader pdfReader = new PdfReader(src);sign(pdfReader,outputStream,img,chain,pk,digestAlgorithm,sigtype,reason,location);}public static void sign(PdfReader pdfReader, OutputStream outputStream, String img, Certificate[] chain, PrivateKey pk, String digestAlgorithm,PdfSigner.CryptoStandard sigtype, String reason, String location) throws GeneralSecurityException, IOException {PdfSigner signer = new PdfSigner(pdfReader,outputStream,new StampingProperties());// 获取数字签章属性对象,设定数字签章的属性PdfSignatureAppearance appearance = signer.getSignatureAppearance();appearance.setReason(reason);appearance.setLocation(location);/*** 1 三个参数依次为:设置签名的位置、页码、签名域名称,多次追加签名的时候,签名域名称不能一样* 1.1 签名的位置四个参数:印章左下角的X、Y轴坐标,印章右上角的X、Y轴坐标,* 这个位置是相对于PDF页面的位置坐标,即该坐标距PDF当前页左下角的坐标*/Rectangle rect = new Rectangle(460, 0, 590, 90);appearance.setReuseAppearance(false).setPageRect(rect).setPageNumber(1);if(CheckEmptyUtil.isEmpty(img)) {img = SignUtil.class.getClassLoader().getResource("seal/empty.png").getPath();}ImageData imageData = ImageDataFactory.create(img);appearance.setSignatureGraphic(imageData);appearance.setRenderingMode(RenderingMode.GRAPHIC);/*** 算法主要为:RSA、DSA、ECDSA* 摘要算法,这里的itext提供了2个用于签名的接口,可以自己实现*/IExternalDigest digest = new BouncyCastleDigest();/*** 签名算法,参数依次为:证书秘钥、摘要算法名称,例如MD5 | SHA-1 | SHA-2.... 以及 提供者*/IExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, null);signer.signDetached(digest, signature, chain, null, null, null, 0, sigtype);}
}
旧模式,用法差不多,但是jar包的使用差异很大
package com.whty.einv.invoice.util;import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSignatureAppearance;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.security.*;
import com.whty.framework.base.util.CheckEmptyUtil;
import org.apache.commons.io.FileUtils;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;/*** 签名工具类*/
public class SignatureUtil {/*** 签名* @param pdfReader 需要签章的pdf* @param dest 签完章的pdf文件路径* @param chain 证书链* @param img 印章图片* @param pk 签名私钥* @param digestAlgorithm 摘要算法名称,例如SHA-1* @param sigtype 数字签名格式,itext有2种* @param reason 签名的原因,显示在pdf签名属性中* @param location 签名的地点,显示在pdf签名属性中* @throws GeneralSecurityException* @throws IOException* @throws DocumentException*/public static void sign(PdfReader pdfReader, OutputStream outputStream, String img, Certificate[] chain, PrivateKey pk, String digestAlgorithm,MakeSignature.CryptoStandard sigtype, String reason, String location,InputStream sealInputStream,int[] imageLocation) throws GeneralSecurityException, IOException, DocumentException {/*** 1 参数依次为:文件名、文件输入流、文件版本号、临时文件、是否可以追加签名* 1.1 false的话,pdf文件只允许被签名一次,多次签名,最后一次有效* 1.2 true的话,pdf可以被追加签名,验签工具可以识别出每次签名之后文档是否被修改*/// Create a PDF stamperPdfStamper stamper = PdfStamper.createSignature(pdfReader, outputStream, '\0', null, false);if(imageLocation == null){imageLocation = new int[]{460, 0, 130, 90};}if(sealInputStream != null){// Load the imageBufferedImage image = ImageIO.read(sealInputStream);// Create a PDF imageImage pdfImage = Image.getInstance(image, null);// Get the content of the first pagePdfContentByte content = stamper.getOverContent(1);// Add the image to the specified location and with the specified dimensionspdfImage.setAbsolutePosition(imageLocation[0], imageLocation[1]);pdfImage.scaleAbsolute(imageLocation[2], imageLocation[3]);content.addImage(pdfImage);}// 获取数字签章属性对象,设定数字签章的属性PdfSignatureAppearance appearance = stamper.getSignatureAppearance();appearance.setReason(reason);appearance.setLocation(location);/*** 1 三个参数依次为:设置签名的位置、页码、签名域名称,多次追加签名的时候,签名域名称不能一样* 1.1 签名的位置四个参数:印章左下角的X、Y轴坐标,印章右上角的X、Y轴坐标,* 这个位置是相对于PDF页面的位置坐标,即该坐标距PDF当前页左下角的坐标*/appearance.setVisibleSignature(new Rectangle(imageLocation[0], imageLocation[1], imageLocation[0]+imageLocation[2], imageLocation[1]+imageLocation[3]), 1, "sign");/*** 用于盖章的印章图片,引包的时候要引入itext包的image*/if(CheckEmptyUtil.isEmpty(img)) {img = SignatureUtil.class.getClassLoader().getResource("seal/empty.png").getPath();}appearance.setSignatureGraphic(Image.getInstance(img));/*** 设置认证等级,共4种,分别为:* NOT_CERTIFIED、CERTIFIED_NO_CHANGES_ALLOWED、* CERTIFIED_FORM_FILLING 和 CERTIFIED_FORM_FILLING_AND_ANNOTATIONS** 需要用哪一种根据业务流程自行选择*/appearance.setCertificationLevel(PdfSignatureAppearance.NOT_CERTIFIED);/*** 印章的渲染方式,同样有4种:* DESCRIPTION、NAME_AND_DESCRIPTION,* GRAPHIC_AND_DESCRIPTION,GRAPHIC;* 这里选择只显示印章*/appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC);/*** 算法主要为:RSA、DSA、ECDSA* 摘要算法,这里的itext提供了2个用于签名的接口,可以自己实现*/ExternalDigest digest = new BouncyCastleDigest();/*** 签名算法,参数依次为:证书秘钥、摘要算法名称,例如MD5 | SHA-1 | SHA-2.... 以及 提供者*/ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, null);/*** 最重要的来了,调用itext签名方法完成pdf签章*/MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, sigtype);}public static void sign(String src, String dest, String img, KeyStore keyStore, String password, String digestAlgorithm,MakeSignature.CryptoStandard sigtype, String reason, String location) throws GeneralSecurityException, IOException, DocumentException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), img, chain, PrivateKey, digestAlgorithm, sigtype, reason, location);}public static void sign(String src, String dest, String img, KeyStore keyStore, String password, String digestAlgorithm,MakeSignature.CryptoStandard sigtype) throws GeneralSecurityException, IOException, DocumentException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), img, chain, PrivateKey, digestAlgorithm, sigtype, null, null);}public static void sign(String src, String dest, KeyStore keyStore, String password, String digestAlgorithm,MakeSignature.CryptoStandard sigtype, String reason, String location) throws GeneralSecurityException, IOException, DocumentException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), null, chain, PrivateKey, digestAlgorithm, sigtype, reason, location);}public static void sign(String src, String dest, KeyStore keyStore, String password, String digestAlgorithm,MakeSignature.CryptoStandard sigtype) throws GeneralSecurityException, IOException, DocumentException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), null, chain, PrivateKey, digestAlgorithm, sigtype, null, null);}public static void sign(String src, String dest, KeyStore keyStore, String password) throws GeneralSecurityException, IOException, DocumentException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, new FileOutputStream(dest), null, chain, PrivateKey, DigestAlgorithms.SHA1, MakeSignature.CryptoStandard.CMS, null, null);}public static void sign(String src, OutputStream outputStream, KeyStore keyStore, String password) throws GeneralSecurityException, IOException, DocumentException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, outputStream, null, chain, PrivateKey, DigestAlgorithms.SHA1, MakeSignature.CryptoStandard.CMS, null, null);}public static void sign(String src, OutputStream outputStream, String img, KeyStore keyStore, String password) throws GeneralSecurityException, IOException, DocumentException {String alias = keyStore.aliases().nextElement();PrivateKey PrivateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);sign(src, outputStream, img, chain, PrivateKey, DigestAlgorithms.SHA1, MakeSignature.CryptoStandard.CMS, null, null);}public static void sign(String src, OutputStream outputStream, String img, Certificate[] chain, PrivateKey pk, String digestAlgorithm,MakeSignature.CryptoStandard sigtype, String reason, String location) throws GeneralSecurityException, IOException, DocumentException {PdfReader pdfReader = new PdfReader(src);sign(pdfReader,outputStream,img,chain,pk,digestAlgorithm,sigtype,reason,location,null,null);}public static void sign(byte[] originalPdf, OutputStream outputStream, KeyStore keyStore, String password,InputStream sealInputStream,int[] imgLocation) throws GeneralSecurityException, IOException, DocumentException {String alias = keyStore.aliases().nextElement();PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());Certificate[] chain = keyStore.getCertificateChain(alias);PdfReader pdfReader = new PdfReader(originalPdf);sign(pdfReader, outputStream, null, chain, privateKey, DigestAlgorithms.SHA1, MakeSignature.CryptoStandard.CMS, null, null,sealInputStream,imgLocation);}相关文章:
pdf文件签名的问题解决
今天解决冲突的jar,结果出现下面的问题 java.lang.IllegalAccessError: tried to access method org.bouncycastle.asn1.DERNull.<init>()V from class com.itextpdf.text.pdf.security.PdfPKCS7at com.itextpdf.text.pdf.security.PdfPKCS7.getEncodedPKCS7…...
Node.js安装使用
目录 一、安装 Node.js二、环境变量配置三、npm常用命令 Node.js 是一个强大的运行时环境,它使您能够在服务器端运行 JavaScript 代码。它非常流行,用于构建 Web 应用程序、API 和各种后端服务。 一、安装 Node.js 1、访问 Node.js 官方网站。 在主页上…...
sql:SQL优化知识点记录(七)
(1)索引优化5 (2)索引优化6 (3)索引优化7 查询*, 百分号加右边,否则索引会失效 没建立索引之前都是全表扫描 没建立索引 建立索引: 建立索引 id是主键,他也…...
机器学习:基于梯度下降算法的线性拟合实现和原理解析
机器学习:基于梯度下降算法的线性拟合实现和原理解析 线性拟合梯度下降算法步骤算法实现数据可视化(动态展示)应用示例 当我们需要寻找数据中的趋势、模式或关系时,线性拟合和梯度下降是两个强大的工具。这两个概念在统计学、机器…...
关键点数据增强
1.关键点数据增强 # 关键点数据增强 from PIL import Image, ImageDraw import random import json from pathlib import Path# 创建一个黑色背景图像 width, height 5000, 5000 # 图像宽度和高度 background_color (0, 0, 0) # 黑色填充# 随机分布图像 num_images 1 # …...
最小化安装移动云大云操作系统--BCLinux-for-Euler-22.10-everything-x86_64-230316版
CentOS 结束技术支持,转为RHEL的前置stream版本后,国内开源Linux服务器OS生态转向了开源龙蜥和开源欧拉两大开源社区,对应衍生出了一系列商用Linux服务器系统。BCLinux-for-Euler-22.10是中国移动基于开源欧拉操作系统22.03社区版本深度定制的…...
003传统图机器学习、图特征工程
文章目录 一. 人工特征工程、连接特征二. 在节点层面对连接特征进行特征提取三. 在连接层面对连接特征进行特征提取四. 在全图层面对连接特征进行特征提取 一. 人工特征工程、连接特征 节点、连接、子图、全图都有各自的属性特征, 属性特征一般是多模态的。除属性特…...
Apache Tomcat 漏洞复现
文章目录 Apache Tomcat 漏洞复现1. Tomcat7 弱密码和后端 Getshell 漏洞1.1 漏洞描述1.2 漏洞复现1.3 漏洞利用1.3.1 jsp小马1.3.2 jsp大马 1.4 安全加固 2. Aapache Tomcat AJP任意文件读取/包含漏洞2.1 漏洞描述2.1 漏洞复现2.2 漏洞利用工具2.4 修复建议 3. 通过 PUT 方法的…...
Oracle-常用权限-完整版
-- 创建用户 create user TCK identified by oracle; -- 赋权 grant connect,resource to TCK; -- 删除权限 revoke select any table from TCK -- 删除用户 CASCADE(用户下的数据级联删除) drop user TCK CASCADE -- 查询权限列表 select * from user_role_privs; select * fr…...
jenkins 发布job切换不同的jdk版本/ maven版本
1. 技术要求 因为有个新的项目需要使用jdk17 而旧的项目需要jdk1.8 这就需要jenkins在发布项目的时候可以指定jdk版本 2. 解决 jenkins全局工具配置页面 配置新的jdk 路径 系统管理-> 全局工具配置 如上新增个jdk 名称叫 jdk-17 然后配置jdk-17的根路径即可(这…...
如何在小程序中给会员设置备注
给会员设置备注是一项非常有用的功能,它可以帮助商家更好地管理和了解自己的会员。下面是一个简单的教程,告诉商家如何在小程序中给会员设置备注。 1. 找到指定的会员卡。在管理员后台->会员管理处,找到需要设置备注的会员卡。也支持对会…...
PaddleOCR学习笔记2-初步识别服务
今天初步实现了网页,上传图片,识别显示结果到页面的服务。后续再完善。 采用flask paddleocr bootstrap快速搭建OCR识别服务。 代码结构如下: 模板页面代码文件如下: upload.html : <!DOCTYPE html> <html> <…...
【Opencv】Pyhton 播放上一帧,下一帧,存video,逐帧分析
文章目录 读取具体哪一帧等待按钮写入解码方式与文件格式对应全部代码 读取具体哪一帧 这个方法可以获取某一帧: while True:cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame)ret, frame cap.read()if not ret:break等待按钮 这个方法可以显示当前帧,…...
【关于Java:认识异常】
文章目录 一、1. 异常概念与体系结构1.1 异常的概念1.2 常见的异常1.算数异常2.数组越界异常3.空指针异常 1.3 异常的体系结构1.4 异常的分类1. 编译时异常2. 运行时异常(RuntimeException) 二、 异常的处理方式2.1 防御式编程2.2 EAFP:(异常…...
【C++ • STL • 力扣】详解string相关OJ
文章目录 1、仅仅翻转字母2、字符串中的第一个唯一字符3、字符串里最后一个单词的长度4、验证一个字符串是否是回文5、字符串相加总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ" 1、仅仅翻转字母 力扣链接 代码1展示&…...
【Tomcat服务部署及优化】
Tomcat 一、什么是Tomcat?二、Tomcat 核心组件2.1 Tomcat 组件2.3 Container组件的结构2.4 Tomcat 请求过程 三、Tomcat 部署3.1 安装JDK3.2 设置JDK环境变量3.3 安装Tomcat并用supervisor启动解压添加到supervisord服务测试能否通过supervisorctl启动 四、Tomcat的端口和主要…...
C++之红黑树
红黑树 红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入红黑树的验证红黑树与AVL树的比较 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上…...
Go语言网络编程(socket编程)TCP
1、TCP编程 1.1.1 Go语言实现TCP通信 TCP协议 TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协…...
C语言——局部和全局变量
局部变量 定义在函数内部的变量称为局部变量(Local Variable) 局部变量的作用域(作用范围)仅限于函数内部, 离开该函数后是无效的 离开该函数后,局部变量自动释放 示例代码: #include <stdio.h>// 函数定义 …...
【Java基础篇 | 类和对象】--- 聊聊什么是内部类
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区讨论💌 前言 当一个事物的内部&…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
