C # Добавление шифрования PDF в несколько MemoryStreams - не удается получить доступ к закрытому потоку - PullRequest
0 голосов
/ 15 мая 2018

Можно ли добавить шифрование в PDF, динамически создаваемый из нескольких MemoryStreams?

Исходя из моего последнего вопроса C # Добавить файл PDF в MemoryStream - Невозможно получить доступ к закрытому потоку Япытаюсь добавить шифрование PDF.

Из приведенного ниже примера, если строка pdfStamper.Close(); закомментирована, я не получаю ошибку Cannot access a closed Stream, но шифрование не применяется к сгенерированному 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;
}

Любая помощь будет высоко ценится: -)

1 Ответ

0 голосов
/ 15 мая 2018

Возможно, это не самое элегантное решение, но это решение этой конкретной проблемы, и я надеюсь, что оно окажется полезным для других.

Следующий код может использоваться вместе с исходным примером кода, просто закомментируйте все ссылки 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...