C#将PDF加密添加到多个MemoryStream-无法访问封闭流

C#将PDF加密添加到多个MemoryStream-无法访问封闭流,c#,pdf,encryption,itext,C#,Pdf,Encryption,Itext,是否可以向从多个MemoryStream动态创建的PDF添加加密 根据我的上一个问题,我正在尝试添加PDF加密 根据我在下面提供的示例,如果行pdfStamper.Close()被注释掉,我没有得到错误无法访问封闭流,但也没有对生成的PDF应用加密 有人能告诉我哪里出了问题,如果可能的话,如何解决我的问题吗 public MemoryStream CreateMemoryStream() { byte[] dynamicPdfBytes; using (var dynamicP

是否可以向从多个MemoryStream动态创建的PDF添加加密

根据我的上一个问题,我正在尝试添加PDF加密

根据我在下面提供的示例,如果行
pdfStamper.Close()
被注释掉,我没有得到错误
无法访问封闭流
,但也没有对生成的PDF应用加密

有人能告诉我哪里出了问题,如果可能的话,如何解决我的问题吗

public MemoryStream CreateMemoryStream()
{
    byte[] dynamicPdfBytes;

    using (var dynamicPDfMemoryStream = new MemoryStream())
    {
        using (var document = new Document(PageSize.A4, 25, 25, 30, 30))
        {
            PdfWriter.GetInstance(document, dynamicPDfMemoryStream);

            document.Open();

            var pdfPTable = new PdfPTable(1)
            {
                TotalWidth = _totalWidth,
                LockedWidth = true,
                SpacingBefore = _spacingBefore,
                SpacingAfter = _spacingAfter
            };

            float[] widths = { 272f };

            pdfPTable.SetWidths(widths);

            var image = Image.GetInstance(HttpContext.Current.Server.MapPath("/Images/logo.png"));
            image.ScaleToFit(125f, 125f);
            image.Alignment = Image.RIGHT_ALIGN;

            var pdfPCell = new PdfPCell(image)
            {
                Border = 0,
                HorizontalAlignment = Element.ALIGN_RIGHT
            };

            pdfPTable.AddCell(pdfPCell);

            document.Add(pdfPTable);
        }

        dynamicPdfBytes = dynamicPDfMemoryStream.ToArray();
    }

    byte[] pdfBytes;

    using (var pdfReader = new PdfReader(HttpContext.Current.Server.MapPath("/Documents/Test.pdf")))
    {
        using (var pdfMemoryStream = new MemoryStream())
        {
            var pdfStamper = new PdfStamper(pdfReader, pdfMemoryStream);

            var acroFields = pdfStamper.AcroFields;
            acroFields.SetField("TestField", "This is a test");
            pdfStamper.FormFlattening = true;
            pdfStamper.Close();

            pdfBytes = pdfMemoryStream.ToArray();
        }
    }

    var files = new List<byte[]> { dynamicPdfBytes, pdfBytes };

    byte[] array;

    using (var arrayMemoryStream = new MemoryStream())
    {
        var document = new Document(PageSize.A4, 25, 25, 30, 30);

        var pdfWriter = PdfWriter.GetInstance(document, arrayMemoryStream);

        document.Open();

        var directContent = pdfWriter.DirectContent;

        foreach (var bytes in files)
        {
            var pdfReader = new PdfReader(bytes);

            var pdfStamper = new PdfStamper(pdfReader, arrayMemoryStream);
            pdfStamper.SetEncryption(null, _password, PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_128);

            var numberOfPages = pdfReader.NumberOfPages;

            for (var i = 1; i <= numberOfPages; i++)
            {
                document.NewPage();

                var page = pdfWriter.GetImportedPage(pdfReader, i);

                directContent.AddTemplate(page, 0, 0);
            }

            pdfStamper.FormFlattening = true;
            pdfStamper.Close();
        }

        document.Close();

        array = arrayMemoryStream.ToArray();
    }

    var memoryStream = new MemoryStream();
    memoryStream.Write(array, 0, array.Length);
    memoryStream.Position = 0;

    return memoryStream;
}
公共内存流CreateMemoryStream()
{
byte[]dynamicPdfBytes;
使用(var dynamicpdfmorystream=new MemoryStream())
{
使用(var文档=新文档(PageSize.A4、25、25、30、30))
{
GetInstance(文档,dynamicPDMemoryStream);
document.Open();
var pdfPTable=新pdfPTable(1)
{
总宽度=_总宽度,
LockedWidth=true,
间距前=_间距前,
SpacingAfter=_SpacingAfter
};
浮动[]宽度={272f};
pdfPTable.设置宽度(宽度);
var image=image.GetInstance(HttpContext.Current.Server.MapPath(“/Images/logo.png”);
图像。缩放拟合(125f,125f);
image.Alignment=image.RIGHT\u ALIGN;
var pdfPCell=新的pdfPCell(图像)
{
边框=0,
水平对齐=Element.ALIGN\u RIGHT
};
pdfPTable.AddCell(pdfPCell);
文件。添加(pdfPTable);
}
dynamicPdfBytes=dynamicPDMemoryStream.ToArray();
}
字节[]pdfBytes;
使用(var pdfReader=newpdfreader(HttpContext.Current.Server.MapPath(“/Documents/Test.pdf”))
{
使用(var pdfMemoryStream=new MemoryStream())
{
var pdfStamper=新的pdfStamper(pdfReader、pdfMemoryStream);
var acroFields=pdfStamper.acroFields;
SetField(“TestField”,“这是一个测试”);
pdfStamper.formflatting=true;
pdfStamper.Close();
pdfBytes=pdfMemoryStream.ToArray();
}
}
var files=新列表{dynamicPdfBytes,pdfBytes};
字节[]数组;
使用(var arrayMemoryStream=new MemoryStream())
{
var文件=新文件(PageSize.A4、25、25、30、30);
var pdfWriter=pdfWriter.GetInstance(文档,arrayMemoryStream);
document.Open();
var directContent=pdfWriter.directContent;
foreach(文件中的var字节)
{
var pdfReader=新的pdfReader(字节);
var pdfStamper=新pdfStamper(pdfReader,arrayMemoryStream);
pdfStamper.SetEncryption(null,_密码,PdfWriter.ALLOW_打印,PdfWriter.STANDARD_加密_128);
var numberOfPages=pdfReader.numberOfPages;

对于(var i=1;i而言,这可能不是最优雅的解决方案,但它是针对这一特定问题的解决方案,我希望它对其他人有用

以下代码可以与原始示例代码一起使用,只需注释掉上面代码中的所有
pdfStamper
引用:

private MemoryStream SecureMemoryStream()
{
    var memoryStream = CreateMemoryStream();

    return GetSecureMemoryStream(memoryStream);
}

private MemoryStream GetSecureMemoryStream(MemoryStream memoryStream)
{
    byte[] array;

    using (var secureMemoryStream = new MemoryStream())
    {
        var pdfReader = new PdfReader(memoryStream);

        using (var pdfStamper = new PdfStamper(pdfReader, secureMemoryStream))
        {
            pdfStamper.SetEncryption(null, _password, PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_128);
            pdfStamper.FormFlattening = true;
        }

        array = secureMemoryStream.ToArray();
    }

    var outputStream = new MemoryStream();
    outputStream.Write(array, 0, array.Length);
    outputStream.Position = 0;

    return outputStream;
}

这个网站上的一些用户让人感到羞耻,与其贬低一个用户,因为他可能没有按照别人的理想编写代码,或者可能没有正确地表达问题,还不如说用户可以帮上一点忙,而不是碍手碍脚,这只是一个想法!例如,请参阅一个涉及表单的
PdfCopy
示例。这对ul:
PdfCopy
对象还有一个
SetEncryption()
方法,如下所述:请注意,您使用的是旧版本的iText。您确实应该升级到iText 7,因为iText 5(或更早版本)不再支持。请不要在生产中使用您在本问题中编写的代码。如果您的客户看到您的代码,他可能会不高兴。如果您的客户没有看到您的代码,请注意iText是根据AGPL授权的,不与客户共享您的代码意味着您需要为其购买商业许可证您对iText的使用。这没有什么帮助。您的
getSecureMoryStream()
方法加密单个PDF文件(对于一些读者来说,它也会压平所有表单字段(如果有的话)。问题是如何合并PDF文件。正如我在评论中试图解释的,选项1是使用
PdfCopy
(或
PdfSmartCopy
)。选项2是升级到iText 7,因为不再支持OP使用的iText版本。