ITextSharp HTML в PDF? - PullRequest
       60

ITextSharp HTML в PDF?

62 голосов
/ 13 мая 2010

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

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

tia.

Ответы [ 8 ]

65 голосов
/ 14 мая 2010

Я столкнулся с тем же вопросом несколько недель назад, и это результат того, что я нашел. Этот метод делает быстрый дамп 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;
}
28 голосов
/ 13 мая 2010

после некоторого копания я нашел хороший способ выполнить то, что мне нужно, с помощью 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
    {
    }
}
11 голосов
/ 11 июля 2013

Вот что мне удалось получить, работая над версией 5.4.2 (из установки nuget), чтобы вернуть pdf-ответ от контроллера mpc asp.net. Может быть изменено использование 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");
            }
        }
    }
}
10 голосов
/ 07 января 2014

Если бы у меня была репутация, я бы получил ответ от 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 фактически собирается с помощью пакета Agility для HTML (я автоматизирую генерацию счетов-фактур):

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

еще раз, спасибо, могучий - ваш ответ фантастический.

6 голосов
/ 27 ноября 2013

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

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

3 голосов
/ 31 мая 2015

Имеет возможность конвертировать 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();
3 голосов
/ 11 октября 2011

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

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

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

1 голос
/ 10 августа 2016

Если вы конвертируете html в pdf на стороне html-сервера, вы можете использовать Rotativa:

Install-Package Rotativa

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

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