在Word中打开文件时,Cshtml到RTF分页符会消失

时间:2014-05-09 22:08:32

标签: html asp.net razor

提前感谢您提供的任何帮助。我一直在挖掘这里的各种帖子,试图解决丢失的分页问题。我有许多使用Razor模板引擎呈现的cshtml模板来生成RTF文件。当在Word中打开文件时,它会完全转储包含" break"的html。用于分页的样式。模板的其余部分完全按照设计呈现。我在想,也许我的问题是我没有首先正确地渲染文件。

示例.cshtml文件以:

开头
<div style="width: 100%;" class="newpage">
    <p align="center" style="text-align:center">NOTICE</p> 
        <table>
             ....middle html content....
        </table>
    <p class="newpage"></p>
</div>

我已经尝试将分页符放在开头和结尾,只是为了看看它是否有任何区别而且它没有。

获取.cshtml文件的剃须刀调用是这样的:

 newNotice.Body = RazorEngine.Razor.Parse(Notifications.GetTemplate(NotificationTemplate.MyTemplate2), data, NotificationTemplate.MyTemplate2.ToString());
 return newNotice;

然后我在下面的代码中渲染出RTF文件,其中存在分页符的样式:

protected void ProduceNotification(Notification notice, string title)
{
    Response.Clear();
    Response.Buffer = true;
    Response.AddHeader("content-disposition", "attachment;filename=" + title);
    Response.ContentType = "application/rtf";
    EnableViewState = false;
    var stringWrite = new StringWriter();
    var sb = new StringBuilder();
    sb.Append(@"<html>
                  <head>
                    <title></title>
                    <style type='text/css'>
                        .body {
                            margin: 5em;
                            background-color: white;
                            width: 100%;
                            height: 100%;
                            font-family: Calibri;
                        }
                        .spacing {
                            line-height: 1.5em;
                        }
                        .newpage {
                            mso-special-character:line-break;
                            page-break-before:always;
                            clear: both;
                        }
                    </style>
                  </head><body>");
    sb.Append(notice.Body);
    sb.Append("</body></html>");
    stringWrite.WriteLine(sb);
    ClearChildControlState();
    Response.Write(stringWrite.ToString());
    Response.End();
}

当我在Word中打开文件时,分页符不被尊重,所以我将文件保存到.html以查看标记的样子,这就是我看到的内容:

在样式定义部分,它显示样式:

p.newpage, li.newpage, div.newpage
{mso-style-name:break;
mso-style-unhide:no;
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
page-break-before:always;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman","serif";
mso-fareast-font-family:"Times New Roman";
mso-fareast-theme-font:minor-fareast;}

但是在html应该显示带有类的元素的文档中,它看起来像这样(这是在html输出的中间):

<div>
    <p align=center style='text-align:center'>NOTICE </p>
        <table>
            ......middle html content.....
        </table>
</div>

请注意,div标签中缺少样式和类,并且p标记一起丢失。我无法弄清楚的是,转换为RTF是出于某种原因删除了这些还是Razor Templating Engine正在删除文本?我也试过更改它以输出.doc格式,但结果是一样的。

1 个答案:

答案 0 :(得分:0)

因此,加重答案也是最简单的答案。该样式适用于p,li或div元素,但仅限于元素具有某种内容:

 <div class='newpage'>&nbsp;</div>

只要我使用了其中一个正确的元素,只要有某种内容(在这种情况下只是一个空格),它就会起作用。一旦我开始工作,我还必须解决它在输出中添加一个额外的空白页面的问题,因为最初我在cshtml文件中有这一行。相反,我把它移到后面的代码。

我创建了一个var来保存最后一个列表项,如this SO post here中所示。

var lastItem = myList.Last();

foreach(var d in myList)
{
    newNotice.Body += RazorEngine.Razor.Parse(Notifications.GetTemplate(NotificationTemplate.MyTemplate2), data, NotificationTemplate.MyTemplate2.ToString());
    if(!ReferenceEquals(d, lastItem))
        newNotice.Body += "<div class='newpage'>&nbsp;</div>";
}