You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中使用SAP Crystal Reports生成AES加密PDF的问题求助

在C#中使用ReportDocument生成AES加密PDF的解决方案

需求说明

  • 采用AES/CBC/PKCS5Padding加密算法
  • 使用指定的Secret Key(密钥)和Initialization vector(初始化向量)
  • 直接生成加密PDF并保存至指定路径,禁止先存未加密PDF再加密

原有方案的问题分析

方法1问题

调用reportDocument.ExportToStream(ExportFormatType.PortableDocFormat, reportStream)时编译报错,原因是该方法没有双参数重载,无法直接传入目标流。

方法2问题

配置ExportOptions时出现错误:

  1. ExportDestinationType枚举中不存在Stream值
  2. ExportOptions类没有Stream属性,无法直接指定输出流

可行解决方案

以下代码通过正确的流导出方式,结合AES加密实现需求:

using System.IO;
using System.Security.Cryptography;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;

internal void ExportAndSaveEncryptedPDF(ReportDocument reportDocument, string savePath, byte[] secretKey, byte[] iv)
{
    // 导出报表到PDF流
    using (Stream rawPdfStream = reportDocument.ExportToStream(ExportFormatType.PortableDocFormat))
    using (MemoryStream pdfMemoryStream = new MemoryStream())
    {
        // 将导出的PDF流复制到可操作的MemoryStream
        rawPdfStream.CopyTo(pdfMemoryStream);
        byte[] rawPdfBytes = pdfMemoryStream.ToArray();
        
        // 加密PDF字节数组
        byte[] encryptedPdfBytes = EncryptPdfData(rawPdfBytes, secretKey, iv);
        
        // 保存加密后的PDF到指定路径
        File.WriteAllBytes(savePath, encryptedPdfBytes);
    }
}

public static byte[] EncryptPdfData(byte[] rawData, byte[] key, byte[] iv)
{
    using (Aes aesAlgorithm = Aes.Create())
    {
        aesAlgorithm.Key = key;
        aesAlgorithm.IV = iv;
        aesAlgorithm.Mode = CipherMode.CBC;
        // AES块大小为16字节,PKCS7Padding与PKCS5Padding效果等价
        aesAlgorithm.Padding = PaddingMode.PKCS7;

        ICryptoTransform encryptor = aesAlgorithm.CreateEncryptor(aesAlgorithm.Key, aesAlgorithm.IV);

        using (MemoryStream encryptedStream = new MemoryStream())
        using (CryptoStream cryptoStream = new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write))
        {
            cryptoStream.Write(rawData, 0, rawData.Length);
            cryptoStream.FlushFinalBlock();
            return encryptedStream.ToArray();
        }
    }
}

关键注意事项

  • 密钥与IV长度要求:AES密钥长度需为16字节(AES-128)、24字节(AES-192)或32字节(AES-256);IV必须固定为16字节(AES块大小)。
  • 流操作细节:ExportToStream返回的流不支持直接调用ToArray(),需先复制到MemoryStream再处理。
  • 加密算法兼容:由于AES块大小为16字节,使用PaddingMode.PKCS7完全满足需求中的PKCS5Padding要求,二者在此场景下行为一致。

内容的提问来源于stack exchange,提问作者ruwan liyanage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:55:55