2016-01-15 4 views
1

Я использую инструменты OpenXml Power в моем проекте для преобразования документа (docx) в html, с использованием кода, уже предоставленного этим sdk, он производит элегантный дубликат в форме html . (Github link: https://github.com/OfficeDev/Open-Xml-PowerTools/blob/vNext/OpenXmlPowerToolsExamples/HtmlConverter01/HtmlConverter01.cs)Преобразование Docx в html с помощью инструментов PowerPoint без форматирования

Однако, глядя на разметку 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# я уже сделал следующие ajustments:

  • AdditionalCss закомментирована
  • FabricateCssClasses ложна
  • CssClassPrefix закомментирована

Большое спасибо.

+2

Вы также можете разобрать полученный HTML и удалить все атрибуты. – Xiaoy312

+0

Это была бы отличная идея. Спасибо ! – TinMan7757

ответ

1

Если вы также можете получить 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> 
0

Я решил это с оттенком от 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)); 

Будут другие способы сделать это, но это похоже на приемлемую работу.

EDIT:

После нескольких экспериментов с обоими ответами, размещенные здесь, я нашел эту реализацию, чтобы работать лучше, поскольку он не имеет проблемы с изображениями.

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(); 
     } 
    } 
    } 

В теории вы можете также использовать это для таблиц, однако в зависимости от стиля вы хотите, вы всегда можете вырезать атрибуты, сгенерированные электроинструментами и заменить атрибуты с вашим собственным.

Смежные вопросы