pdf文件签名的问题解决

这篇具有很好参考价值的文章主要介绍了pdf文件签名的问题解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 pdf转图片乱码问题
pdf是正常的,但是由pdf转成的图片,只要是中文,却是一堆框框,像这个问题,应该就是centos缺少字符集导致的
pdf文件签名的问题解决,岁月云——Web系统最佳实践,pdf
执行命令fc-list :lang=zh,可以看到正常的如下:
pdf文件签名的问题解决,岁月云——Web系统最佳实践,pdf
而有问题的机器,则显示没有安装
pdf文件签名的问题解决,岁月云——Web系统最佳实践,pdf
依据上面的推论,执行

# 文泉驿微米黑字体
yum install -y wqy-microhei-fonts

执行完成后可以看到
pdf文件签名的问题解决,岁月云——Web系统最佳实践,pdf
那么其他的字符集,仿照写一些命令,执行的结果就跟之前的一木一样了。这样问题就解决了。

yum install -y fontconfig mkfontscale
yum install -y wqy-microhei-fonts
yum install -y wqy-zenhei-fonts
yum install -y cjkuni-uming-fonts

还有种办法,就是将windows中的字体都复制过来,将这个文件复制到自己定义的目录
pdf文件签名的问题解决,岁月云——Web系统最佳实践,pdf
有的环境,需要重新机器才能生效。

mkdir -p /usr/share/fonts/win/Fonts
chmod -R 755 /usr/share/fonts/win/Fonts
yum install ttmkfdir -y
ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
# 把你的目录配置进去
vim /etc/fonts/fonts.conf
# 刷新字体缓存
fc-cache

pdf文件签名的问题解决,岁月云——Web系统最佳实践,pdf

2 今天解决冲突的jar,结果出现下面的问题

java.lang.IllegalAccessError: tried to access method org.bouncycastle.asn1.DERNull.<init>()V from class com.itextpdf.text.pdf.security.PdfPKCS7
        at 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$Digest
        at 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$Digest
        at 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包的使用差异很大文章来源地址https://www.toymoban.com/news/detail-703506.html

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 stamper
        PdfStamper stamper = PdfStamper.createSignature(pdfReader, outputStream, '\0', null, false);
        if(imageLocation == null){
            imageLocation = new int[]{460, 0, 130, 90};
        }
        if(sealInputStream != null){
            // Load the image
            BufferedImage image = ImageIO.read(sealInputStream);
            // Create a PDF image
            Image pdfImage = Image.getInstance(image, null);
            // Get the content of the first page
            PdfContentByte content = stamper.getOverContent(1);
            // Add the image to the specified location and with the specified dimensions
            pdfImage.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文件签名的问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue基于html2canvas和jspdf生成pdf文件,解决jspdf中文乱码及自动换行等问题

    在做项目时有这么一个需求,需要将当前页面指定区域的内容导出pdf到本地。借助了两个插件分别是html2canvas.js和pdf.js来实现。使用过程中遇到的问题及解决方法 解决一些问题: 导出按A4纸大小排列 预留页面边距的问题 内容过多自动分页的问题 直接使用jspdf中文乱码的问题

    2024年01月25日
    浏览(60)
  • Android系统签名jks文件

    在android framework开发过程中,通常使用系统应用在验证某些功能,(系统功能权限大,可以通过反射获取hide接口,便于功能调试)。 一般做法,是将AndroidStudio打包的apk,使用系统签名,编译到系统,使其获取到system权限,验证功能。 但是这个过程比较复杂,流程繁琐,耗时

    2024年02月02日
    浏览(41)
  • 解决Kali数字签名失效问题

    更新Kali仓库源:打开终端并运行以下命令来更新Kali仓库源: sudo apt-get update 这将更新仓库源并将Kali系统中的软件包与其仓库中的软件包同步。 更新软件包:运行以下命令来更新所有软件包: sudo apt-get upgrade 这将更新Kali系统中的所有软件包,并修复可能导致数字签名失效的

    2024年02月06日
    浏览(41)
  • Android11.0 生成系统签名.jks文件并对Apk进行签名

    V2签名 对应用手动进行系统签名,需要platform.pk8,platform.x509.pem,signapk.jar这三个文件,应用的AndroidManifest.xml中需要添加 android:sharedUserId=“android.uid.system” ,然后输入以下命令就可得到签名后的apk文件: 如果你的应用 targetSdkVersion=30 ,在7.0以上的设备上安装不成功,会报以

    2024年02月07日
    浏览(56)
  • 文件系统变成RAW问题解决

    对于打开分区提示需要格式化的情况,右击属性查看时,文件系统变成了RAW了,没有关系很好恢复,千万不要格式化。 可以看到该分区说明分区表没有问题,这是由于DBR扇区(即启动扇区)损坏造成的。 以上听不懂分析没有关系,对你的恢复影响不大。 有两种方法恢复:

    2023年04月12日
    浏览(41)
  • Vue3.0跨端Web SDK访问微信小程序云储存,文件上传路径不存在/文件受损无法显示问题(已解决)

    需要vue3.0作为pc端的后台管理来连接微信小程序客户端 需要Web SDK的引入,实现vue3.0接入云开发环境 需要以云环境作为线上服务器,将vue3.0上传的本地文件通过云环境进入云储存,并将文件在云端生成云端快捷访问路径及http/https路径(公网路径) 修改云端储存的权限代码:

    2024年02月08日
    浏览(51)
  • 苹果ios系统ipa文件签名的圈外签名是什么?稳定性怎么样?

     在全球范围内,iOS应用市场的规模和影响力不断增长,企业级应用在其中扮演着重要角色。为了在苹果设备上开发和发布内部应用,企业需要获取苹果的iOS企业级开发者证书。文章旨在探讨企业在申请此证书时需要满足的条件、注册流程,以及必要的事项注意事项。 图片来

    2024年02月05日
    浏览(52)
  • 如何让除HTML,PDF外的文件在web可预览-jodconverter

    什么是jodconverter,GitHub上的文档是这么说的: JODConverter,Java  OpenDocument Converter,在不同的办公格式之间转换文档。 它利用Apache OpenOffice或LibreOffice,它们可以说是当今可用的OpenDocument和Microsoft Office格式的最佳免费导入/导出过滤器。 关键是免费兄弟们!!!!!!wps不会技

    2024年01月21日
    浏览(32)
  • uniapp 在线预览各种格式文件(支持doc, xls, ppt, pdf, docx, xlsx, pptx格式) 适用于小程序 (解决了真机调试可以打开,发布体验版打不开的问题)(可设置文件名)

    代码: 参考官方文档: uni.saveFile(OBJECT) @savefile | uni-app官网 uni-app,uniCloud,serverless https://uniapp.dcloud.net.cn/api/file/file.html#opendocument tips: 问题一: 打不开         1. 文件地址须保证能正常打开(在浏览器中尝试是否能预览或正常下载)         2.注意文件名最好为数字字母(非中文) 问题

    2024年02月05日
    浏览(61)
  • 解决系统找不到zlib.dll文件的问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个zlib.dll文件(挑选合适的

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包