2

我在文字中有一个 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();
    }
4

4 回答 4

1

生成 PDF 文件后,您可能不会释放资源。通常通过在相应对象上调用“关闭”和/或“处置”方法来完成。

如果对象实现了IDisposable,您可以只使用using构造。这样,一旦执行通过using块,资源就会被释放(这也保证了即使using块内有异常也会释放资源)。

于 2013-04-05T09:52:03.693 回答
1

在 Textsharp 中保存文件后,您仍然可以使用该文件,因为您还没有cleaned处理该文件的所有句柄。您的编写器可能不在 using 块中,通过检查它们是否是一次性的来查看应该处理哪些其他类。如果找到它们,请确保将它们丢弃,以便释放所有手柄。

一些示例代码:

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

删除必须在您的 using 块之外。如果您仍然有错误,请检查您使用文件的代码(将其发送到客户端等)。

于 2013-04-05T09:52:49.943 回答
1

实际上我忘了释放邮件附件对象,这就是我收到错误的原因。当我输入此代码attachment.Dispose();时,错误被清除了。

于 2013-04-05T11:16:35.660 回答
0

我以前从未使用过这个 Textsharp 库,但我猜你可以通过在 using 块中创建文件来解决这个问题:

using(PdfWriter MyWriter=PdfWriter.GetInstance(Document,Stream))
{
...
}

或者简单地调用 .dispose() :

MyWriter.Dispose()

如果您可以显示您的代码,这将有助于调试问题的确切位置。

于 2013-04-05T09:58:17.983 回答