ITextSharp HTML para PDF?

Eu gostaria de saber se o ITextSharp tem a capacidade de converter HTML para PDF. Tudo o que eu vou converter será apenas texto simples, mas infelizmente há muito pouca ou nenhuma documentação no ITextSharp, então não posso determinar se isso será uma solução viável para mim.

Se isso não for possível, alguém pode me indicar algumas bibliotecas boas e livres que podem pegar um simples documento HTML em texto simples e convertê-lo em pdf?

tia.

Eu me deparei com a mesma pergunta há algumas semanas e este é o resultado do que eu encontrei. Esse método faz um rápido despejo de HTML em um PDF. O documento provavelmente precisará de alguns ajustes de formato.

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

Depois de fazer algumas pesquisas, descobri uma boa maneira de realizar o que preciso com o ITextSharp.

Aqui está um código de exemplo, se ajudar alguém no futuro:

 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 htmlarraylist = HTMLWorker.ParseToList(new StringReader(htmlText), null); for (int k = 0; k < htmlarraylist.Count; k++) { document.Add((IElement)htmlarraylist[k]); } document.Close(); } catch { } } 

Aqui está o que eu consegui trabalhar na versão 5.4.2 (a partir da instalação do nuget) para retornar uma resposta em pdf de um controlador asp.net mvc. Pode ser modfied usar um FileStream em vez de MemoryStream para a saída, se é isso que é necessário.

Eu postei aqui porque é um exemplo completo do uso atual do iTextSharp para a conversão html -> pdf (desconsiderando imagens, eu não olhei para isso já que meu uso não requer isso)

Ele usa o XmlWorkerHelper do iTextSharp, portanto, o hmtl de input deve ser XHTML válido, então você pode precisar fazer alguma correção dependendo da sua input.

 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 = @"    Minimal XHTML 1.0 Document with W3C DTD   " + 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"); } } } } 

Eu teria uma resposta de mightymada se tivesse a reputação – acabei de implementar uma solução asp.net HTML para PDF usando Pechkin. os resultados são maravilhosos.

Há um pacote nuget para Pechkin, mas como o pôster mencionado menciona em seu blog ( http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/ – espero que ela não se importe me repostando), há um memory leaks que foi corrigido neste ramo:

https://github.com/tuespetre/Pechkin

O blog acima tem instruções específicas sobre como include este pacote (é uma dll de 32 bits e requer .net4). aqui está o meu código. O HTML recebido é realmente montado via pacote de Agilidade HTML (estou automatizando as gerações de faturas):

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

Mais uma vez, obrigada mightymada – a sua resposta é fantástica.

Eu prefiro usar outra biblioteca chamada Pechkin porque é capaz de converter HTML não trivial (que também possui classs CSS). Isso é possível porque essa biblioteca usa o mecanismo de layout WebKit, que também é usado por navegadores como o Chrome e o Safari.

Eu detalhei no meu blog minha experiência com Pechkin: http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/

O código acima certamente ajudará na conversão de HTML para PDF, mas falhará se o código HTML tiver tags IMG com caminhos relativos. A biblioteca iTextSharp não converte automaticamente caminhos relativos para absolutos.

Eu tentei o código acima e adicionei código para cuidar de tags IMG também.

Você pode encontrar o código aqui para sua referência: http://www.am22tech.com/html-to-pdf/

Tem capacidade de converter arquivos HTML em pdf.

Namespace requerido para conversões são:

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

e para conversão e download de arquivo:

 // 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 eg 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(); 

Se você está convertendo html para pdf no lado do servidor html você pode usar o Rotativa:

 Install-Package Rotativa 

Isto é baseado no wkhtmltopdf, mas tem melhor suporte css do que o iTextSharp e é muito simples de integrar ao MVC (que é usado principalmente), já que você pode simplesmente retornar a view como pdf:

 public ActionResult GetPdf() { //... return new ViewAsPdf(model);// and you are done! }