63

我想知道 ITextSharp 是否具有将 HTML 转换为 PDF 的能力。我将转换的所有内容都只是纯文本,但不幸的是 ITextSharp 上几乎没有文档,所以我无法确定这对我来说是否是一个可行的解决方案。

如果它做不到,有人可以指点我一些好的、免费的 .net 库,它们可以获取简单的纯文本 HTML 文档并将其转换为 pdf 吗?

蒂亚。

4

9 回答 9

65

几周前我遇到了同样的问题,这是我发现的结果。此方法将 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;
}
于 2010-05-14T15:16:14.887 回答
28

在做了一些挖掘之后,我找到了一个用 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
    {
    }
}
于 2010-05-12T22:32:56.113 回答
11

这是我在 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");
            }
        }
    }
}
于 2013-07-11T19:39:54.343 回答
10

如果我有声望的话,我会单挑可能的答案——我刚刚使用 Pechkin 实现了一个 asp.net HTML 到 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 包组装的(我正在自动生成发票):

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 - 您的回答太棒了。

于 2014-01-07T18:40:23.360 回答
6

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

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

于 2013-11-27T09:54:46.870 回答
3

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

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

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

于 2011-10-11T18:13:36.383 回答
3

它具有将 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();
于 2015-05-31T08:20:24.213 回答
2

2020 年更新:

现在将 HTML 转换为 PDF 非常简单。您所要做的就是使用 NuGet 安装itext7itext7.pdfhtml。您可以通过转到“项目”>“管理 NuGet 包...”在 Visual Studio 中执行此操作

确保包含此依赖项:

using iText.Html2pdf;

现在只需粘贴这一个衬垫,你就完成了:

HtmlConverter.ConvertToPdf(new FileInfo(@"temp.html"), new FileInfo(@"report.pdf"));

如果您在 Visual Studio 中运行此示例,则您的 html 文件应位于该/bin/Debug目录中。

如果你有兴趣,这里有一个很好的资源。另外,请注意itext7是在 AGPL 下获得许可的。

于 2020-10-09T14:55:01.430 回答
1

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

Install-Package Rotativa

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

public ActionResult GetPdf()
{
    //...
    return new ViewAsPdf(model);// and you are done!
} 
于 2016-08-10T15:47:05.370 回答