2010-04-07 44 views
5

Tôi đang cố gắng tạo PDF ra khỏi trang HTML. CMS tôi đang sử dụng là EPiServer.Cần trợ giúp về việc tạo tệp PDF từ HTML bằng cách sử dụng itextsharp

Đây là mã của tôi cho đến nay:

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

này kết quả đầu ra nội dung của tên bài viết, giới thiệu văn và cơ thể chính. Nhưng nó không phân tích cú pháp HTML trong văn bản bài viết và không có bố cục.

Tôi đã thử xem xét http://itextsharp.sourceforge.net/tutorial/index.html mà không cần bất kỳ điều gì khôn ngoan hơn.

Bất kỳ con trỏ để đi đúng hướng được đánh giá rất cao :)

Trả lời

5

Đối với các phiên bản sau của iTextSharp:

Sử dụng iTextSharp bạn có thể sử dụng phương pháp iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList() để tạo ra một PDF từ HTML.

ParseToList() mất một TextReader (một lớp trừu tượng) cho nguồn HTML của nó, có nghĩa là bạn có thể sử dụng một StringReader hoặc StreamReader (cả hai đều sử dụng TextReader như một loại cơ sở). Tôi đã sử dụng StringReader và có thể tạo tệp PDF từ đánh dấu đơn giản lên. Tôi đã cố gắng sử dụng HTML được trả về từ một trang web và gặp lỗi trên tất cả các trang đơn giản. Ngay cả trang web đơn giản tôi đã truy xuất (http://black.ea.com/) đã hiển thị nội dung của thẻ 'đầu' của trang trên tệp PDF, vì vậy tôi nghĩ phương pháp HTMLWorker.ParseToList() là cầu kỳ về định dạng của HTML mà nó phân tích cú pháp.

Dù sao, nếu bạn muốn thử đây là mã kiểm tra tôi đã sử dụng:

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

tôi không thể tìm thấy bất kỳ tài liệu trên đó xây dựng HTML HTMLWorker.ParseToList() hỗ trợ; nếu bạn làm xin vui lòng gửi nó ở đây. Tôi chắc chắn sẽ có rất nhiều người quan tâm.

Đối với phiên bản cũ của iTextSharp: Bạn có thể sử dụng phương pháp iTextSharp.text.html.HtmlParser.Parse để tạo ra một PDF dựa trên html.

Dưới đây là một đoạn chứng minh điều này:

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

Một (chủ yếu đối với tôi) vấn đề là HTML phải được nghiêm túc với XHTML.

Chúc may mắn!

+0

Tuyệt vời. Cảm ơn. Có thể 'YourHtmlDocument.html' là URL của trang không? – Steven

+0

PS. Tôi không nghĩ rằng phiên bản mới nhất của iTextSharp có HtmlParser. Gần nhất tôi nhận được nó 'iTextSharp.text.html.simpleparser.HTMLWorker' Nhưng sử dụng nó, yêu cầu một TextReader cho việc phân tích cú pháp ..... – Steven

+0

@Steven - Bạn nói đúng! Xin lỗi về điều đó, tôi đã tải lên một chương trình thử nghiệm cũ (với một phiên bản cũ của iTextSharp) khi tôi trả lời câu hỏi của bạn. Bạn nói đúng, HTMLWorker là cách bạn muốn làm. Tôi đã chỉnh sửa phản hồi của mình dựa trên thử nghiệm (có giới hạn) mà tôi đã thực hiện với HTMLWorker và iTextSharp 5.0. –

Các vấn đề liên quan