2008-09-10 10 views
8

Word 2007 guarda sus documentos en formato .docx, que en realidad es un archivo zip con un montón de cosas, incluyendo un archivo xml con el documento.¿Cómo convierto un .docx a html usando asp.net?

Quiero ser capaz de tomar un archivo .docx y soltarlo en una carpeta en mi aplicación web asp.net y hacer que el código abra el archivo .docx y mostrar el documento (xml como parte del documento) como una web página.

He estado buscando en la web más información sobre esto pero hasta ahora no he encontrado mucho. Mis preguntas son:

  1. ¿Le (a) utilizar XSLT para transformar el XML a HTML, o (b) utilizar las bibliotecas de manipulación de XML en .NET (como XDocument y XElement en 3.5) para convertir a HTML o (c) otro?
  2. ¿Conoces alguna biblioteca/proyecto de código abierto que haya hecho esto que pueda utilizar como punto de partida?

¡Gracias!

Respuesta

4

Probar post? No lo sé, pero podría ser lo que estás buscando.

2

Word 2007 tiene una API que puede usar para convertir a HTML. Aquí hay una publicación que habla de eso http://msdn.microsoft.com/en-us/magazine/cc163526.aspx. Puede encontrar documentación sobre la API, pero recuerdo que hay una función de conversión a HTML en la API.

+0

¿Te gustaría ser un poco más específico acerca de qué API estás hablando y qué función "convertir a HTML"? Tal vez estás hablando de la clase de paquete? ¿Dónde está esta función "convertir a HTML"? – Jez

1

Este código ayuda a convertir archivos de texto .docx

function read_file_docx($filename){ 

    $striped_content = ''; 
    $content = ''; 

    if(!$filename || !file_exists($filename)) { echo "sucess";}else{ echo "not sucess";} 

    $zip = zip_open($filename); 

    if (!$zip || is_numeric($zip)) return false; 

    while ($zip_entry = zip_read($zip)) { 

     if (zip_entry_open($zip, $zip_entry) == FALSE) continue; 

     if (zip_entry_name($zip_entry) != "word/document.xml") continue; 

     $content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); 

     zip_entry_close($zip_entry); 
    }// end while 

    zip_close($zip); 

    //echo $content; 
    //echo "<hr>"; 
    //file_put_contents('1.xml', $content);  

    $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content); 
    $content = str_replace('</w:r></w:p>', "\r\n", $content); 
    //header("Content-Type: plain/text"); 


    $striped_content = strip_tags($content); 


     $striped_content = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\[email protected]\/\_\(\)]/","",$striped_content); 

    echo nl2br($striped_content); 
} 
0

estoy usando interoperabilidad. Es algo problamático pero funciona bien en la mayoría de los casos.

using System.Runtime.InteropServices; 
using Microsoft.Office.Interop.Word; 

esta devuelve la lista de documentos HTML convertido ruta

public List<string> GetHelpDocuments() 
    { 

     List<string> lstHtmlDocuments = new List<string>(); 
     foreach (string _sourceFilePath in Directory.GetFiles("")) 
     { 
      string[] validextentions = { ".doc", ".docx" }; 
      if (validextentions.Contains(System.IO.Path.GetExtension(_sourceFilePath))) 
      { 
       sourceFilePath = _sourceFilePath; 
       destinationFilePath = _sourceFilePath.Replace(System.IO.Path.GetExtension(_sourceFilePath), ".html"); 
       if (System.IO.File.Exists(sourceFilePath)) 
       { 
        //checking if the HTML format of the file already exists. if it does then is it the latest one? 
        if (System.IO.File.Exists(destinationFilePath)) 
        { 
         if (System.IO.File.GetCreationTime(destinationFilePath) != System.IO.File.GetCreationTime(sourceFilePath)) 
         { 
          System.IO.File.Delete(destinationFilePath); 
          ConvertToHTML(); 
         } 
        } 
        else 
        { 
         ConvertToHTML(); 
        } 

        lstHtmlDocuments.Add(destinationFilePath); 
       } 
      } 


     } 
     return lstHtmlDocuments; 
    } 

Y éste para convertir doc a html.

