ITextSharp HTML в PDF?


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

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

ТИА.

8 62

8 ответов:

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

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

вот что я смог получить, работая над версией 5.4.2 (из установки nuget), чтобы вернуть ответ pdf от an asp.net контроллер mvc. Он может быть модифицирован для использования FileStream вместо MemoryStream для вывода, если это то, что необходимо.

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

он использует iTextSharp XmlWorkerHelper, поэтому входящий 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");
            }
        }
    }
}

Я бы один-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 pack (я автоматизирую поколения счетов-фактур):

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 - ваш ответ-это фантастика.

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

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

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

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

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

Он имеет возможность конвертировать 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();

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

Install-Package Rotativa

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

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