使用 OpenXml 强大工具将 Docx 转换为 html,无需格式化
Convert Docx to html using OpenXml power tools without formatting
我在项目中使用 OpenXml Power 工具将文档 (docx) 转换为 html,
使用此 sdk 已提供的代码,它会以 html 形式生成一个优雅的副本。(Github link : https://github.com/OfficeDev/Open-Xml-PowerTools/blob/vNext/OpenXmlPowerToolsExamples/HtmlConverter01/HtmlConverter01.cs )
但是查看 html 标记,html 具有嵌入式样式。
有没有办法关闭它并使用简单明了的 <h1>
和 <p>
标签?
我想知道这种嵌入式样式,因为 bootstrap 会处理格式设置。
内嵌样式如下:
<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#代码中我已经做了如下调整:
- AdditionalCss 被注释掉了
- FabricateCssClasses 为假
- CssClassPrefix 被注释掉
非常感谢。
我在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();
}
}
}
理论上,您也可以将其用于表格,但是根据您想要的样式,您始终可以去掉电动工具生成的属性并用您自己的属性替换这些属性。
如果你还可以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>
我在项目中使用 OpenXml Power 工具将文档 (docx) 转换为 html, 使用此 sdk 已提供的代码,它会以 html 形式生成一个优雅的副本。(Github link : https://github.com/OfficeDev/Open-Xml-PowerTools/blob/vNext/OpenXmlPowerToolsExamples/HtmlConverter01/HtmlConverter01.cs )
但是查看 html 标记,html 具有嵌入式样式。
有没有办法关闭它并使用简单明了的 <h1>
和 <p>
标签?
我想知道这种嵌入式样式,因为 bootstrap 会处理格式设置。
内嵌样式如下:
<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#代码中我已经做了如下调整:
- AdditionalCss 被注释掉了
- FabricateCssClasses 为假
- CssClassPrefix 被注释掉
非常感谢。
我在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();
}
}
}
理论上,您也可以将其用于表格,但是根据您想要的样式,您始终可以去掉电动工具生成的属性并用您自己的属性替换这些属性。
如果你还可以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>