2012-05-03 58 views
0

的點擊一個PDF我有一個新的要求,在我的網頁中的按鈕,點擊後,它會顯示該網頁爲PDF。在研究中,我發現iTextSharp用於此目的。 但我在我的網頁上也有很多Telerik和ASP控件。我是否也可以使用iTextSharp在PDF中獲得?顯示Web頁面的一個按鈕

如果是,那麼任何人都可以,請給我提供一個基礎環節,因爲我還沒有碰到過這個工具來又開始使用iTextSharp

據@ahaliav我用下面的代碼試圖答案。但是,我沒有掌握pdf。

protected void btnExport_Click(object sender, EventArgs e) 
    { 
     Response.ContentType = "application/pdf"; 
     Response.AddHeader("content-disposition", "attachment;filename=TestPage.pdf"); 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 

     MemoryStream msOutput = new MemoryStream(); 
     TextReader reader = new StringReader(HtmlContent); 

     // step 1: creation of a document-object 
     Document document = new Document(PageSize.A4, 30, 30, 30, 30); 
     HTMLWorker worker = new HTMLWorker(document); 
     // step 2: 
     // we create a writer that listens to the document 
     // and directs a XML-stream to a file 
     PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream); 

     // step 3: we create a worker parse the document 

     // step 4: we open document and start the worker on the document 
     document.Open(); 
     worker.StartDocument(); 

     // step 5: parse the html into the document 
     worker.Parse(reader); 

     // step 6: close the document and the worker 
     worker.EndDocument(); 
     worker.Close(); 
     document.Close(); 
     //Response.Write(document); 
     //Response.End(); 

    } 
    protected override void Render(HtmlTextWriter writer) 
    { 
     // setup a TextWriter to capture the markup 
     TextWriter tw = new StringWriter(); 
     HtmlTextWriter htw = new HtmlTextWriter(tw); 

     // render the markup into our surrogate TextWriter 
     base.Render(htw); 

     // get the captured markup as a string 
     string pageSource = tw.ToString(); 

     // render the markup into the output stream verbatim 
     writer.Write(pageSource); 

     // remove the viewstate field from the captured markup 
     HtmlContent = Regex.Replace(pageSource, 
      "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=\".*?\" />", 
      "", RegexOptions.IgnoreCase); 

     // the page source, without the viewstate field, is in viewStateRemoved 
     // do what you like with it 

    } 

請幫忙。 我還有其他的選擇,那就是當我點擊一個按鈕時顯示整個網頁的圖像。任何人都可以引導我對這兩個問題的任何可能的方向。

我終於改變了我的代碼:

 Response.ContentType = "application/msword"; 
     Response.AddHeader("content-disposition", "attachment;filename=TestPage.doc"); 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     MemoryStream msOutput = new MemoryStream(); 

有了這個,我能夠得到一個包含所有我的控制MSWORD文件,但我也得到了一些不必要的文本,我怎麼能刪除,如果有人遇到同樣的問題?

+1

我使用許可[wkhtmltopdf(http://code.google.com/p/wkhtmltopdf/)我的一個項目是基於網頁生成PDF。 –

+0

我可以得到telerik控件也在那個pdf –

+0

不知道,但我的猜測是否定的。 –

回答

1

經過一番研究,我沒有發現顯示在html控件的任何解決方案下面這段代碼工作正常,但用了顯示控制,在我用這個http://www.winnovative-software.com/過去 和它的作品很好的HTML頁面,包括所有controlls您還可以測試它onlie,「唯一」的問題是你需要支付

protected void btnExportToPdf_Click(object sender, EventArgs e) 
    { 
     renderPDF = true; 
    } 

    protected override void Render(HtmlTextWriter writer) 
    {   
     if (renderPDF == true) 
     { 
      MemoryStream mem = new MemoryStream(); 
      StreamWriter twr = new StreamWriter(mem); 
      HtmlTextWriter myWriter = new HtmlTextWriter(twr); 
      base.Render(myWriter); 
      myWriter.Flush(); 
      myWriter.Dispose(); 
      StreamReader strmRdr = new StreamReader(mem); 
      strmRdr.BaseStream.Position = 0; 
      string pageContent = strmRdr.ReadToEnd(); 
      strmRdr.Dispose(); 
      mem.Dispose(); 
      writer.Write(pageContent); 
      CreatePDFDocument(pageContent); 
     } 
     else 
     { 
      StringBuilder sb = new StringBuilder(); 
      HtmlTextWriter tw = new HtmlTextWriter(new System.IO.StringWriter(sb)); 
      base.Render(tw); 
      // get the captured markup as a string 
      string pageSource = tw.ToString(); 
      //Get the rendered content 
      string sContent = sb.ToString(); 
      //Now output it to the page, if you want 
      writer.Write(sContent); 
     } 
    } 

    public void CreatePDFDocument(string strHtml) 
    { 


     string strHTMLpath = Server.MapPath("MyHTML.html"); 
     StreamWriter strWriter = new StreamWriter(strHTMLpath, false, Encoding.UTF8); 
     strWriter.Write(strHtml); 
     strWriter.Close(); 
     string strFileName = HttpContext.Current.Server.MapPath("map1.pdf"); // strFileName "C:\\Inetpub\\wwwroot\\Test\\map1.pdf" 
     // step 1: creation of a document-object 
     Document document = new Document(); 
     // step 2: 
     // we create a writer that listens to the document 
     PdfWriter.GetInstance(document, new FileStream(strFileName, FileMode.Create)); 
     StringReader se = new StringReader(strHtml); 
     TextReader tr = new StreamReader(Server.MapPath("MyHTML.html")); 

     //add the collection to the document 
     document.Open();       
     ///////// 
     iTextSharp.text.html.simpleparser.HTMLWorker worker = new iTextSharp.text.html.simpleparser.HTMLWorker(document); 

     worker.StartDocument(); 

     //// step 5: parse the html into the document 
     worker.Parse(tr); 

     //// step 6: close the document and the worker 
     worker.EndDocument(); 

     //worker.Parse(tr); // getting error "Illegal characters in path" 
     document.Close(); 
     ShowPdf(strFileName); 
    } 
    public void ShowPdf(string strFileName) 
    { 
     Response.ClearContent(); 
     Response.ClearHeaders(); 
     Response.AddHeader("Content-Disposition", "inline;filename=" + strFileName); 
     Response.ContentType = "application/pdf"; 
     Response.WriteFile(strFileName); 
     Response.Flush(); 
     Response.Clear(); 
    } 
0

iTextSharp的自帶的小夥伴:XML Worker

對於一個演示,看看here

即使documentation引用了Java API,對C#的適應也應該很簡單。

至於Telerik的/ ASP代碼,你可以擴展XMLWorker並確定如何這樣的標籤轉換成PDF元素。

+0

我進一步修改了我的問題,請幫助 –

+0

您向原始問題添加了一個新問題。你應該爲此創建一個新問題。 –

+0

對不起,但你可以請你幫我,我會發佈一個新的問題 –

相關問題