Ошибка преобразования в PDF: в документе нет страниц в document.close () - PullRequest
3 голосов
/ 02 декабря 2011

Код ниже, который я использую для преобразования панели данных в PDF. Но он выдает ошибку:

В документе нет страниц на месте document.close ()

Вот мой код:

protected void ConvertPDF_click(object sender, EventArgs e)
{
    string attachment = "attachment; filename=test.pdf";
    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/pdf";
    StringWriter stw = new StringWriter();
    HtmlTextWriter htextw = new HtmlTextWriter(stw);
    htextw.AddStyleAttribute("font-size", "7pt");
    htextw.AddStyleAttribute("color", "Black");

    Panel1.RenderControl(htextw);//Name of the Panel
    Document document = new Document();
    document = new Document(PageSize.A4, 5, 5, 15, 5);
    FontFactory.GetFont("Arial", 50, iTextSharp.text.BaseColor.BLUE);
    PdfWriter.GetInstance(document, Response.OutputStream);
    document.Open();

    StringReader str = new StringReader(stw.ToString());
    HTMLWorker htmlworker = new HTMLWorker(document);
    htmlworker.Parse(str);

    document.Close();
    Response.Write(document);
}

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Не вижу, что находится под вашим Panel управлением сервером, но ваш код выглядит нормально.И если Panel содержит только простой HTML, необязательно добавлять объекты HTML IElement по отдельности (при вызове HTMLWorker.ParseToList()) к объекту Document, как предложено @VahidN.Вот простой пример - .aspx file:

<%@ Page Language='C#' AutoEventWireup='true' CodeFile='panelTest.aspx.cs' Inherits='panelTest' %>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head runat='server'><title></title></head>
<body><form id='form1' runat='server'>
<asp:Panel ID='testPanel' runat='server'>
<h1>A H1 Heading</h1>
<table width='100%' border='1' align='center' 
  cellpadding='4' cellspacing='0' 
>
<tr><td>TABLE ROW 1: CELL 1</td></tr>
<tr><td>TABLE ROW 2: CELL 1</td></tr>
</table>
<p>A Paragraph with <strong>bold</strong> and <em>italic</em> text.</p>
</asp:Panel>
<asp:Button runat='server'
  oncommand='process'
  text='Convert HtmlControl to PDF'
/>
</form></body></html>

Файл с выделенным кодом:

using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;

public partial class panelTest : Page {
  protected void process(object sender, CommandEventArgs e) {
    string attachment = "attachment; filename=test.pdf";
    Response.AddHeader("content-disposition", attachment);    
    Response.ContentType = "application/pdf";
    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
    htmlWriter.AddStyleAttribute("font-size", "10pt");
    htmlWriter.AddStyleAttribute("color", "Black");      
    testPanel.RenderControl(htmlWriter);
    using (Document document = new Document()) {
      PdfWriter.GetInstance(document, Response.OutputStream);
      document.Open();
      StringReader stringReader = new StringReader(stringWriter.ToString());
      HTMLWorker htmlworker = new HTMLWorker(document);
      htmlworker.Parse(stringReader);    
    }
    Response.End();
  }
}

С учетом сказанного - если Panel содержит дочерние элементы управления или сложный HTML (изображения дляпример) у вас будут проблемы.Вы должны принять во внимание, что HTMLWorker является очень простым анализатором.

1 голос
/ 02 декабря 2011

htmlworker.Parse метод дает вам проанализированные элементы. Он анализирует элементы html и преобразует их в эквивалентные им элементы iTextSharp. Теперь вы должны добавить их в документ.

...