我想知道ITextSharp是否有将HTML转换为PDF的功能。 我需要转换的所有内容都只是纯文本,但不幸的是,关于ITextSharp几乎没有任何文档,所以我无法确定它是否对我来说是可行的解决方案。
如果不能实现,有人可以指向一些好的、免费的.NET库,可以将简单的纯文本HTML文档转换为PDF吗?
谢谢您。
我想知道ITextSharp是否有将HTML转换为PDF的功能。 我需要转换的所有内容都只是纯文本,但不幸的是,关于ITextSharp几乎没有任何文档,所以我无法确定它是否对我来说是可行的解决方案。
如果不能实现,有人可以指向一些好的、免费的.NET库,可以将简单的纯文本HTML文档转换为PDF吗?
谢谢您。
几周前我也遇到了同样的问题,这是我发现的结果。该方法可以快速将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安装)能够实现的ASP.NET MVC控制器返回PDF响应的示例。如果需要,可以修改为使用FileStream而不是MemoryStream输出。 我在这里发布它,因为它是当前iTextSharp用于HTML-> PDF转换的完整示例(忽略图像,因为我的使用不需要)。它使用了iTextSharp的XmlWorkerHelper,所以传入的HTML必须是有效的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");
}
}
}
}
如果我有声望,我会比mightymada的回答更好 - 我刚刚使用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 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文件转换为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();
2020更新:
现在将HTML转换为PDF非常简单。您只需要使用NuGet安装itext7和itext7.pdfhtml即可。在Visual Studio中,您可以通过转到“项目”>“管理NuGet包...”来完成此操作。
确保包含此依赖项:
using iText.Html2pdf;
HtmlConverter.ConvertToPdf(new FileInfo(@"temp.html"), new FileInfo(@"report.pdf"));
如果您在Visual Studio中运行此示例,则您的HTML文件应该位于/bin/Debug
目录中。
如果您感兴趣,这里有一个不错的资源。另外,请注意itext7是根据AGPL许可证授权的。
上述代码可以帮助将HTML转换为PDF,但如果HTML代码中包含相对路径的IMG标签,则会失败。iTextSharp库不会自动将相对路径转换为绝对路径。
我尝试了上面的代码,并添加了处理IMG标签的代码。
您可以在此处找到参考代码: http://www.am22tech.com/html-to-pdf/
www.google.com
读取HTML并生成PDF时出现以下错误:Could not find a part of the path 'C:\intl\en_ALL\images\srpr\logo1w.png'。
- cusmanInstall-Package Rotativa
public ActionResult GetPdf()
{
//...
return new ViewAsPdf(model);// and you are done!
}
using(MemoryStream stream = createPDF(html)) {}
。 - JonathanHTMLWorker
类现已过时,被XMLWorker
取代。请查看 https://dev59.com/0V8e5IYBdhLWcg3w-OYn 获取关于如何使用它将 HTML 渲染为 PDF(包括 CSS 渲染)的深入概述。 - mark.monteiro