[英]Convert Docx to html using OpenXml power tools without formatting
我在項目中使用OpenXml Power工具將文檔(docx)轉換為html,使用此sdk已提供的代碼,它會以html形式生成優雅的副本。(Github鏈接: https : //github.com/OfficeDev /Open-Xml-PowerTools/blob/vNext/OpenXmlPowerToolsExamples/HtmlConverter01/HtmlConverter01.cs )
但是,從html標記來看,html具有嵌入式樣式。
有什么辦法可以關閉它,並使用簡單的<h1>
和<p>
標簽?
我想知道這種嵌入式樣式,因為格式化將由引導程序處理。
嵌入式樣式如下:
<p dir="ltr" style="font-family: Calibri;font-size: 11pt;line-height: 115.0%;margin-bottom: 0;margin-left: 0;margin-right: 0;margin-top: 0;">
<span xml:space="preserve" style="font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"> </span>
</p>
如您所見,如果您想要直接復制,則很好,但如果您要自己控制樣式,則不行。
在C#代碼中,我已經進行了以下調整:
非常感謝。
如果您還可以通過XmlReader
和XmlWriter
獲得裸露的html。 但是,這可能有點過大,因為僅保留標簽本身及其文本內容。
public static class HtmlHelper
{
/// <summary>
/// Keep only the openning and closing tag, and text content from the html
/// </summary>
public static string CleanUp(string html)
{
var output = new StringBuilder();
using (var reader = XmlReader.Create(new StringReader(html)))
{
var settings = new XmlWriterSettings() { Indent = true, OmitXmlDeclaration = true };
using (var writer = XmlWriter.Create(output, settings))
{
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
writer.WriteStartElement(reader.Name);
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
}
}
}
}
return output.ToString();
}
}
結果輸出:
<p>
<span></span>
</p>
我已經通過Xiaoy312的提示解決了這個問題...
使用以下示例,在使用上面的示例時,可以將生成的html字符串加載到html敏捷包中,如下所示:
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlString);
然后尋找屬性(樣式和其他屬性),將其刪除。
var styles = htmlDoc.DocumentNode.SelectNodes("//@style");
if (styles != null)
{
foreach (var item in styles)
{
item.Attributes["style"].Remove();
}
}
然后保存文件。
var fileName = Path.Combine(outputDirectory,"index.html");
htmlDoc.Save(new FileStream(fileName,FileMode.Create,FileAccess.ReadWrite));
會有其他方法可以執行此操作,但似乎可以接受。
編輯:
經過對此處發布的兩個答案進行一些試驗后,我發現此實現效果最佳,因為它對圖像沒有問題。
var body = htmlDoc.DocumentNode.SelectSingleNode("//body");
var tags = body.SelectNodes("//*");
if (tags != null)
{
foreach (var tag in tags){
if (!tag.OuterHtml.Contains("img"))
{
tag.Attributes.RemoveAll();
}
}
}
從理論上講,您也可以將其用於表格,但是根據所需的樣式,您總是可以去除電動工具生成的屬性,並用自己的屬性替換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.