web-dev-qa-db-ja.com

C#でHTMLをDocxに変換する

hTMLページをc#でdocxに変換したいのですが、どうすればよいですか?

15
Luis

そのコードを使用して変換する

Microsoft.Office.Interop.Word.Application Word = 
    new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document wordDoc = 
    new Microsoft.Office.Interop.Word.Document();
Object oMissing = System.Reflection.Missing.Value;
wordDoc = Word.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
Word.Visible = false;
Object filepath = "c:\\page.html";
Object confirmconversion = System.Reflection.Missing.Value;
Object readOnly = false;
Object saveto = "c:\\doc.pdf";
Object oallowsubstitution = System.Reflection.Missing.Value;

wordDoc = Word.Documents.Open(ref filepath, ref confirmconversion, 
    ref readOnly, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing, ref oMissing);
 object fileFormat = WdSaveFormat.wdFormatPDF;
 wordDoc.SaveAs(ref saveto, ref fileFormat, ref oMissing, ref oMissing, ref oMissing,
     ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
     ref oMissing, ref oMissing, ref oMissing, ref oallowsubstitution, ref oMissing,
     ref oMissing);
3
Luis

以下はLuisコードと同じことを行いますが、もう少し読みやすく、ASP.NET MVCアプリケーションに適用されます。

var Word = new Microsoft.Office.Interop.Word.Application();
Word.Visible = false;

var filePath = Server.MapPath("~/MyFiles/Html2PdfTest.html");
var savePathPdf = Server.MapPath("~/MyFiles/Html2PdfTest.pdf");
var wordDoc = Word.Documents.Open(FileName: filePath, ReadOnly: false);
wordDoc.SaveAs2(FileName: savePathPdf, FileFormat: WdSaveFormat.wdFormatPDF);

次のようなdocxなどの他の形式で保存することもできます。

var savePathDocx = Server.MapPath("~/MyFiles/Html2PdfTest.docx");
var wordDoc = Word.Documents.Open(FileName: filePath, ReadOnly: false);
wordDoc.SaveAs2(FileName: savePathDocx, FileFormat: WdSaveFormat.wdFormatXMLDocument);
11

私のソリューションは Html2OpenXml とともに DocumentFormat.OpenXmlHtml2OpenXmlのNuGetパッケージはこちら )を使用してASP.NET MVCのエレガントなソリューションを提供します。

WordHelper.cs

public static class WordHelper
{
    public static byte[] HtmlToWord(String html)
    {
        const string filename = "test.docx";
        if (File.Exists(filename)) File.Delete(filename);

        using (MemoryStream generatedDocument = new MemoryStream())
        {
            using (WordprocessingDocument package = WordprocessingDocument.Create(
                   generatedDocument, WordprocessingDocumentType.Document))
            {
                MainDocumentPart mainPart = package.MainDocumentPart;
                if (mainPart == null)
                {
                    mainPart = package.AddMainDocumentPart();
                    new Document(new Body()).Save(mainPart);
                }

                HtmlConverter converter = new HtmlConverter(mainPart);
                Body body = mainPart.Document.Body;

                var paragraphs = converter.Parse(html);
                for (int i = 0; i < paragraphs.Count; i++)
                {
                    body.Append(paragraphs[i]);
                }

                mainPart.Document.Save();
            }

            return generatedDocument.ToArray();
        }
    }
}

コントローラ

    [HttpPost]
    [ValidateInput(false)]
    public FileResult Demo(CkEditorViewModel viewModel)
    {
        return File(WordHelper.HtmlToWord(viewModel.CkEditorContent),
          "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
    }

このサンプルのHTMLを生成するために CKEditor を使用しています。

OpenXML SDKを使用すると、プログラムでdocxドキュメントを作成できます。

OpenXml SDKダウンロード

2
Gibsnag

AltChunkの使用を検討してください。とりわけ、 altchunkから作成されたopenxml docに画像を追加する を参照してください。

WordでHTMLを変換したくない場合は、docx4j-ImportXHTML for .NETを試すことができます。 このウォークスルー を参照してください。

1
JasonPlutext

Microsoftは、WebサーバーでOfficeアプリケーションを使用することを推奨していません。ただし、これはOpenXML 2.5を使用してかなり簡単に行うことができます

あなたが本当にしなければならないのは、HTMLを( "<"、 ">")で分割することだけです。それから、各部分がそれをスイッチに押し込み、それがHTMLタグかどうかを識別します。

次に、各パーツについて、HTMLを「Run」および「RunProperties」に変換し始めることができ、非HTMLテキストは単に「Text」に配置されます

それはそれより難しいように聞こえます...そしてはい、私はこれを正確に行うために利用可能なコードがない理由がわかりません。

覚えておくべきこと。 2つの形式は相互にきれいに変換されないため、可能な限り最もクリーンなコードに焦点を合わせると、形式自体が乱雑になる問題が発生します。

0
Kevin Damen

HTMLファイルやHTML文字列をWordMLに変換するための非常に便利なツールを提供する PHPDocX の使用を検討してください。

それらの間にはたくさんのオプションがあります:

  1. hTMLのチャンクをWord文書に挿入する必要があるCSSスタイルセレクターを使用してフィルタリングできます。
  2. 画像をダウンロードするか、外部リンクとしてダウンロードするかを選択できます。
  3. HTMLフォームを解析します。
  4. 元のCSSを上書きするテーブルや段落には、ネイティブのWordスタイルを使用できます。
  5. WordブックマークのHTMLアンカーを変換します。
  6. etcetera

参考になれば幸いです:-)

0
Eduardo

Aspose.Words for .NET は、これを実現できる商用コンポーネントです。

0
Darin Dimitrov

MigraDocが役立ちます。または、Office用のVSツールを使用します。または、COM経由でOfficeに接続します。

0
Sasha Reminnyi