使用itext合并签章的pdf,合并后签章无效

使用itext进行了合并签章的pdf
合并后的pdf点击签章处提示签名无法验证,我该使用哪种方法合并pdf才能保证签名的完整性。
下面是我合并pdf的代码

 /**
     * 合并PDF文件
     * @param sourceFilePaths 需要合并的PDF文件路径列表
     * @param destFilePath 合并后的新文件
     */
    public static void mergePdfFiles(List<String> sourceFilePaths, String destFilePath) {
        if (sourceFilePaths == null || sourceFilePaths.isEmpty() || destFilePath == null) {
            return;
        }

        Document document = null;
        //PdfCopy copy = null;
        OutputStream os = null;
        try {
            // 创建合并后的新文件的目录
            Path dirPath = Paths.get(destFilePath.substring(0, destFilePath.lastIndexOf(File.separator)));
            Files.createDirectories(dirPath);

            os = new BufferedOutputStream(new FileOutputStream(new File(destFilePath)));
            document = new Document(new PdfReader(sourceFilePaths.get(0)).getPageSize(1));
            PdfSmartCopy copy = new PdfSmartCopy(document, os);
            //copy = new PdfCopy(document, os);
            document.open();
            for (String sourceFilePath : sourceFilePaths) {
                // 如果PDF文件不存在,则跳过
                if (!new File(sourceFilePath).exists()) {
                    continue;
                }

                // 读取需要合并的PDF文件
                PdfReader reader = new PdfReader(sourceFilePath);
                // 获取PDF文件总页数
                int n = reader.getNumberOfPages();
                for (int j = 1; j <= n; j++) {
                    document.newPage();
                    PdfImportedPage page = copy.getImportedPage(reader, j);
                    copy.addPage(page);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document != null) {
                try {
                    document.close();
                } catch (Exception ex) {
                    /* ignore */
                }
            }
            if (os != null) {
                try {
                    os.close();
                } catch (Exception ex) {
                    /* ignore */
                }
            }
        }
    }

参考GPT和自己的思路:首先,使用iText进行PDF合并时,签名的完整性是非常重要的。在您的代码中,您使用了PdfSmartCopy,这通常是一个不错的选择,因为它可以处理一些iText不能正确处理的PDF对象类型。

无效签名的问题可能与您的代码中某些细节有关。以下是一些建议:

  1. 确保所有的PDF文件都是数字签名的,并且这些文件的签名也可以成功验证。

  2. 在合并PDF文件之前,应该将签名的位置设置为不可编辑,以确保签名的完整性。您可以使用以下代码来实现:

    PdfStamper.setEncryption(null, null, PdfWriter.ALLOW_SCREENREADERS, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);

  3. 尝试使用PdfCopy,而不是PdfSmartCopy,并检查签名是否依然无效。PdfCopy重载了输入PDF文档中的对象,因此对于某些情况,这可能会更好地处理数字签名。

希望这些建议对您有所帮助,如果您需要更多帮助,请提供更详细的信息或者代码,以便我们更好地了解问题所在。