2010-04-07 2 views
5

Я пытаюсь создать PDF-файл с HTML-страницы. CMS, которую я использую, - это EPiServer.Нужна помощь при создании PDF из HTML с помощью itextsharp

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

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, не принимая никаких разумных решений.

Все указатели на правильном направлении очень ценится :)

ответ

5

Для более поздних версий 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 совместимыми.

Удачи вам!

+0

Отлично. Благодарю. Может ли 'YourHtmlDocument.html' быть URL-адрес страницы? – Steven

+0

PS. Я не думаю, что в новейшей версии iTextSharp есть HtmlParser. Самое близкое, что я получаю его 'iTextSharp.text.html.simpleparser.HTMLWorker' Но, используя это, требуется TextReader для синтаксического анализа ..... – Steven

+0

@Steven - Вы правы! Извините, я загрузил старую тестовую программу (со старой версией iTextSharp), когда я ответил на ваш вопрос. Вы правы, хотя, HTMLWorker - это то, как вы хотите. Я отредактировал свой ответ на основе (ограниченного) тестирования, которое я сделал с HTMLWorker и iTextSharp 5.0. –

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