2010-04-07 14 views
5

Próbuję utworzyć plik PDF ze strony HTML. CMS, którego używam, to EPiServer.Potrzebujesz pomocy w tworzeniu plików PDF z HTML za pomocą itextsharp

To jest mój kod do tej pory:

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(); 
    } 

Ten wysyła treść nazwą artykułu, intra-tekst i korpusu głównego. Ale nie wstawia HTML, który jest w tekście artykułu i nie ma układu.

Próbowałem rzucić okiem na http://itextsharp.sourceforge.net/tutorial/index.html bez stania się mądrzejszym.

Wszelkie wskaźniki do prawego kierunku jest bardzo mile widziane :)

Odpowiedz

5

nowszych wersjach iTextSharp:

Korzystanie iTextSharp można użyć metody iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList() aby utworzyć plik PDF z HTML.

ParseToList() zajmuje TextReader (klasa abstrakcyjna) do źródła HTML, co oznacza, że ​​można użyć StringReader lub StreamReader (oba używać TextReader jako typ bazowy). Użyłem StringReader i byłem w stanie generować pliki PDF z prostego oznaczenia. Próbowałem użyć HTML zwrócony ze strony internetowej i dostałem błędy na wszystkich stronach oprócz simplist. Nawet strona internetowa simplist, którą pobrałem (http://black.ea.com/) renderowała treść tagu "head" strony do pliku PDF, więc myślę, że metoda HTMLWorker.ParseToList() jest wybredna w kwestii formatowania kodu HTML, który analizuje.

W każdym razie, jeśli chcesz spróbować tutaj jest kod testu użyłem:

// 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); 
} 

nie mogłem znaleźć żadnej dokumentacji na której HTML konstruuje HTMLWorker.ParseToList() podpór; jeśli to zrobisz, opublikuj to tutaj. Jestem pewien, że wielu ludzi byłoby zainteresowanych.

Dla starszych wersjach iTextSharp: Można użyć metody iTextSharp.text.html.HtmlParser.Parse aby utworzyć plik PDF w oparciu o HTML.

Oto urywek demonstrując w ten sposób:

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); 
} 

Jeden (główny dla mnie) problemem jest HTML musi być ściśle XHTML.

Powodzenia!

+0

Świetnie. Dzięki. Czy 'YourHtmlDocument.html' może być adresem URL strony? – Steven

+0

PS. Nie sądzę, że najnowsza wersja iTextSharp ma HtmlParser. Najbliżej dostaję to "iTextSharp.text.html.simpleparser.HTMLWorker' Ale używając tego, wymaga TextReader do parsowania ..... – Steven

+0

@Steven - Masz rację! Przepraszam za to, że załadowałem stary program testowy (ze starą wersją iTextSharp), gdy odpowiedziałem na twoje pytanie. Masz jednak rację, HTMLWorker to sposób, w jaki chcesz zrobić. Edytowałem moją odpowiedź w oparciu o (ograniczone) testy, które zrobiłem z HTMLWorker i iTextSharp 5.0. –

Powiązane problemy