[英]Unable to access a file created in a web application
这是我在wcf服务中使用的代码。 它成功生成了PDF,但是在生成文档之后,生成PDF的文件夹给出了错误: “拒绝访问”
对于网站,PDF已关闭,但对于连续Web服务,则未关闭。
string r = builder.ToString();
string pdfname = Fuhre + "_" + ProtokolType + "_" + GeraeteNr + "_" + r;
PdfWriter.GetInstance(document, new FileStream(@"C:\inetpub\wwwroot\protokoll_pdfs\"+pdfname+".pdf",FileMode.Create));
document.Open();
WebClient wc = new WebClient();
string htmlText = html;
//Response.Write(htmlText);
List<IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(htmlText), null);
for (int k = 0; k < htmlarraylist.Count; k++)
{
document.Add((IElement)htmlarraylist[k]);
}
pdflink1 = pdfname + ".pdf";
htmlpdflink =""+pdflink1;
document.Close();
您需要小心处理所有内容。
using(var filesStream = new FileStream())
{
using(PdfWriter wri = PdfWriter.GetInstance(doc, fileStream))
{
...
}
}
您可能要关闭其他一些对象(Stream,Document)。 下面显示了如何执行该操作的示例。
FileStream stream = new FileStream(filePath, FileMode.CreateNew);
Document doc = new Document(PageSize.A4, 24, 24, 24, 24);
PdfWriter writer = PdfWriter.GetInstance(doc, stream);
doc.Open();
//PDF writing operations here
writer.Flush();
doc.Close();
writer.Close();
stream.Close();
您想要将文件提供给浏览器和/或要将文件保存在磁盘上。
在这种情况下,您将受益于在内存中创建文件,然后将字节发送到浏览器以及磁盘上的文件。 在以下问题的答案中对此进行了解释: servlet无法正确加载Pdf文件
上面提到的答案是用Java编写的,因此您必须对其进行调整。
您可以通过查看其他示例来做到这一点。 例如: 在内存而不是物理文件中创建PDF
byte [] pdfBytes; using(var mem = new MemoryStream()){using(PdfWriter wri = PdfWriter.GetInstance(doc,mem)){doc.Open(); //打开要写入段落的文档段落= new段落(“这是我的第一行使用段落。”); 短语pharse =新短语(“这是我使用Pharse的第二行。”); 块=新块(“这是我使用块的第三行。”);
doc.Add(paragraph);
doc.Add(pharse);
doc.Add(chunk);
}
pdfBytes = mem.ToArray();
}
现在,您可以将pdfBytes
写入Web应用程序中的Response
对象:
private void ShowPdf(byte[] strS)
{
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now);
Response.BinaryWrite(strS);
Response.End();
Response.Flush();
Response.Clear();
}
您可以重复使用字节将它们写入File
: 可以将Byte []数组写入C#中的文件吗?
File.WriteAllBytes(string path, byte[] bytes)
如果问题仍然存在,那么您就知道这不是由iTextSharp引起的,因为iTextSharp仅产生字节。
除了其他人所说的之外,我强烈建议您将每个过程分为多个部分,这些部分不相互影响甚至彼此不了解。 然后,尽可能独立地测试每个部分。 例如:
private void makePDF( filePath )
{
//Create the PDF
}
private void main()
{
//Make the PDF
makePDF( "test.pdf" );
//If this line fails then your makePDF code has an open handle
File.Delete( "test.pdf" );
}
然后继续:
private void makePDF( filePath )
{
//Create the PDF
}
private void emailPDF( filePath )
{
//Email the PDF
}
private void main()
{
//Make the PDF
makePDF( "test.pdf" );
emailPDF( "test.pdf" );
//If this line fails now then your emailPDF code has an open handle
File.Delete( "test.pdf" );
}
如果您不一次尝试500件事,则很重要,因为这会导致“某事锁定了我的文件,但我不知道是什么”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.