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

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

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

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

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

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
14 383
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

Не могли бы вы уточнить, о каком API вы говорите и какая функция «конвертировать в HTML»? Возможно, вы говорите о классе Package? Где эта функция "конвертировать в HTML"?

Jez 03.10.2011 13:10

Этот код поможет преобразовать файл .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); 
}

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

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

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

В Интернете / 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";
        }
    }

Ужасная идея использовать Office Interop из ASP.NET или другой серверной технологии. Эти API-интерфейсы были написаны для использования в настольном приложении для автоматизации Office (набора настольных приложений). Серверные приложения во многом отличаются, поэтому использование в них Office Interop - очень и очень плохая идея. Он также не поддерживается Microsoft и может нарушать вашу лицензию на Office. См. Рекомендации по серверной автоматизации Office

John Saunders 10.05.2015 19:39

@JohnSaunders, я знаю, что это ужасная идея, но требования нелегко сбить с толку. Я был бы очень признателен за хорошую альтернативу для этого вопроса.

messed-up 13.05.2015 16:44

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

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

dotnet-mammoth - полезная библиотека, я ее использую и отлично работает. У меня проблема только при развертывании, если вы можете взглянуть на нее здесь.

zed 10.08.2015 17:49

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