2016-02-02 1 views
0

Я могу успешно создать/сгенерировать PDF-файл без каких-либо проблем. Но когда я пытаюсь загрузить его после того, как поколение, выполнение перенаправляется,Создание и загрузка (HTML в) PDF с использованием проблемы iTextSharp

void Application_Error(object sender, EventArgs e) 
{ 
    // Code that runs when an unhandled error occurs 
} 

На события нажатия кнопки, я создать файл PDF, который работает, как ожидалось, как показано ниже.

using System.Data; 
using iTextSharp.text; 
using iTextSharp.text.html.simpleparser; 
using iTextSharp.text.pdf; 
using System.Net; 

protected void Button2_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string htmlContent = "<div> PDF Code </div>"; // you html code (for example table from your page) 
     Document document = new Document(); 
     string FileName = Guid.NewGuid().ToString(); 
     PdfWriter.GetInstance(document, new FileStream("C:\\...\\...\\PDF\\" + FileName + ".pdf", FileMode.Create)); 
     document.Open(); 

     HTMLWorker worker = new HTMLWorker(document); 
     worker.Parse(new StringReader(htmlContent)); 

     document.Close(); 

     //To download same PDF I write below code 

     Response.Clear(); 
     string pdfPath = Server.MapPath(@"~\PDF\" + FileName + ".pdf"); 
     WebClient client = new WebClient(); 
     Byte[] buffer = client.DownloadData(pdfPath); 
     Response.ContentType = "application/pdf"; 
     Response.AddHeader("content-length", buffer.Length.ToString()); 
     Response.BinaryWrite(buffer); 
     Response.Flush(); 
     HttpContext.Current.ApplicationInstance.CompleteRequest(); 
     ////Response.End(); 

    } 
    catch (Exception ex) 
    { 
     Response.Write(ex.Message.ToString()); 
    } 
} 

Этот код не является никаким исключением, а перенаправляется на вышеупомянутый метод. Пожалуйста помоги.

Что я хочу - это событие щелчка кнопки, я хочу сгенерировать PDF и загрузить его. Пробовал так много всего, но не добился успеха.

ответ

0

[...] Метод CompleteRequest() не завершает выполнение, когда он вызывается. Так что, если это действительно то, что вы хотите сделать, то Response.Redirect (string) - это путь.

CompleteRequest() просто обходит метод Response.End(), который генерирует исключение ThreadAbortException, которое вы упомянули, но в решающей ситуации CompleteRequest() очищает буфер ответа. Это означает, что ответ HTTP перенаправления HTTP 302 отправляется браузеру в строке, где вы вызываете CompleteRequest(), что дает вам возможность выполнять операции, которые не влияют на ответ после его отправки пользователю. [...]

Source

+0

клика Попробованных ваше предложения. Но тогда он не загружает PDF-файл. Не знаю, почему. – nyks

+0

Вы использовали 'Response.End()' вместо 'CompleteRequest()'? –

+0

Да пробовал. Послушай, я отправил свой ответ. теперь он создает PDF-файл, но все же он напрямую открывает его браузеру. Я хочу просто загрузить его, чтобы пользователь сам открыл файл. Так или иначе? – nyks

0

Я в состоянии решить мою проблему в последнее время, добавив следующий код page_load() событие,

protected void Page_Load(object sender, EventArgs e) 
     { 
      ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); 
      scriptManager.RegisterPostBackControl(this.Button2); 

      //where button2 is the button by which pdf is generated and post back happens.   

     } 

Ниже новый код работает абсолютно нормально.

protected void Button2_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       string htmlContent = "<div> PDF Code </div>"; // you html code (for example table from your page) 
       Document document = new Document(); 
       string FileName = Guid.NewGuid().ToString(); 
       PdfWriter.GetInstance(document, new FileStream("C:\\...\\...\\PDF\\" + FileName + ".pdf", FileMode.Create)); 
       document.Open(); 
       HTMLWorker worker = new HTMLWorker(document); 
       worker.Parse(new StringReader(htmlContent)); 
       document.Close(); 
       Response.ContentType = "application/pdf"; 
       Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName + ".pdf"); 
       Response.TransmitFile(Server.MapPath(@"~\PDF\" + FileName + ".pdf")); 
       Response.End(); 
      } 
      catch (Exception ex) 
      { 
       Response.Write(ex.Message.ToString()); 
      } 
     } 
+0

Но этот код напрямую открывает PDF в браузере. Я просто хочу его загрузить. – nyks

+1

Вы можете использовать это: 'return File (buffer, application/pdf), fileName)' –

+0

Попробуйте взломать из старой школы использование ContentType 'application/octet-stream'. –

0

добавить этот код в случае

Response.ContentType = "application/pdf"; 
Response.AddHeader("content-disposition", "attachment;filename=Panel.pdf"); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
StringWriter sw = new StringWriter(); 
HtmlTextWriter hw = new HtmlTextWriter(sw); 
pnlPerson.RenderControl(hw); 
StringReader sr = new StringReader(sw.ToString()); 
Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f); 
HTMLWorker htmlparser = new HTMLWorker(pdfDoc); 
PdfWriter.GetInstance(pdfDoc, Response.OutputStream); 
pdfDoc.Open(); 
htmlparser.Parse(sr); 
pdfDoc.Close(); 
Response.Write(pdfDoc); 
Response.End(); 

 Смежные вопросы

  • Нет связанных вопросов^_^