2012-03-30 190 views
2

以下是我的代码我正在生成ItextSharp的密码保护pdf。我怎样才能生成一个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'? – 2012-03-30 12:58:02

+1

我花了更多的时间格式化/修复你的问题,而不是我通常会花费的时间来回答问题。在SO – sehe 2012-03-30 13:14:24

回答

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

上需要一些努力来解决这个问题,这是事实,但他仍然以第二个他想避免的文件结束。 – 2012-03-30 19:24:08

+0

?!?!? 'InputFile'对我来说意味着**现有的**文件,即使代码段使用'FileMode.Create'。关于这个问题的第二个评论提到了代码片段被其他人大量修改过,所以任何人都猜测OP是否使用现有的PDF **或者**是从头开始创建PDF。而且你应该知道**既不** **临时文件**也** ** MemoryStream'对**任何情况都是必要的...... – kuujinbo 2012-03-30 20:08:25

+0

大家好,我真的很感谢你的建议。以上所有评论对我来说都很好。现在问题是它的直接保存到MyDocuments。我正在使用MVC3,我希望用户通过打开与密码保护对话来保存到自己的路径。可以帮助我解决这个问题。 – 2012-03-31 09:51:04

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); 
    } 
}