Как бесплатно конвертировать HTML в Docx с помощью .net core, c#

#c# #html #pdf #.net-core #docx

Вопрос:

Мне нужно бесплатно конвертировать HTML в DOCX или PDF в DOCX, но я не могу найти никаких свежих ответов. Я попробовал этот код:

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

Но в этом коде я получаю исключение нулевой ссылки
var paragraphs = converter.Parse (html);
может ли кто-нибудь помочь устранить текущую ошибку или посоветовать другие способы преобразования

 Update 1
 

Это исключение html-ссылки с нулевой ссылкой. Я создаю его в виде бритвы.

Код для создания html-кода представления razor

  private readonly IRazorViewEngine _razorViewEngine;
        private readonly ITempDataProvider _tempDataProvider;
        private readonly IServiceProvider _serviceProvider;

        public ViewRenderService(IRazorViewEngine razorViewEngine,
            ITempDataProvider tempDataProvider,
            IServiceProvider serviceProvider)
        {
            _razorViewEngine = razorViewEngine;
            _tempDataProvider = tempDataProvider;
            _serviceProvider = serviceProvider;
        }

        public async Task<string> RenderToStringAsync(string viewName, object model)
        {
            var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

            using (var sw = new StringWriter())
            {
                var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);

                if (viewResult.View == null)
                {
                    throw new ArgumentNullException($"{viewName} does not match any available view");
                }

                var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
                {
                    Model = model
                };

                var viewContext = new ViewContext(
                    actionContext,
                    viewResult.View,
                    viewDictionary,
                    new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                    sw,
                    new HtmlHelperOptions()
                );

                await viewResult.View.RenderAsync(viewContext);
                return sw.ToString();
            }
        }
 

Комментарии:

1. нулевая ссылка означает, что объект является нулевым… Поскольку «конвертер» создан двумя строками ранее (конвертер = новый HtmlConverter), он не может быть равен нулю. Единственная переменная, которая может быть нулевой, — это «html», который передается в качестве аргумента функции. Вы уверены, что передаете в него что-то действительное?

2. Да, я уверен, что я сгенерировал html раньше в коде и проверил его в режиме отладки

3. теперь я протестировал его с другим html-кодом, он стал проще и теперь работал, хотя предыдущий html также был действителен