我在文字中有一个html数据,我使用scan.pdf
从该html创建一个pdf文件说iTextsharp
。但是当我尝试使用File.Delete()删除创建的pdf文件时方法,它显示错误,如
D:\ Hosting \ filepath \ scan.pdf'因为它正由另一个进程使用
我该如何解决?
这是从html创建pdf文件的代码,并将其作为附件发送到某个mailid
string MailFormat = searchDt.Rows[0][1].ToString();
EmalBody.Append(MailFormat);
EmalBody.Replace("[Date]", DateTime.Today.ToString());
string emailbody = EmalBody.ToString();
message.Body = EmalBody.ToString();
***HTMLToPdf(emailbody, "scan.pdf");***
System.Net.Mail.Attachment attachment;
attachment = new System.Net.Mail.Attachment(Server.MapPath("scan.pdf"));
message.Attachments.Add(attachment);
message.IsBodyHtml = true;
message.Subject = "";
smtpClient.Send(message);
File.Delete("D://filepath//scan.pdf");
public void HTMLToPdf(string HTML, string FilePath)
{
Document document = new Document();
PdfWriter.GetInstance(document, new FileStream("D:\\filepath\\scan.pdf",FileMode.Create));
document.Open();
iTextSharp.text.html.simpleparser.StyleSheet styles = new iTextSharp.text.html.simpleparser.StyleSheet();
iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document);
hw.Parse(new StringReader(HTML));
document.Close();
}
答案 0 :(得分:1)
生成PDF文件后,您可能没有处置资源。通常通过在相应对象上调用“Close”和/或“Dispose”方法来完成。
如果对象实现IDisposable
,则可以使用using
构造。这样,一旦执行通过using
块,资源就会被释放(这也保证了即使using
块中存在异常也释放了资源。)
答案 1 :(得分:1)
在Textsharp中保存文件后,您仍然使用该文件,因为您没有cleaned
文件的所有句柄。您的编写器可能不在使用块中,通过检查它们是否是一次性的,可以查看应该处理哪些其他类。如果找到它们,请确保将它们丢弃,以便释放所有手柄。
一些示例代码:
using (FileStream stream = new FileStream(temp_filename, FileMode.Create))
{
iTextSharp.text.Document document = new iTextSharp.text.Document();
PdfWriter writer = PdfWriter.GetInstance(document, stream);
...
}
// Do the delete after using block
删除必须在您的使用区之外。如果仍有错误,请检查您使用该文件的代码(将其发送给客户端等)。
答案 2 :(得分:1)
实际上我忘了释放邮件附件对象,这就是我收到错误的原因。当我把这段代码attachment.Dispose();
时,错误就被清除了。
答案 3 :(得分:0)
我之前从未使用过这个Textsharp库,但我猜你可以通过在using块中创建文件来解决这个问题:
using(PdfWriter MyWriter=PdfWriter.GetInstance(Document,Stream))
{
...
}
或简单地在其上调用.dispose():
MyWriter.Dispose()
如果您可以显示您的代码,则有助于调试问题的确切位置。