Генерация HTML в PDF с использованием itextsharp - PullRequest
3 голосов
/ 18 февраля 2011
public void pdfgenforffd(TextBox TextBox3, HiddenField HiddenField1, HiddenField HiddenField4, AjaxControlToolkit.HTMLEditor.Editor Editor1)
{

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType = "application/pdf";
    // Create PDF document
    Document pdfDocument = new Document(PageSize.A4, 50, 25, 15, 10);

    PdfWriter wri = PdfWriter.GetInstance(pdfDocument, new FileStream("d://" + HiddenField1.Value + "_" + HiddenField4.Value + ".pdf", FileMode.Create));

    PdfWriter.GetInstance(pdfDocument, HttpContext.Current.Response.OutputStream);

    pdfDocument.Open();
    string htmlText = Editor1.Content;
    //string htmlText = htmlText1.Replace(Environment.NewLine, "<br/>");

    HTMLWorker htmlWorker = new HTMLWorker(pdfDocument);

    htmlWorker.Parse(new StringReader(htmlText));


    pdfDocument.Close();
    HttpContext.Current.Response.End();
}

Я использую приведенный выше код для генерации PDF из HTML-текста в HTMLEditor (элемент управления ajax).Если я жестко закодирую таблицу с каждым столбцом различной ширины, в текст HTMLEditor, чем при создании pdf, столбец будет разделен поровну, т. Е. Все столбцы имеют фиксированный размер в pdf, даже если я укажу некоторую произвольную ширину для каждого столбца.

Iхотите создать PDF, который может конвертировать HTML в PDF, а также разделить столбец таблицы с указанной шириной.Как это сделать?

1 Ответ

8 голосов
/ 18 февраля 2011

Я не думаю, что HTMLWorker (iTextSharp) пока поддерживает ширину таблицы.

, поэтому вам необходимо:

  1. проанализировать ваш HTML, чтобы найти ширину столбцов - используйтерегулярное выражение или что-то вроде Html Agility Pack .

  2. вызов HTMLWorker.ParseToList () для перебора элементов iText и поиска PdfPTable (s)

  3. вручную установить ширину PdfPTable, вызвав SetWidthPercentage ()

, вот пример (исключая шаг 1)используя обработчик HTTP:

<%@ WebHandler Language='C#' Class='tableColumnWidths' %>
using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;

public class tableColumnWidths : IHttpHandler {
  public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "application/pdf";
    string html = @"
<html><head></head><body> 
<p>A paragraph</p>   
<table border='1'>
<tr><td>row1-column1</td><td>row1-column2</td><td>row1-column3</td></tr>
<tr><td>row2-column1</td><td>row2-column2</td><td>row2-column3</td></tr>
</table>
</body></html>
    ";
/*
 * need the Rectangle for later when we set the column widths
 */
    Rectangle rect = PageSize.LETTER;
    Document document = new Document(rect);
    PdfWriter.GetInstance(document, context.Response.OutputStream);
    document.Open();
/* 
 * iterate over iText elements
 */
    List<IElement> ie = HTMLWorker.ParseToList(
      new StringReader(html), null
    );
/*
 * page width
 */
    float pageWidth = rect.Width;
/*
 * look for PdfPTable(s)
 */
    foreach (IElement element in ie) {
      PdfPTable table = element as PdfPTable;
/*
 * set the column widths
 */
      if (table != null) {
        table.SetWidthPercentage(
          new float[] {
            (float).25 * pageWidth, 
            (float).50 * pageWidth, 
            (float).25 * pageWidth
          },
          rect
        );
      }
      document.Add(element); 
    } 
    document.Close();  
  }
  public bool IsReusable {
    get { return false; }
  }
}
...