Base64 Кодировать PDF в C #? - PullRequest
       20

Base64 Кодировать PDF в C #?

28 голосов
/ 24 января 2009

Может кто-нибудь подсказать, как это сделать? Я могу сделать это для обычного текста или байтового массива, но не знаю, как подойти для PDF. мне сначала вставить pdf в байтовый массив?

Ответы [ 2 ]

43 голосов
/ 24 января 2009

Используйте File.ReadAllBytes для загрузки файла PDF, а затем закодируйте байтовый массив как обычно, используя Convert.ToBase64String(bytes).

35 голосов
/ 29 марта 2009

Есть способ, которым вы можете сделать это порциями, чтобы вам не приходилось сжигать тонну памяти сразу.

.Net включает в себя кодировщик, который может выполнять разбиение на фрагменты, но это своего рода странное место. Они помещают его в пространство имен System.Security.Cryptography.

Я протестировал приведенный ниже пример кода и получаю идентичный вывод, используя либо мой метод, либо метод Эндрю выше.

Вот как это работает: вы запускаете класс под названием CryptoStream. Это своего рода адаптер, который подключается к другому потоку. Вы подключаете класс CryptoTransform к CryptoStream (который, в свою очередь, присоединяется к вашему файлу / памяти / сетевому потоку), и он выполняет преобразования данных во время чтения или записи в поток.

Обычно преобразование - это шифрование / дешифрование, но .net также включает преобразования ToBase64 и FromBase64, поэтому мы не будем шифровать, просто кодируем.

Вот код. Я включил (возможно, плохо названную) реализацию предложения Эндрю, чтобы вы могли сравнить вывод.


    class Base64Encoder
    {
        public void Encode(string inFileName, string outFileName)
        {
            System.Security.Cryptography.ICryptoTransform transform = new System.Security.Cryptography.ToBase64Transform();
            using(System.IO.FileStream inFile = System.IO.File.OpenRead(inFileName),
                                      outFile = System.IO.File.Create(outFileName))
            using (System.Security.Cryptography.CryptoStream cryptStream = new System.Security.Cryptography.CryptoStream(outFile, transform, System.Security.Cryptography.CryptoStreamMode.Write))
            {
                // I'm going to use a 4k buffer, tune this as needed
                byte[] buffer = new byte[4096];
                int bytesRead;

                while ((bytesRead = inFile.Read(buffer, 0, buffer.Length)) > 0)
                    cryptStream.Write(buffer, 0, bytesRead);

                cryptStream.FlushFinalBlock();
            }
        }

        public void Decode(string inFileName, string outFileName)
        {
            System.Security.Cryptography.ICryptoTransform transform = new System.Security.Cryptography.FromBase64Transform();
            using (System.IO.FileStream inFile = System.IO.File.OpenRead(inFileName),
                                      outFile = System.IO.File.Create(outFileName))
            using (System.Security.Cryptography.CryptoStream cryptStream = new System.Security.Cryptography.CryptoStream(inFile, transform, System.Security.Cryptography.CryptoStreamMode.Read))
            {
                byte[] buffer = new byte[4096];
                int bytesRead;

                while ((bytesRead = cryptStream.Read(buffer, 0, buffer.Length)) > 0)
                    outFile.Write(buffer, 0, bytesRead);

                outFile.Flush();
            }
        }

        // this version of Encode pulls everything into memory at once
        // you can compare the output of my Encode method above to the output of this one
        // the output should be identical, but the crytostream version
        // will use way less memory on a large file than this version.
        public void MemoryEncode(string inFileName, string outFileName)
        {
            byte[] bytes = System.IO.File.ReadAllBytes(inFileName);
            System.IO.File.WriteAllText(outFileName, System.Convert.ToBase64String(bytes));
        }
    }

Я также играю с тем, где я прикрепляю CryptoStream. В методе Encode я присоединяю его к потоку вывода (записи), поэтому, когда я создаю экземпляр CryptoStream, я использую его метод Write ().

Когда я читаю, я присоединяю его к потоку ввода (чтения), поэтому я использую метод read в CryptoStream. Неважно, к какому потоку я присоединяю его. Мне просто нужно передать соответствующий член перечисления Read или Write конструктору CryptoStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...