예제 #1
0
        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));
        }