2017-05-25 56 views
0

想只是一个文本添加到使用itextsharp 。而到目前为止,我done.my代码现有的PDF =>无法访问已关闭的文件.net MVC?

public FileStreamResult DownloadCertificate(string UserId) 
    { 
     //get user info using UserId from database 
     //UserDetail UserDetail = db.UserDetails.Where(x => x.UserId == UserId).FirstOrDefault(); 
     string oldFile = Server.MapPath("~/Content/img/tsms/Certificate/Certificate-of-Completion-Award-Template-Blue.pdf"); 
     string newFile = Server.MapPath("~/Content/img/tsms/Certificate/newFile.pdf"); 
     // open the reader 
     PdfReader reader = new PdfReader(oldFile); 
     Rectangle size = reader.GetPageSizeWithRotation(1); 
     Document document = new Document(size); 
     // open the writer 
     FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write); 
     PdfWriter writer = PdfWriter.GetInstance(document, fs); 
     document.Open(); 
     // the pdf content 
     PdfContentByte cb = writer.DirectContent; 
     // select the font properties 
     BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
     cb.SetColorFill(BaseColor.DARK_GRAY); 
     cb.SetFontAndSize(bf, 8); 
     // write the text in the pdf content 
     cb.BeginText(); 
     string text = "Some random blablablabla..."; 
     // put the alignment and coordinates here 
     cb.ShowTextAligned(1, text, 520, 640, 0); 
     cb.EndText(); 
     // write the text in the pdf content 
     cb.BeginText(); 
     text = "Other random blabla..."; 
     // put the alignment and coordinates here 
     cb.ShowTextAligned(2, text, 100, 200, 0); 
     cb.EndText(); 
     // create the new page and add it to the pdf 
     PdfImportedPage page = writer.GetImportedPage(reader, 1); 
     cb.AddTemplate(page, 0, 0); 
     // close the streams and voilá the file should be changed :) 
     document.Close(); 
     fs.Close(); 
     writer.Close(); 
     reader.Close(); 
     return new FileStreamResult(fs, "application/pdf"); 
    } 

的问题是,当我试图访问显示我像错误的方法浏览器下面=> enter image description here

我不知道为什么它给了我这种错误。

我试图找到解决方案。我发现.... FileStream "cannot access closed file"

但这对我来说还不够。

我也尝试改变我的代码中的一些行。下面=>

// close the streams and voilá the file should be changed :) 
    document.Close(); 
    //fs.Close(); 
    //writer.Close(); 
    //reader.Close(); 
    return new FileStreamResult(fs, "application/pdf"); 

但这种改变也没有帮助我。在我的代码中我做了什么错误(也是如何为用户提供下载模式)。

+0

你有两个问题。您已将您的问题的第一部分用您更改的块“下面的=>”回答 - 您在关闭“fs.close”后尝试访问“fs”。你想保存你的FileStreamResult到一个局部变量,然后关闭你的文档,文件流等等,最后返回本地的FileStreamResult变量。你的错误信息已经给你答案。重读它,并查看您的变量名称以及您关闭它们并访问它们以寻找线索的位置。 GL – mjw

+0

@mjw你是对的。现在更改'//document.Close(); //fs.Close(); //writer.Close(); //reader.Close();'但之后,它显示我anothre错误[链接](https://postimg.org/image/vp3wesgb1/)你可以说任何关于... –

+0

改变你的FileStream构造函数调用to:FileStream fs = new FileStream(newFile,FileMode.Create,FileAccess.ReadWrite); – mjw

回答

0

它在我看来像是FileStream的问题。我的教育猜测是document.Close();的电话也是关闭FileStream

您可以尝试不重复使用相同的数据流,而是打开一个新的只读文件(它也将重置其位置,并将其用于结果)。

相关问题