提前感谢您提供的任何帮助。我一直在挖掘这里的各种帖子,试图解决丢失的分页问题。我有许多使用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格式,但结果是一样的。
答案 0 :(得分:0)
因此,加重答案也是最简单的答案。该样式适用于p,li或div元素,但仅限于元素具有某种内容:
<div class='newpage'> </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'> </div>";
}