2010-05-12 7 views
62

Я хотел бы знать, может ли ITextSharp конвертировать HTML в PDF. Все, что я конвертирую, будет просто простым текстом, но, к сожалению, документации по ITextSharp очень мало, поэтому я не могу определить, будет ли это жизнеспособным решением для меня.ITextSharp HTML в PDF?

Если он не может этого сделать, может ли кто-нибудь указать мне на хорошие, бесплатные .net-библиотеки, которые могут принимать простой текстовый HTML-документ и преобразовывать его в pdf?

tia.

ответ

28

после некоторого рытья Я нашел хороший способ выполнить то, что мне нужно с ITextSharp.

Вот некоторые примеры кода, если это поможет кому-нибудь в будущем:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Document document = new Document(); 
    try 
    { 
     PdfWriter.GetInstance(document, new FileStream("c:\\my.pdf", FileMode.Create)); 
     document.Open(); 
     WebClient wc = new WebClient(); 
     string htmlText = wc.DownloadString("http://localhost:59500/my.html"); 
     Response.Write(htmlText); 
     List<IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(htmlText), null); 
     for (int k = 0; k < htmlarraylist.Count; k++) 
     { 
      document.Add((IElement)htmlarraylist[k]); 
     } 

     document.Close(); 
    } 
    catch 
    { 
    } 
} 
+4

Вы, вероятно, не хотите написать свой выход к фиксированному пути, как вы делаете с веб-приложение. Вы получите конфликт ресурсов с этим единственным файлом под нагрузкой. Используйте MemoryStream или временный файл, предоставленный ОС (обязательно удалите временный файл, когда вы закончите с ним). Как создать временный файл: http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx – ntcolonel

+2

Ссылка на объект не установлена ​​в экземпляр объекта. в списке htmlarraylist = HTMLWorker.ParseToList (новый StringReader (htmlText), null); – viento

+0

привет, @Kyle, пожалуйста, помогите мне: http: //stackoverflow.com/questions/20950236/how-to-insert-html-markup-using-itextsharp-for-creating-pdf-using-c –

65

я наткнулся на тот же вопрос несколько недель назад, и это результат от того, что я нашел. Этот метод делает быстрый сброс HTML в PDF. Документу, скорее всего, потребуется некоторая настройка формата.

private MemoryStream createPDF(string html) 
{ 
    MemoryStream msOutput = new MemoryStream(); 
    TextReader reader = new StringReader(html); 

    // step 1: creation of a document-object 
    Document document = new Document(PageSize.A4, 30, 30, 30, 30); 

    // step 2: 
    // we create a writer that listens to the document 
    // and directs a XML-stream to a file 
    PdfWriter writer = PdfWriter.GetInstance(document, msOutput); 

    // step 3: we create a worker parse the document 
    HTMLWorker worker = new HTMLWorker(document); 

    // step 4: we open document and start the worker on the document 
    document.Open(); 
    worker.StartDocument(); 

    // step 5: parse the html into the document 
    worker.Parse(reader); 

    // step 6: close the document and the worker 
    worker.EndDocument(); 
    worker.Close(); 
    document.Close(); 

    return msOutput; 
} 
+10

Чтобы кто-то еще не мог прокопать документацию, обратите внимание, что с 5.1.1 HTMLWorker можно найти в iTextSharp.text.html.simpleparser. –

+68

Почему люди никогда не используют «использование» в примерах кода C#? – cbp

+5

@cbp Обычно я вызываю метод, подобный этому, в объявлении инструкции using. ех. 'using (MemoryStream stream = createPDF (html)) {}' – Jonathan

3

Приведенный выше код, безусловно, поможет в преобразовании HTML в PDF, но потерпит неудачу, если HTML-код имеет IMG теги с относительными путями. Библиотека iTextSharp не автоматически конвертирует относительные пути в абсолютные.

Я пробовал вышеуказанный код и добавил код, чтобы позаботиться о IMG-тегах.

Вы можете найти код здесь для справки: http://www.am22tech.com/html-to-pdf/

+0

Вы идентифицируете проблему, но решение, на которое вы ссылаетесь на IImageProvider, выдает следующую ошибку: «Не удалось найти часть пути» C: \ intl \ en_ALL \ images \ srpr \ logo1w.png'.', когда я пытаюсь создайте PDF, прочитав HTML с сайта www.google.com. – cusman

11

Вот что я смог работать на версии 5.4.2 (от NuGet установки), чтобы возвращать ответ в формате PDF из ASP.NET MVC контроллер. Модифицировать можно, используя FileStream вместо MemoryStream для вывода, если это то, что необходимо.

я его здесь, потому что это полный пример текущего использования iTextSharp для HTML -> преобразования PDF (без учета изображения, я не смотрел на это, так как мое использование не требует этого)

Это использует XmlWorkerHelper iTextSharp, поэтому входящий hmtl должен быть действительным XHTML, поэтому вам может потребоваться некоторое исправление в зависимости от вашего ввода.

using iTextSharp.text.pdf; 
using iTextSharp.tool.xml; 
using System.IO; 
using System.Web.Mvc; 

