Преобразовывать документ docx в html

У меня есть документ docx уже охраняемый в bytes[] и я нуждаюсь в том, чтобы переместить это в html, чтобы мочь показывать это на странице.

Я использую Визуальный Studio с.NET, чтобы это развивать в C#.

В настоящее время уже Вы я функционируете начиная с pdf, что легкий для того, чтобы быть преобразованным в html, но не случай docx даже не никакой продукт Microsoft, так как я не могу использовать родной книжный магазин interop так как Вы не гарантия, что сервер считал это установленным.

Конечный результат:

strFinalDoc = strFinalDoc.Replace("<body>", "<body>" + documentInfoHtml + "<BR /><BR />");

Где documentInfoHtml Вы результат преобразовывания bytes[] в html и strFinalDoc Вы просто содержание, которое Вы заменяете body страницы.

Я нашел какое-то решение, но практически все используют interop или книжные магазины оплаты.

Вы знаете какой-то способ это делать с бесплатным программным обеспечением или открытыми проектами?

Кроме того я должен делать тот же процесс для каталогов xls и xlsx.

Настоящий ответ очень хороший, но только покрывает каталог doc и не docx

Важно также поддерживать возможный максимум стили существующие CSS, из-за которого ответы, которые просто добывали бы содержание, чтобы я это произвел в HTML это не достаточно в том смысле, что Вы потеряли бы весь формат.

12
задан 07.07.2016, 12:04
3 ответа

Используя Апачи POI относительно легко делать это. Так что мы можем использовать NPOI , чтобы делать ее trasformaciГіn в C#.

Используя как основание этот ответ Convert Word to HTML with Апачи POI

VersiГіn для java

HWPFDocumentCore wordDocument = WordToHtmlUtils.loadDoc(new
FileInputStream("D:\\temp\\seo\\1.doc"));

WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
        DocumentBuilderFactory.newInstance().newDocumentBuilder()
                .newDocument());
wordToHtmlConverter.processDocument(wordDocument);
Document htmlDocument = wordToHtmlConverter.getDocument();
ByteArrayOutputStream out = new ByteArrayOutputStream();
DOMSource domSource = new DOMSource(htmlDocument);
StreamResult streamResult = new StreamResult(out);

TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer = tf.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty(OutputKeys.METHOD, "html");
serializer.transform(domSource, streamResult);
out.close();

String result = new String(out.toByteArray());
System.out.println(result);

Trasformamos это в C#

HWPFDocumentCore wordDocument = WordToHtmlUtils.LoadDoc(@"D:\Hola.doc"); 

WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
    new XmlDocument());

wordToHtmlConverter.ProcessDocument(wordDocument);

XmlDocument htmlDocument = wordToHtmlConverter.Document;

htmlDocument.Save(@"D:\Hola.html");

Te я рекомендую, чтобы ты не опустил NPOI из-за nuget (versiГіn настоящий 2.2.1) и используй ее versiГіn 2.1.3.1, но официальной страницы, так как требуются два архива больше, что не приходят в nuget NPOI.ScratchPad.HSSF.dll и NPOI.ScratchPad.HWPF.dll оба, составленные с NET Framework 2.x, и нужно, чтобы другие книжные магазины были версии 2.x также. Ты можешь разгружать эти 2 архива Github NPOI


Делая доказательства кажется, что она versiГіn NPOI есть у bug в конечном результате HTML, так как, чтобы симулировать формат, он создает стиль с первой буквой типа этикетки и увеличительного номера

<!-- ejemplo POI java-->
span.s1{color:red;}
...
<span class="s1">Hola</span>

, но из-за какой-то razГіn она versiГіn NET он не производит их, довольно

<!-- ejemplo NPOI C#-->
span.s1{color:red;}
...
<span>Hola</span>

Может быть имел общее с Transformer, но не каковой будет эквивалентность в C#


Делая ручной счет, возможно, что уже он не нуждается больше для того, чтобы был виден хорошо выход

    ....
    XmlNode node = htmlDocument.FirstChild.LastChild; //encontramos el body
    EditNode(node); //metodo de edición recursiva
    htmlDocument.Save(@"D:\tmp18\Hola.html");
}

Dictionary<string, int> cuenta; //para llevar la cuenta de cada elemento