private void ConvertToHtml() 
    { 
     IsError = false; 
     if (System.IO.File.Exists(sourceFilePath)) 
     { 
      Microsoft.Office.Interop.Word.Application docApp = null; 
      string strExtension = System.IO.Path.GetExtension(sourceFilePath); 
      try 
      { 
       docApp = new Microsoft.Office.Interop.Word.Application(); 
       docApp.Visible = true; 

       docApp.DisplayAlerts = WdAlertLevel.wdAlertsNone; 
       object fileFormat = WdSaveFormat.wdFormatHTML; 
       docApp.Application.Visible = true; 
       var doc = docApp.Documents.Open(sourceFilePath); 
       doc.SaveAs2(destinationFilePath, fileFormat); 
      } 
      catch 
      { 
       IsError = true; 
      } 
      finally 
      { 
       try 
       { 
        docApp.Quit(SaveChanges: false); 

       } 
       catch { } 
       finally 
       { 
        Process[] wProcess = Process.GetProcessesByName("WINWORD"); 
        foreach (Process p in wProcess) 
        { 
         p.Kill(); 
        } 
       } 
       Marshal.ReleaseComObject(docApp); 
       docApp = null; 
       GC.Collect(); 
      } 
     } 
    } 

El asesinato de la palabra no es divertido, pero no puede dejarlo colgado allí y bloquear otros, ¿verdad?

En la web/html, renderizo html en un iframe.

Hay un menú desplegable que contiene la lista de documentos de ayuda. El valor es la ruta a la versión html y el texto es el nombre del documento.

private void BindHelpContents() 
    { 
     List<string> lstHelpDocuments = new List<string>(); 
     HelpDocuments hDoc = new HelpDocuments(Server.MapPath("~/HelpDocx/docx/")); 
     lstHelpDocuments = hDoc.GetHelpDocuments(); 
     int index = 1; 
     ddlHelpDocuments.Items.Insert(0, new ListItem { Value = "0", Text = "---Select Document---", Selected = true }); 

     foreach (string strHelpDocument in lstHelpDocuments) 
     { 
      ddlHelpDocuments.Items.Insert(index, new ListItem { Value = strHelpDocument, Text = strHelpDocument.Split('\\')[strHelpDocument.Split('\\').Length - 1].Replace(".html", "") }); 
      index++; 
     } 
     FetchDocuments(); 

    } 

el índice seleccionado cambiado, es renedred para enmarcar

protected void RenderHelpContents(object sender, EventArgs e) 
    { 
     try 
     { 
      if (ddlHelpDocuments.SelectedValue == "0") return; 
      string strHtml = ddlHelpDocuments.SelectedValue; 
      string newaspxpage = strHtml.Replace(Server.MapPath("~/"), "~/"); 
      string pageVirtualPath = VirtualPathUtility.ToAbsolute(newaspxpage);// 
      documentholder.Attributes["src"] = pageVirtualPath; 
     } 
     catch 
     { 
      lblGError.Text = "Selected document doesn't exist, please refresh the page and try again. If that doesn't help, please contact Support"; 
     } 
    } 
+0

Es una idea horrible utilizar Office Interop desde ASP.NET u otra tecnología de servidor. Estas API se escribieron para su uso en una aplicación de escritorio, para automatizar Office (un conjunto de aplicaciones de escritorio). Las aplicaciones de servidor son diferentes de muchas maneras, por lo que es una muy, muy mala idea usar Office Interop en ellas. Tampoco es compatible con Microsoft y puede violar su licencia de Office. Consulte [Consideraciones para la automatización del lado del servidor de Office] (http://support.microsoft.com/kb/257757) –

+0

@ JohnSaunders, sé que es una idea horrible, pero los requisitos no son fáciles de descarrilar del alcance. Agradecería mucho una buena alternativa para esto. –

3

escribí mammoth.js, que es una biblioteca JavaScript que convierte archivos docx a HTML. Si desea hacer el procesamiento del lado del servidor en .NET, también hay una versión .NET de Mammoth available on NuGet.

Mammoth intenta producir código HTML limpio al observar información semántica, por ejemplo, asignar estilos de párrafo en Word (como Heading 1) a etiquetas y estilos apropiados en HTML/CSS (como <h1>).Si quieres algo que produzca una copia visual exacta, entonces Mammoth probablemente no sea para ti. Si tiene algo que ya está bien estructurado y desea convertirlo en HTML ordenado, Mammoth podría hacer el truco.

+0

dotnet-mamut es una biblioteca útil, la estoy usando y funciona bien. Solo tengo un problema en la implementación, si puede verlo [aquí] (http://stackoverflow.com/questions/31885962/converting-docx-to-html-with-dotnet-mammoth-fails-at- deploy-server). – zed

Cuestiones relacionadas