public static ITagProcessorFactory GetSvgTagProcessorFactory() { DefaultTagProcessorFactory factory = new DefaultTagProcessorFactory(); factory.AddProcessor(HTML.Tag.XML, dummyTagProcessor); factory.AddProcessor("!doctype", dummyTagProcessor); factory.AddProcessor(SvgTagNames.SVG, svgpackage + "SvgTag"); factory.AddProcessor(SvgTagNames.DEFS, svgpackage + "DefsTag"); factory.AddProcessor(SvgTagNames.CIRCLE, svgpackage + "CircleTag"); factory.AddProcessor(SvgTagNames.PATH, svgpackage + "PathTag"); factory.AddProcessor(SvgTagNames.GROUP, svgpackage + "GroupTag"); factory.AddProcessor(SvgTagNames.RECTANGLE, svgpackage + "RectangleTag"); factory.AddProcessor(SvgTagNames.ELLIPSE, svgpackage + "EllipseTag"); factory.AddProcessor(SvgTagNames.LINE, svgpackage + "LineTag"); factory.AddProcessor(SvgTagNames.POLYLINE, svgpackage + "PolyTag"); factory.AddProcessor(SvgTagNames.POLYGON, svgpackage + "PolyTag"); factory.AddProcessor(SvgTagNames.SYMBOL, svgpackage + "SymbolTag"); factory.AddProcessor(SvgTagNames.USE, svgpackage + "UseTag"); factory.AddProcessor(SvgTagNames.TEXT, svgpackage + "TextTag"); factory.AddProcessor(SvgTagNames.TSPAN, svgpackage + "TextSpanTag"); factory.AddProcessor(SvgTagNames.TEXTPATH, svgpackage + "TextPathTag"); factory.AddProcessor(HTML.Tag.STYLE, "com.itextpdf.tool.xml.html.head.Style"); return(factory); }
/// <summary> /// 產生PDF byte[] /// </summary> /// <param name="htmlText"></param> /// <param name="ds"></param> /// <param name="exportFile">匯出檔案</param> /// <returns></returns> public FileContentResult exportPDF(string htmlText, IDocSetting ds, bool exportFile = false) { byte[] buf = null; string actionName = "exportPDF"; setFileContentType(fileType.pdf); try { if (string.IsNullOrEmpty(htmlText)) { return(null); } //避免當htmlText無任何html tag標籤的純文字時,轉PDF時會掛掉,所以一律加上<p>標籤 //htmlText = "<p>" + htmlText + "</p>"; string[] pageHtml = System.Text.RegularExpressions.Regex.Split(htmlText, ds.pageSplit); Document doc = new Document(iTextSharp.text.PageSize.A4);//要寫PDF的文件,建構子沒填的話預設直式A4 if (ds.SetMargins) { doc.SetMargins(ds.marginLeft, ds.marginRight, ds.marginTop, ds.marginBottom); } //指定文件預設開檔時的縮放為100% PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 0, doc.PageSize.Height, 1f); //開啟Document文件 MemoryStream outputStream = new MemoryStream();//要把PDF寫到哪個串流 PdfWriter writer = PdfWriter.GetInstance(doc, outputStream); doc.Open(); foreach (string str in pageHtml) { if (str == "\r\n" && pageHtml.Length > 1) { continue; } doc.NewPage(); int page = 1; string text = string.Format("{0}" + str + "{1}", "<p>", "</p>"); byte[] data = Encoding.UTF8.GetBytes(text);//字串轉成byte[] MemoryStream msInput = new MemoryStream(data); //使用XMLWorkerHelper把Html parse到PDF檔裡 Stream fs = null; string sourcePath = ""; string sourceFile = ""; if (!string.IsNullOrWhiteSpace(ds.cssFile)) { sourcePath = System.Web.Hosting.HostingEnvironment.MapPath("~\\StyleSheet\\"); sourceFile = System.IO.Path.Combine(sourcePath, ds.cssFile); fs = System.IO.File.OpenRead(sourceFile); } /*------------------------- Cxr繪圖 2018.09.13 [下] -------------------------*/ #region Cxr //1.版面配置CSS CssFilesImpl cssFiles = new CssFilesImpl(); cssFiles.Add(XMLWorkerHelper.GetCSS(File.OpenRead(sourceFile))); // [File.OpenRead] 新增 [StyleAttrCSSResolver] StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles); //2.重新撰寫底層Image功能Tag DefaultTagProcessorFactory tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory(); tagProcessors.RemoveProcessor(HTML.Tag.IMG); // remove the default processor tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor()); // use new processor //3.重新編譯 //HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider())); HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new UnicodeFontFactory())); hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors); // inject the tagProcessors HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(doc, writer)); CssResolverPipeline pipeline = new CssResolverPipeline(cssResolver, htmlPipeline); XMLWorker worker = new XMLWorker(pipeline, true); XMLParser xmlParser = new XMLParser(true, worker, Encoding.UTF8); xmlParser.Parse(new StringReader(text)); #endregion /*------------------------- Cxr繪圖 2018.09.13 [上] -------------------------*/ /* 2018.09.13 恢復舊有功能 * //使用XMLWorkerHelper把Html parse到PDF檔裡 * XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msInput, fs, Encoding.UTF8, new UnicodeFontFactory()); * //將pdfDest設定的資料寫到PDF檔 * PdfAction action = PdfAction.GotoLocalPage(page, pdfDest, writer); * writer.SetOpenAction(action); */ msInput.Close(); page++; } doc.Close(); outputStream.Close(); //回傳PDF檔案 buf = outputStream.ToArray(); } catch (Exception ex) { RESPONSE_MSG.message = "產生PDF發生錯誤,請洽資訊人員,錯誤訊息如下所示:" + ex.Message; RESPONSE_MSG.status = RESPONSE_STATUS.EXCEPTION; LogTool.SaveLogMessage(ex, actionName, csName); } return(retunFile(buf)); }