C#下使用iTextSharp实现HTML生成PDF,支持CSS和中文
简要
iTextSharp的功能很强大,之前我也写过使用pdf模板来生成PDF的文章(《使用iText5来处理PDF》),当然这里我还是使用iTextSharp5这个版本,原因是这个版本还是开源免费的。
前面不多说,还是通过nuget来安装iTextSharp5,这里还需要安装itextsharp.xmlworker,之后开始做html模板,及对应的css。这里需要注意的是,div等可以有宽度的标签,css中不能有width/height这种标签,但是可以用max-width
,另外如果有图片的话,需要转成base64代码,文件的编码格式需要使用纯净的utf-8编码保存,不能使用其他编码及带BOM的utf-8
,css需要是单独的一个文件,或者是在html标签中使用内联的方式。我这里使用的是独立的css文件,另外我的例子里是保存pdf到服务器上,如果生成之后需要直接让用户下载,那么只需要小改动就可以,我这里就不做改动了。
代码
using iTextSharp.text;
using System.IO;
using System.Text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using iTextSharp.tool.xml.html;
using iTextSharp.tool.xml.pipeline.html;
using iTextSharp.tool.xml.pipeline.css;
using iTextSharp.tool.xml.parser;
using iTextSharp.tool.xml.pipeline.end;
public static void Create()
{
string css = System.Web.HttpContext.Current.Request.MapPath("/html/stype.css"); //css物理路径
string html = FileObj.ReadFile(System.Web.HttpContext.Current.Request.MapPath("/html/template.html"), Encoding.UTF8); //读取html模板内容
string pdf = System.Web.HttpContext.Current.Request.MapPath("/pdf/file.pdf"); //设置生成pdf的保存路径
using (var ms = new FileStream(pdf,FileMode.Create))
{
using (var document = new Document(iTextSharp.text.PageSize.A4)) //设置页面大小
{
using (PdfWriter writer = PdfWriter.GetInstance(document, ms))
{
document.Open();
using (var strReader = new StringReader(html))
{
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
// 注册指定的字体,第二个参数是给字体命名,在css中需要指定字体 //fontProvider.Register(System.Web.HttpContext.Current.Request.MapPath("/fonts/simhei.ttf"), "simhei");
fontProvider.RegisterDirectory(@"C:\Windows\Fonts"); //直接注册全部的系统字体
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
//设置factories
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
//设置css
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
cssResolver.AddCssFile(css,true);
//生成导出
IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
var worker = new XMLWorker(pipeline, true);
var xmlParse = new XMLParser(true, worker);
xmlParse.Parse(strReader);
xmlParse.Flush();
}
document.Close();
}
}
}
}
其他说明
1.中文
如果要支持中文,在css中一定要设置支持中文的字体,比如内容的最外面是body
标签,可以直接设置body{font-family:'simhei';}
类似这样的,或者是对应的标签指定要使用的字体。
2.分页
如果对自动分页的位置不满意,可以通过css来控制分页。
创建分页:style="page-break-after: always;"
避免分页:style="page-break-inside: avoid;"