2012-03-30 2 views
2

Ниже мой код Я создаю Защищенный паролем pdf от ItextSharp.Как я могу сгенерировать только один PDF

Фактически два pdf получают генерирование и сохранение.

Но я хочу сохранить только файл.

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

Поистине оцените вашу помощь.

Letter1 mydoc = new Letter1(); 
mydoc.GenerateLetter(); 
string WorkingFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
string InputFile = Path.Combine(WorkingFolder, "Testing1.pdf"); 
FileStream f = new FileStream(InputFile, FileMode.Create); 
f.Write(mydoc.DocumentBytes, 0, mydoc.DocumentBytes.Length); 
f.Close(); 
string OutputFile = Path.Combine(WorkingFolder, "TestingOut1.pdf"); 
using (Stream input = new FileStream(InputFile, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read)) 
{ 
    using (Stream output = new FileStream(OutputFile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     PdfReader reader = new PdfReader(input); 
     PdfEncryptor.Encrypt(reader, output, true, "abc123", "secret", PdfWriter.ALLOW_SCREENREADERS); 
    } 
} 
+0

Не могли бы вы просто удалить временный входной файл 'Testing1.pdf' после завершения выходного файла? –

+1

Я потратил больше времени на форматирование/исправление вашего вопроса, чем я обычно проводил, отвечая на вопрос. Вложение некоторого усилия в вопрос несколько требуется на SO – sehe

ответ

0

Нет необходимости инстанцирует отдельный поток для чтения PDF, который вы хотите зашифровать. Используйте PdfReader overloaded constructor that accepts a file path. Что-то вроде этого:

PdfReader reader = new PdfReader(InputFile); 
using (Stream output = new FileStream(
    OutputFile, FileMode.Create, FileAccess.Write, FileShare.None 
)) 
{ 
    PdfEncryptor.Encrypt(
    reader, output, true, "abc123", "secret", PdfWriter.ALLOW_SCREENREADERS 
);  
} 
+0

Это правда, но он все еще получает второй файл, который он хочет избежать. –

+0

?!?!? 'InputFile' для меня означает ** существующий ** файл, хотя фрагмент кода использует' FileMode.Create'. Второе замечание по этому вопросу упоминает фрагмент кода, сильно модифицированный кем-то другим, поэтому кто-то догадывается, использует ли OP существующий PDF ** или **, создает PDF с нуля. И вы не знаете, что ** ни ** временный файл **, ни ** 'MemoryStream' не требуется для ** либо ** case ... – kuujinbo

+0

Привет всем, я действительно ценю ur Suggestions. Все выше Комментарии отлично работают для меня. Теперь проблема в том, что он непосредственно получает сохранение в MyDocuments. Я использую MVC3, и я хочу, чтобы пользователь сохранил свой собственный путь, открыв диалог с Password Potected.Can u giys, пожалуйста, помогите мне в этом. –

3

рассмотреть вопрос об использовании MemoryStream

неопробованные код (написанный в браузере :)

using (MemoryStream m = new MemoryStream()) 
{ 
    m.Write(mydoc.DocumentBytes, 0, mydoc.DocumentBytes.Length); 
    m.Seek(0, SeekOrigin.Origin); 

    string OutputFile = Path.Combine(WorkingFolder, "TestingOut1.pdf"); 
    using (Stream output = new FileStream(OutputFile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     PdfReader reader = new PdfReader(m); 
     PdfEncryptor.Encrypt(reader, output, true, "abc123", "secret", PdfWriter.ALLOW_SCREENREADERS); 
    } 
} 
Смежные вопросы