Процесс не может получить доступ к файлу, потому что он используется другим процессом (iTextSharp c #) - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть обработчик загрузки PDF:

    // Build the PDF
    Manual.Functions.createEntireManual(ThisDownload.FileLocation);

    // Download file
    context.Response.Clear();
    context.Response.Buffer = false;
    context.Response.ContentType = "application/pdf";
    context.Response.AddHeader("Content-disposition", "attachment; filename=Construct2-Manual-Full.pdf");        
    context.Response.AddHeader("Content-Length", FileSize.ToString());
    context.Response.TransmitFile(Settings.ManualBinLocation + ThisDownload.ID + ".pdf");
    context.Response.Close();

Функция создания руководства выглядит следующим образом:

public static void createEntireManual(string PDFPath)
{
    iTextSharp.text.Document d = new iTextSharp.text.Document();
    d.Open();

    using (iTextSharp.text.pdf.PdfWriter p = iTextSharp.text.pdf.PdfWriter.GetInstance(d, new FileStream(PDFPath, FileMode.Create)))
    {
        d.Add(new Paragraph("Hello world!"));
    }            
}

Это выдает ошибку:

Exception Details: System.IO.IOException: The process cannot access the file 'C:\inetpub\wwwroot\manuals\26.pdf' because it is being used by another process.

Отлично, поэтому я добавляю d.Close() в мою функцию:

        d.Add(new Paragraph("Hello world!"));            
    }    
    d.Close();        
}

Но это броски:

Exception Details: System.Exception: The document is not open.

На линии d.Close(). Я попытался добавить новый объект Document в качестве оператора using, но это не понравилось, выдав бессмысленную ошибку:

Exception Details: System.Exception: The document is not open.

Об использовании закрывающей скобки.

Кто-нибудь более опытный с iTextSharp, помогите мне здесь?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Вам нужно , чтобы сохранить PDF в файловую систему? В противном случае гораздо проще напрямую использовать HttpResponse объект OutputStream. Вот простой пример:

<%@ WebHandler Language="C#" Class="handlerExample" %>
using System;
using System.Web;
using iTextSharp.text;  
using iTextSharp.text.pdf;

public class handlerExample : IHttpHandler {
  public void ProcessRequest (HttpContext context) {
    HttpResponse Response = context.Response;
    Response.ContentType = "application/pdf";
    Response.AddHeader(
      "Content-disposition", 
      "attachment; filename=Construct2-Manual-Full.pdf"
    );  
    using (Document document = new Document()) {
      PdfWriter.GetInstance(
        document, Response.OutputStream
      );
      document.Open();
      document.Add(new Paragraph("Hello World!"));
    }
  }
  public bool IsReusable { get { return false; } }
}

То, что вы не должны использовать оператор using, неверно. Приведенный выше пример упрощен, но может быть легко расширен; Исходя из того, как вы назвали свой метод выше, может быть, вы создаете руководство в формате PDF из ряда различных небольших документов PDF?

0 голосов
/ 30 ноября 2011

Понял, вы не должны использовать using вообще для объекта Document или PDFWriter.Этот код работает:

    /// <summary>
    /// Saves the entire manual as PDF
    /// </summary>
    public static void createEntireManual(string PDFPath)
    {
        Document d = new Document();
        PdfWriter.GetInstance(d, new FileStream(PDFPath, FileMode.Create));
        d.Open();
        d.SetPageSize(iTextSharp.text.PageSize.A4);
        Image Cover = Image.GetInstance(Settings.ManualBinLocation + "cover.png");
        Cover.SetAbsolutePosition(0, 0);
        d.Add(Cover);
        d.Close();              

    }
...