Нужна помощь в создании PDF из HTML с помощью itextsharp

Я пытаюсь создать PDF-файл из HTML-страницы. Я использую CMS EPiServer.

Это мой код до сих пор:

    protected void Button1_Click(object sender, EventArgs e)
    {
        naaflib.pdfDocument(CurrentPage);
    }


    public static void pdfDocument(PageData pd)
    {
        //Extract data from Page (pd).
        string intro = pd["MainIntro"].ToString(); // Attribute
        string mainBody = pd["MainBody"].ToString(); // Attribute

        // makae ready HttpContext
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ContentType = "application/pdf";

        // Create PDF document
        Document pdfDocument = new Document(PageSize.A4, 80, 50, 30, 65);
        //PdfWriter pw = PdfWriter.GetInstance(pdfDocument, HttpContext.Current.Response.OutputStream);
        PdfWriter.GetInstance(pdfDocument, HttpContext.Current.Response.OutputStream);  

        pdfDocument.Open();
        pdfDocument.Add(new Paragraph(pd.PageName));
        pdfDocument.Add(new Paragraph(intro));
        pdfDocument.Add(new Paragraph(mainBody));
        pdfDocument.Close();
        HttpContext.Current.Response.End();
    }

Это выводит содержимое названия статьи, вводного текста и основной части. Но он не парсит HTML, который есть в тексте статьи и макета нет.

Я попытался взглянуть на http://itextsharp.sourceforge.net/tutorial/index.html не став мудрее.

Любые указатели в правильном направлении приветствуются :)


person Steven    schedule 07.04.2010    source источник


Ответы (1)


Для более поздних версий iTextSharp:

Используя iTextSharp, вы можете использовать метод iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList() для создания PDF из HTML.

ParseToList() принимает TextReader (абстрактный класс) в качестве источника HTML, что означает, что вы можете использовать StringReader или StreamReader (оба используют TextReader в качестве базового типа). Я использовал StringReader и смог создать PDF-файлы из простой разметки. Я попытался использовать HTML-код, возвращенный с веб-страницы, и получил ошибки на всех страницах, кроме упрощенных. Даже найденная мною упрощенная веб-страница (http://black.ea.com/) отображала содержимое тег «head» страницы в PDF, поэтому я думаю, что метод HTMLWorker.ParseToList() разборчив в форматировании HTML, который он анализирует.

В любом случае, если вы хотите попробовать, вот тестовый код, который я использовал:

// Download content from a very, very simple "Hello World" web page.
string download = new WebClient().DownloadString("http://black.ea.com/");

Document document = new Document(PageSize.A4, 80, 50, 30, 65);
try {
    using (FileStream fs = new FileStream("TestOutput.pdf", FileMode.Create)) {
        PdfWriter.GetInstance(document, fs);
        using (StringReader stringReader = new StringReader(download)) {
            ArrayList parsedList = HTMLWorker.ParseToList(stringReader, null);
            document.Open();
            foreach (object item in parsedList) {
                document.Add((IElement)item);
            }
            document.Close();
        }
    }

} catch (Exception exc) {
    Console.Error.WriteLine(exc.Message);
}

Я не смог найти никакой документации, в которой HTML-конструкции HTMLWorker.ParseToList() поддерживаются; если вы это сделаете, пожалуйста, отправьте это здесь. Уверен, многим было бы интересно.

Для более старых версий iTextSharp: вы можете использовать метод iTextSharp.text.html.HtmlParser.Parse для создания PDF-файла на основе html.

Вот фрагмент, демонстрирующий это:

Document document = new Document(PageSize.A4, 80, 50, 30, 65); 
try  {
   using (FileStream fs = new FileStream("TestOutput.pdf", FileMode.Create)) {
      PdfWriter.GetInstance(document, fs);
      HtmlParser.Parse(document, "YourHtmlDocument.html");
   }
} catch(Exception exc)  { 
   Console.Error.WriteLine(exc.Message); 
} 

Одна (основная для меня) проблема заключается в том, что HTML должен быть строго XHTML-совместимым.

Удачи!

person Jay Riggs    schedule 08.04.2010
comment
Здорово. Спасибо. Может ли YourHtmlDocument.html быть URL-адресом страницы? - person Steven; 08.04.2010
comment
PS. Я не думаю, что в новейшей версии iTextSharp есть HtmlParser. Самое близкое, что я понимаю, это iTextSharp.text.html.simpleparser.HTMLWorker Но для этого требуется TextReader для синтаксического анализа..... - person Steven; 08.04.2010
comment
@Стивен - Ты прав! Извините, я загрузил старую тестовую программу (со старой версией iTextSharp), когда отвечал на ваш вопрос. Вы правы, HTMLWorker - это то, что вам нужно. Я отредактировал свой ответ на основе (ограниченного) тестирования, которое я провел с HTMLWorker и iTextSharp 5.0. - person Jay Riggs; 09.04.2010
comment
Отличная работа Джей! Если я правильно помню, я думаю, что веб-страницы должны использовать строгий XHTML или быть на 100% правильным XHTML. Может быть, поэтому он такой придирчивый! Я попробую. Если окажется, что это недостаточно хорошо, я буду использовать ABCpdf. - person Steven; 09.04.2010