简要

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

Last modification:August 3, 2020
如果觉得我的文章对你有用,请随意赞赏