63 votes

ITextSharp de code HTML vers PDF?

Je voudrais savoir si ITextSharp a la capacité de convertir du HTML en PDF. Tout ce que je vais convertir sera juste de texte brut, mais malheureusement il y a très peu de documentation sur ITextSharp donc je ne peux pas déterminer si ce sera une solution viable pour moi.

Si elle ne peut pas le faire, quelqu'un peut-il m'indiquer quelques bonnes, gratuit .bibliothèques net qui peut prendre un simple texte brut HTML document et de le convertir en pdf?

tia.

65voto

Jonathan Points 1173

Je suis tombé sur la même question il y a quelques semaines et c'est le résultat de ce que j'ai trouvé. Cette méthode a fait un rapide dump de HTML en PDF. Le document sera très probablement besoin d'un certain format de peaufinage.

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

28voto

Kyle Points 2174

après avoir fait quelques recherches j'ai trouvé une bonne façon d'accomplir ce dont j'ai besoin avec ITextSharp.

Voici un exemple de code si cela peut aider quelqu'un d'autre dans l'avenir:

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

11voto

µBio Points 6959

Voici ce que j'ai pu obtenir un travail sur la version 5.4.2 (à partir de la nuget installer) pour renvoyer une réponse à partir d'un pdf asp.net mvc contrôleur. Il pourrait être transforme utiliser un FileStream au lieu de MemoryStream de la sortie si c'est ce qui est nécessaire.

Je poste ici parce que c'est un exemple actuel de iTextSharp l'utilisation de l'html> conversion en pdf (en faisant abstraction des images, je n'ai pas regardé depuis mon utilisation n'en a pas besoin)

Il utilise iTextSharp de XmlWorkerHelper, de sorte que les entrants hmtl doit être valide XHTML, de sorte que vous devrez effectuer la correction en fonction de votre entrée.

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

10voto

Carl Steffen Points 71

Je l'avais mightymada réponse si j'avais la réputation - j'ai juste mis en place un asp.net HTML au format PDF solution à l'aide de Pechkin. les résultats sont merveilleux.

Il y a un package nuget pour Pechkin, mais comme ci-dessus affiche mentionne dans son blog (enhttp://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/ - j'espère qu'elle ne me dérange pas de me reposter), il y a une fuite de mémoire qui a été fixé dans cette branche:

https://github.com/tuespetre/Pechkin

Le blog ci-dessus a des instructions spécifiques pour inclure ce paquet (c'est un 32 bits dll et exige .net4). voici mon code. Les entrants HTML est en fait assemblés par HTML Agility pack (je suis automatisation facture générations):

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

encore une fois, merci mightymada - votre réponse est fantastique.

6voto

mightymada Points 81

Je préfère utiliser une autre bibliothèque appelée Pechkin car il est capable de convertir les non trivial HTML (qui a aussi des classes CSS). Cela est possible parce que cette bibliothèque utilise le moteur de rendu WebKit, qui est également utilisé par les navigateurs tels que google Chrome et Safari.

J'ai détaillé sur mon blog mon expérience avec Pechkin: http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X