private void EditNode(XmlNode node) {
    try
    {
        XmlElement xe = (XmlElement)node;     

        xe.SetAttribute("class", cuenta[xe.LocalName].ToString()); //localName seria span o p por ejemplo
        cuenta[xe.LocalName] += 1;
    }
    catch (Exception) { return; }

    if (node.HasChildNodes) {
        foreach (XmlNode x in node.ChildNodes) {                
            EditNode(x);
        }
    }

}
10
ответ дан 24.11.2019, 13:57
  • 1
    Привет @jasilva, Твой ответ мне кажется очень хорошим, я пробую применять это, но меня отпускает ошибка: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF) я bsucando qu и # 233; чтобы видеть. – Miquel Coll 01.07.2016, 12:45
  • 2
    Эта ошибка, - потому что ты используешь файл docx, и эта часть использует только файлы doc оставляет я обновляю ответ – jasilva 01.07.2016, 16:52
  • 3
    Уже я открыл c и # 243; mo делать это исследуя м и # 225; s с NPO (и tambi и # 233; n это я начинаю с XLS и XLSX.) ты можешь обновлять твой ответ с docx? Схвати и # 237; мы оставляем это закрытым:) – Miquel Coll 06.07.2016, 10:52

Так как документ Word составлен XML, тогда, потому что не уезжая из этой одинокой точки конвертируешь ты XML в HTML. Прицел на странице MSDN они показывают тебе структуру, у которой есть документ word в xml, здесь я оставляю тебе структуру:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
  <CoreProperties xmlns="http://schemas.microsoft.com/package/2005/06/md/core-properties"> 
   <Title>Word Document Sample</Title> 
   <Subject>Microsoft Office Word 2007</Subject> 
   <Creator>2007 Microsoft Office System User</Creator> 
   <Keywords/> 
   <Description>2007 Microsoft Office system .docx file</Description> 
   <LastModifiedBy>2007 Microsoft Office System User</LastModifiedBy> 
   <Revision>2</Revision> 
   <DateCreated>2005-05-05T20:01:00Z</DateCreated> 
   <DateModified>2005-05-05T20:02:00Z</DateModified> 
  </CoreProperties>

И таким же образом в MSDN также они дают тебе пример использования XmlDocument Class, здесь пример этого:

 using System;
 using System.IO;
 using System.Xml;

 public class Sample
 {
   public static void Main()
   {
     //Create the XmlDocument.
     XmlDocument doc = new XmlDocument();
     doc.LoadXml("<?xml version='1.0' ?>" +
            "<book genre='novel' ISBN='1-861001-57-5'>" +
            "<title>Pride And Prejudice</title>" +
            "</book>");

     //Display the document element.
     Console.WriteLine(doc.DocumentElement.OuterXml);
  }
 }

Сейчас, чтобы иметь доступ в узлы, ты можешь делать это так:

  public XmlNode GetBook(string uniqueAttribute, XmlDocument doc)
  {
      XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
      nsmgr.AddNamespace("bk", "http://www.contoso.com/books");
      string xPathString = "//bk:books/bk:book[@ISBN='" + uniqueAttribute +      "']";
      XmlNode xmlNode = doc.DocumentElement.SelectSingleNode(xPathString, nsmgr);
     return xmlNode;
  }

Тогда там он, где уже ты прилагаешь весь твой код HTML. Я увидел коды в MSDN Ксмльдокумент Класс

4
ответ дан 24.11.2019, 13:57

Превращение

Поскольку уже ты понял, docx не другая вещь, чем xml zipeado, и следовательно легко преобразуемо в HTML.

Я посылаю клиента

Чтобы посылать информацию клиенту (чтобы убеждаться, которого txt ему не показался одиноким) нужно вспоминать о том, что посылает раньше Headers:

Content-Type:text/html; charset=utf8
Content-Length: 12345

В charset он нужен помещать то, что соответствует, и в content length также (в байт, не в chars, давайте помнить, что char utf8 может измерять более одного байт). length служит для того, чтобы браузер знал, сколько байт он ждет, и мог помещать он она трубит прогресса, когда документ длинный.

Compactar

Как только я функционировал без compactar ты мог бы оценивать использовать middleware или модуль, чтобы посылать информацию compactada (gzip например)

1
ответ дан 24.11.2019, 13:57