这是我在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();
答案 0 :(得分:2)
你需要小心处理所有事情。
using(var filesStream = new FileStream())
{
using(PdfWriter wri = PdfWriter.GetInstance(doc, fileStream))
{
...
}
}
答案 1 :(得分:0)
您可能想要关闭一些其他对象(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();
答案 2 :(得分:0)
您希望将文件提供给浏览器和/或您希望将文件保存在磁盘上。
在这种情况下,您将受益于在内存中创建文件,然后将字节发送到浏览器以及磁盘上的文件。在以下问题的答案中解释了这一点:Pdf file not loading properly created by the servlet
上面提到的答案是用Java编写的,所以你必须对它进行调整。
您可以通过查看其他示例来完成此操作。例如:Create PDF in memory instead of physical file
byte [] pdfBytes; 使用(var mem = new MemoryStream()) { 使用(PdfWriter wri = PdfWriter.GetInstance(doc,mem)) { doc.Open(); //打开要写的文档 段落段落=新段落(&#34;这是我使用段落的第一行。&#34;); 短语pharse =新短语(&#34;这是我使用Pharse的第二行。&#34;); Chunk chunk = new Chunk(&#34;这是我使用Chunk的第三行。&#34;);
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
:Can a Byte[] Array be written to a file in C#?
File.WriteAllBytes(string path, byte[] bytes)
如果问题仍然存在,那么您知道它不是由iTextSharp引起的,因为iTextSharp只会产生字节。
答案 3 :(得分:0)
除了其他人所说的内容之外,我强烈建议您将每个流程分成多个不相互影响的部分,并且彼此之间并不了解。然后尽可能独立地测试每个部分。例如:
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件事,因为这导致了某些东西锁定了我的文件,但我不知道&#34;。