Как мне преобразовать .docx в html с помощью asp.net?

StackOverflow https://stackoverflow.com/questions/55113

  •  09-06-2019
  •  | 
  •  

Вопрос

Word 2007 сохраняет свои документы в формате .docx, который на самом деле представляет собой zip-файл с кучей содержимого, включая XML-файл с документом.

Я хочу иметь возможность взять файл .docx и поместить его в папку в моем веб-приложении asp.net, а код открыть файл .docx и отобразить документ (часть XML) в виде веб-страницы.

Я искал в Интернете дополнительную информацию по этому поводу, но пока не нашел многого.Мои вопросы:

  1. Вы бы (а) использовали XSLT для преобразования XML в HTML или (б) использовали библиотеки манипулирования XML в .net (такие как XDocument и XElement в 3.5) для преобразования в HTML или (в) что-то другое?
  2. Знаете ли вы какие-либо библиотеки/проекты с открытым исходным кодом, которые сделали это, и которые я мог бы использовать в качестве отправной точки?

Спасибо!

Это было полезно?

Решение

Попробуй это почта?Я не знаю, но возможно это то, что вы ищете.

Другие советы

Я написал мамонт.js, представляющая собой библиотеку JavaScript, преобразующую файлы docx в HTML.Если вы хотите выполнить рендеринг на стороне сервера в .NET, существует также версия Mammoth для .NET. доступен на NuGet.

Mammoth пытается создать чистый HTML, просматривая семантическую информацию — например, сопоставляя стили абзацев в Word (например, Heading 1) для соответствия тегам и стилю в HTML/CSS (например, <h1>).Если вам нужно что-то, что создает точную визуальную копию, то Mammoth, вероятно, не для вас.Если у вас есть что-то, что уже хорошо структурировано, и вы хотите преобразовать его в аккуратный HTML, Mammoth может помочь.

В Word 2007 есть API, который можно использовать для преобразования в HTML.Вот пост, в котором об этом говорится http://msdn.microsoft.com/en-us/magazine/cc163526.aspx.Вы можете найти документацию по API, но я помню, что в API есть функция преобразования в HTML.

Этот код поможет преобразовать .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\t@\/\_\(\)]/","",$striped_content);

    echo nl2br($striped_content); 
}

Я использую Интероп.Это несколько проблематично, но в большинстве случаев работает нормально.

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

Этот возвращает список путей к преобразованным в 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;
    }

А этот для преобразования документа в 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();
            }
        }
    }

Убивать слово — это не весело, но нельзя же позволить ему висеть там и блокировать других, верно?

В web/html я визуализирую HTML в iframe.

Существует раскрывающийся список, содержащий список справочных документов.Значение — это путь к его HTML-версии, а текст — это имя документа.

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

    }

по выбранному индексу изменено, оно переносится на кадр

    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";
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top