Question

Word 2007 enregistre ses documents au format .docx, qui est en réalité un fichier zip contenant de nombreux éléments, notamment un fichier XML contenant le document.

Je veux pouvoir prendre un fichier .docx et le déposer dans un dossier de mon application Web asp.net et demander au code d'ouvrir le fichier .docx et de restituer le document (partie XML du) sous forme de page Web.

J'ai cherché sur le Web plus d'informations à ce sujet, mais jusqu'à présent, je n'ai pas trouvé grand-chose.Mes questions sont :

  1. Souhaitez-vous (a) utiliser XSLT pour transformer le XML en HTML, ou (b) utiliser des bibliothèques de manipulation XML dans .net (telles que XDocument et XElement dans 3.5) pour convertir en HTML ou (c) autre ?
  2. Connaissez-vous des bibliothèques/projets open source qui ont fait cela et que je pourrais utiliser comme point de départ ?

Merci!

Était-ce utile?

La solution

Essaye ça poste?Je ne sais pas mais c'est peut-être ce que vous recherchez.

Autres conseils

J'ai écrit mammouth.js, qui est une bibliothèque JavaScript qui convertit les fichiers docx en HTML.Si vous souhaitez effectuer le rendu côté serveur dans .NET, il existe également une version .NET de Mammoth disponible sur NuGet.

Mammoth essaie de produire du HTML propre en examinant les informations sémantiques -- par exemple, en mappant les styles de paragraphe dans Word (tels que Heading 1) aux balises et au style appropriés en HTML/CSS (tels que <h1>).Si vous voulez quelque chose qui produit une copie visuelle exacte, alors Mammoth n'est probablement pas pour vous.Si vous avez quelque chose qui est déjà bien structuré et que vous souhaitez le convertir en HTML soigné, Mammoth pourrait faire l'affaire.

Word 2007 dispose d'une API que vous pouvez utiliser pour convertir en HTML.Voici un article qui en parle http://msdn.microsoft.com/en-us/magazine/cc163526.aspx.Vous pouvez trouver de la documentation autour de l'API, mais je me souviens qu'il existe une fonction de conversion en HTML dans l'API.

Ce code aidera à convertir .docx fichier en texte

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\t@\/\_\(\)]/","",$striped_content);

    echo nl2br($striped_content); 
}

J'utilise Interop.C'est quelque peu problématique mais fonctionne bien dans la plupart des cas.

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

Celui-ci renvoie la liste des chemins des documents convertis en HTML

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

Et celui-ci pour convertir le doc en 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();
            }
        }
    }

Tuer le mot n'est pas amusant, mais on ne peut pas le laisser rester là et bloquer les autres, n'est-ce pas ?

Dans le web/html, je rends le HTML dans une iframe.

Il y a une liste déroulante qui contient la liste des documents d'aide.La valeur est le chemin d'accès à la version HTML et le texte est le nom du document.

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

    }

sur l'index sélectionné modifié, il est rendu au cadre

    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";
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top