namespace Sample.Web.Controllers 
{ 
    public class PdfConverterController : Controller 
    { 
     [ValidateInput(false)] 
     [HttpPost] 
     public ActionResult HtmlToPdf(string html) 
     {   

      html = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
       <!DOCTYPE html 
        PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN"" 
        ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""> 
       <html xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en""> 
        <head> 
         <title>Minimal XHTML 1.0 Document with W3C DTD</title> 
        </head> 
        <body> 
        " + html + "</body></html>"; 

      var bytes = System.Text.Encoding.UTF8.GetBytes(html); 

      using (var input = new MemoryStream(bytes)) 
      { 
       var output = new MemoryStream(); // this MemoryStream is closed by FileStreamResult 

       var document = new iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER, 50, 50, 50, 50); 
       var writer = PdfWriter.GetInstance(document, output); 
       writer.CloseStream = false; 
       document.Open(); 

       var xmlWorker = XMLWorkerHelper.GetInstance(); 
       xmlWorker.ParseXHtml(writer, document, input, null); 
       document.Close(); 
       output.Position = 0; 

       return new FileStreamResult(output, "application/pdf"); 
      } 
     } 
    } 
} 
+0

Спасибо за это, предоставляет более четкие PDF-файлы, чем HtmlRenderer и PDFSharp. Я проверил, ваш код поддерживает изображения. Я сделал это, чтобы проверить html = "" –

+0

@DavidSilvaSmith Хорошо знать, спасибо! –

6

Я предпочитаю использовать другую библиотеку под названием Печкин, потому что она способна преобразовать нетривиальное HTML (который также имеет классы CSS). Это возможно, потому что в этой библиотеке используется механизм компоновки WebKit, который также используется браузерами, такими как Chrome и Safari.

Я подробно на моем блоге мой опыт работы с Печкина: http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/

10

Я бы ответ один-up'd mightymada, если я имел репутацию - я просто реализовал asp.net HTML в PDF с помощью решения Печкин. результаты замечательные.

Существует NuGet пакет для Печкина, но, как указано выше плакат упоминает в своем блоге (http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/ - я надеюсь, что она не возражает против меня перепроведении его), есть утечка памяти, которая была зафиксирована в этой отрасли:

https://github.com/tuespetre/Pechkin

В вышеприведенном блоге содержатся конкретные инструкции по включению этого пакета (это 32-разрядная dll и требуется .net4).вот мой код. Поступающий HTML фактически собран с помощью HTML Agility пакета (я автоматизация счетов-фактуры поколения):

public static byte[] PechkinPdf(string html) 
{ 
    //Transform the HTML into PDF 
    var pechkin = Factory.Create(new GlobalConfig()); 
    var pdf = pechkin.Convert(new ObjectConfig() 
          .SetLoadImages(true).SetZoomFactor(1.5) 
          .SetPrintBackground(true) 
          .SetScreenMediaType(true) 
          .SetCreateExternalLinks(true), html); 

    //Return the PDF file 
    return pdf; 
} 

снова, спасибо mightymada - ваш ответ является фантастическим.

+4

ОСТОРОЖНО: Печкин (и ВТПечкин) превосходят iTextSharp практически во всех отношениях (IMHO), за исключением того, что они не работают на Azure Web Sites (возможно, в много общих средах хостинга?) –

+0

Pechkin - это обертка вокруг wkhtmltopdf, которая использует QT Webkit для * визуализации * веб-страницы в формате pdf. Это по сути то же самое, что сказать «print to PDF» в Safari (браузер на основе Webkit). Это совершенно другой случай использования при создании PDF-файла из кода. И это также * точная противоположность того, что спросил ОП. Так что я ниспровергаю. –

3

У него есть возможность конвертировать HTML-файл в pdf.

Необходимое пространство имен для преобразования являются:

using iTextSharp.text; 
using iTextSharp.text.pdf; 

и для преобразования и загрузки файла:

// Create a byte array that will eventually hold our final PDF 
Byte[] bytes; 

// Boilerplate iTextSharp setup here 

// Create a stream that we can write to, in this case a MemoryStream 
using (var ms = new MemoryStream()) 
{ 
    // Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF 
    using (var doc = new Document()) 
    { 
     // Create a writer that's bound to our PDF abstraction and our stream 
     using (var writer = PdfWriter.GetInstance(doc, ms)) 
     { 
      // Open the document for writing 
      doc.Open(); 

      string finalHtml = string.Empty; 

      // Read your html by database or file here and store it into finalHtml e.g. a string 
      // XMLWorker also reads from a TextReader and not directly from a string 
      using (var srHtml = new StringReader(finalHtml)) 
      { 
       // Parse the HTML 
       iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml); 
      } 

      doc.Close(); 
     } 
    } 

    // After all of the PDF "stuff" above is done and closed but **before** we 
    // close the MemoryStream, grab all of the active bytes from the stream 
    bytes = ms.ToArray(); 
} 

// Clear the response 
Response.Clear(); 
MemoryStream mstream = new MemoryStream(bytes); 

// Define response content type 
Response.ContentType = "application/pdf"; 

// Give the name of file of pdf and add in to header 
Response.AddHeader("content-disposition", "attachment;filename=invoice.pdf"); 
Response.Buffer = true; 
mstream.WriteTo(Response.OutputStream); 
Response.End(); 
+0

Что касается .NET Core? – series0ne

1

Если вы хотите конвертировать HTML в PDF на стороне HTML сервера можно использовать Rotativa:

Install-Package Rotativa 

Это основано на wkhtmltopdf, но у него есть лучшая поддержка css, чем у iTextSharp есть d очень просто интегрировать с MVC (который в основном используется), как вы можете просто вернуть вид как PDF:

public ActionResult GetPdf() 
{ 
    //... 
    return new ViewAsPdf(model);// and you are done! 
} 
Смежные вопросы