c# - 如何免费使用 .net core、c# 将 HTML 转换为 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的代码
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();
}
}
解决方案
推荐阅读
- scala - Scala Pattern 在单元测试期间匹配方法的结果
- python-3.x - Python3 和 Tkinter,我无法获得单选按钮来更改变量的值。
- php - 你如何配置 Symfony 4 与其他 XAMPP (Apache) 项目一起路由?
- php - php想法加速18000+调用的脚本
- ios - 找不到类方法“+configureWithApplicationID:”(返回类型默认为“id”)
- python - Python:多处理的非常奇怪的行为;后面的代码导致早期代码的“追溯”减速
- javascript - 如何使用 Javascript 在画布上创建和绘制图像数组?
- drools - 在activiti业务规则任务java.lang.NoClassDefFoundError: org/drools/runtime/rule/AgendaFilter
- c++ - 有效地从 arm/neon 中的整数中解交织偶数和奇数位
- reactjs - 如何使用 antd upload react 发送 multipart/form-data