2012-06-11 3 views
0

Преобразование сгенерированной страницы html в pdf с помощью iTextSharp, я не могу получить таблицу, созданную из asp: DataGrid, чтобы отображаться в PDF. Данной страницы HTML выход для DataGrid выглядит следующим образом:iTextSharp asp: DataGrid не отображается в PDF

<p>Purchases:</p> 
    <table rules="all" id="dg_Purchase" style="font-size: smaller; border-collapse: collapse;" border="1" cellspacing="0"> 
    <tbody><tr> 
     <td>Lot #</td> 
     <td>&nbsp;</td> 
     <td>Title</td> 
     <td align="right">Price</td> 
     <td align="right">Buyer's Premium</td> 
     <td align="right">Tax</td> 
     <td align="right">Sub Total</td> 
    </tr><tr> 
     <td>118</td> 
     <td><input id="dg_Purchase_ctl02_CheckBox1" name="dg_Purchase$ctl02$CheckBox1" type="checkbox"></td> 
     <td>Yih-Wen Kuo (1959, Taiwan)</td> 
     <td align="right">$1,900.00</td> 
     <td align="right">$332.50</td> 
     <td align="right">$0.00</td> 
     <td align="right">$2,232.50</td> 
    </tr><tr> 
     <td>119</td> 
     <td><input id="dg_Purchase_ctl03_CheckBox1" name="dg_Purchase$ctl03$CheckBox1" type="checkbox"></td> 
     <td>Yih-Wen Kuo (1959, Taiwan)</td> 
     <td align="right">$1,800.00</td> 
     <td align="right">$315.00</td> 
     <td align="right">$0.00</td> 
     <td align="right">$2,115.00</td> 
    </tr> 
</tbody></table> 

<p>Payments:</p> 
    <table rules="all" id="dg_Payment" style="font-size: smaller; border-collapse: collapse;" border="1" cellspacing="0"> 
    <tbody><tr> 
     <td style="width: 120px;">Payment Method</td> 
     <td>Date</td> 
     <td align="right">Amount&nbsp;&nbsp;</td> 
    </tr><tr> 
     <td>Total</td> 
     <td>&nbsp;</td> 
     <td align="right">$0.00</td> 
    </tr> 
</tbody></table> 

Когда страница HTML просматривается таблица выглядит точно так же, как это должно быть. Но когда я создаю PDF, таблица (или, вернее, все внутри таблицы) не отображается. Видно только граница, в значительной степени являющаяся прямой линией 2 px для каждой таблицы.

Так что в моем обычном сценарии, после загрузки всей страницы, самая последняя вещь, которую я делаю, это:

StringWriter stringWriter = new StringWriter(); 
    HtmlTextWriter writer = new HtmlTextWriter(stringWriter); 
    Render(writer); 

Функции для iTextSharp ниже:

protected override void Render(HtmlTextWriter writer) 
{ 
    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); 
} 

public void CreatePDFDocument(string strHtml) 
{ 

    string strFileName = HttpContext.Current.Server.MapPath("test.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); 
    HTMLWorker obj = new HTMLWorker(document); 
    document.Open(); 
    obj.Parse(se); 
    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(); 
} 

Опять же, все на страница, установленная программно, отображается в PDF EXCEPT для datagrid. Выходя из границ, похоже, что это не вопрос width. Он просто кажется пустым, все. Любая помощь будет принята с благодарностью.

ответ

0

Ну, я не мог найти рифму или причину, почему это не сработает, поэтому я пошел другим путем. Я решил сделать страницу, которая генерирует HTML-код вторичной страницы, и имеет тот, который создает PDF, просто ссылаясь на него. Я закончил с:

String address = "http://address.com/admin/Invoice2.aspx?sale_id=" + sale_id + "&bidder_number=" + bidder_number; 

using (WebClient wc = new WebClient()) 
{ 
    string content = wc.DownloadString(address); 
    CreatePDFDocument(content); 
} 

в моем методе загрузки страницы, а просто держали другие 2 функции:

public void CreatePDFDocument(string strHtml) 
{ 

    string strFileName = HttpContext.Current.Server.MapPath("invoice.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); 
    HTMLWorker obj = new HTMLWorker(document); 
    document.Open(); 
    obj.Parse(se); 
    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(); 
} 

Теперь мне просто нужно, чтобы получить стиль таблиц для передачи в формате PDF и Я буду хорош. Но это еще одна проблема.

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