#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 также был действителен