XMLWorkerHelper将html页面转换为pdf只生成前2页

时间:2016-06-21 09:57:06

标签: c# asp.net-mvc pdf itext xmlworker

我只获得前两页。我在第三页中有一个生成的元素列表。当我的集合中有太多元素时,我的pdf输出中的所有页面都变为空白

  using (FileStream fs = new FileStream(filePath, FileMode.Create))
                {                        
                    Document document = new Document(PageSize.A4, 25, 25, 30, 30);
                    WebClient wc = new WebClient();
                    string htmlText = wc.DownloadString(textUrl);                      

                    PdfWriter pdfWriter = PdfWriter.GetInstance(document, fs);
                    document.Open();
                      // register all fonts in current computer
                    FontFactory.RegisterDirectories(); 
                    XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider();
                    using (var msHtml = new MemoryStream(System.Text.Encoding.Default.GetBytes(htmlText)))
                    {
                        //Set factories
                        var cssAppliers = new CssAppliersImpl(fontProvider);
                        var htmlContext = new HtmlPipelineContext(cssAppliers);

                        //HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
                        htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

                        //FontFactory.Register(arialuniTff);
                        string gishaTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "GISHA.TTF");
                        FontFactory.Register(gishaTff);

                        var worker = XMLWorkerHelper.GetInstance();
                        var cssStream = new FileStream(FolderMapPath("/css/style.css"), FileMode.Open);

                        worker.ParseXHtml(pdfWriter, document, msHtml, cssStream, new UnicodeFontFactory());
                    }

                    // Close the document
                    document.Close();

                    // Close the writer instance
                    pdfWriter.Close();
                }                   

这是我的cshtml代码

2 个答案:

答案 0 :(得分:0)

我只有在Java中使用iText的经验,但是当你第3页上的表有太多要存储的元素时,你使用的MemoryStream对象是否有可能被填满的字节数限制?如果是这种情况,则该长表上的结束标记可能无法写入MemoryStream,因此该表及其后的所有内容都不会被呈现;即被PDF转换器引擎截断。

您可以尝试使用其他Stream对象吗?

答案 1 :(得分:0)

以下是我解决问题的方法。问题不在于C#后端代码。目前看来 XMLWorkerHelper 似乎不能很好地处理循环视图。我必须在PDF文件中显示项目列表。如果集合中包含的项目不多,则结果很好,但是当集合包含超过50个项目时,页面中断会因为无法在单个页面中显示。我所做的是,我开始计算项目的数量,并在某些数字,如40,我只包括一个休息元素<li style="list-style:none; list-style-type:none; page-break-before:always">@item</li>。并重置计数器并继续显示我的项目。它很棒,我的问题得到了解决。 可能这对某人有帮助。