首页 文章

ITextSharp HTML到PDF?

提问于
浏览
62

我想知道ITextSharp是否具有将HTML转换为PDF的能力 . 我将转换的所有内容都只是纯文本,但遗憾的是ITextSharp上几乎没有文档,所以我无法确定这对我来说是否可行 .

如果它不能做到,有人可以指向一些好的,免费的.net库,可以采用简单的纯文本HTML文档并将其转换为PDF格式吗?

TIA .

8 回答

  • 6

    几周前我遇到了同样的问题,这是我发现的结果 . 此方法可以快速将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

    在做了一些挖掘之后,我找到了一个很好的方法来完成我对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
        {
        }
    }
    
  • 3

    这是我能够使用版本5.4.2(来自nuget安装)从asp.net mvc控制器返回pdf响应 . 如果需要,可以修改使用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");
                }
            }
        }
    }
    
  • 28

    如果我有声誉,我会得到一个强大的答案 - 我只是使用Pechkin实现了一个asp.net HTML to PDF解决方案 . 结果很精彩 .

    Pechkin有一个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 - 你的答案太棒了 .

  • 3

    我更喜欢使用另一个名为Pechkin的库,因为它能够转换非平凡的HTML(也有CSS类) . 这是可能的,因为此库使用WebKit布局引擎,Chrome和Safari等浏览器也使用该引擎 .

    我在博客上详细介绍了我与Pechkin的经历:http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/

  • 65

    上面的代码肯定有助于将HTML转换为PDF,但如果HTML代码具有相对路径的IMG标记,则会失败 . iTextSharp库不会自动将相对路径转换为绝对路径 .

    我尝试了上面的代码并添加了代码来处理IMG标签 .

    您可以在这里找到代码供您参考:http://www.am22tech.com/html-to-pdf/

  • 1

    它能够将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();
    
  • 11

    如果要在html服务器端将html转换为pdf,可以使用Rotativa:

    Install-Package Rotativa
    

    这是基于wkhtmltopdf,但它比iTextSharp具有更好的CSS支持,并且与MVC(主要使用)的集成非常简单,因为您可以简单地将视图作为pdf返回:

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

相关问题