gpt4 book ai didi

asp.net-mvc - 如何在没有任何第三方工具的情况下将我的 html Razor View 转换为 pdf 文档

转载 作者:行者123 更新时间:2023-12-02 04:30:15 28 4
gpt4 key购买 nike

我只是 MVC 4 的新手。我有一个 html Razor View ,其中包含所有一些与表相关的数据。

我只想在没有第三方工具的情况下将该 View 转换为 pdf 文档。

最佳答案

如果您使用的是 ASP.NET Core,这是我的解决方案:http://nikolay.it/Blog/2018/03/Generate-PDF-file-from-Razor-view-using-ASP-NET-Core-and-PhantomJS/37

从 Razor View 获取 HTML 字符串

这一步非常简单。有一项名为 IRazorViewEngine 的服务在 ASP.NET Core 中可以注入(inject),然后用于获取 View 。提供默认 View 后 ViewDataDictionaryActionContext我们可以请求将 View 渲染到 StringWriter 中可以很容易地转换为字符串。下面是从给定 Razor View 文件中获取字符串的现成代码:

public interface IViewRenderService
{
Task<string> RenderToStringAsync(string viewName, object model);
}

public class ViewRenderService : IViewRenderService
{
private readonly IRazorViewEngine razorViewEngine;
private readonly ITempDataProvider tempDataProvider;
private readonly IServiceProvider serviceProvider;

public ViewRenderService(
IRazorViewEngine razorViewEngine,
ITempDataProvider tempDataProvider,
IServiceProvider serviceProvider)
{
this.razorViewEngine = razorViewEngine;
this.tempDataProvider = tempDataProvider;
this.serviceProvider = serviceProvider;
}

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

using (var sw = new StringWriter())
{
var viewResult = this.razorViewEngine.GetView(null, 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, this.tempDataProvider),
sw,
new HtmlHelperOptions());

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

这里有一个重要的想法:如果您使用 View 编译(将 View 预编译为 YourProject.Web.PrecompiledViews.dll ),那么使用 GetView 获取 View 很重要方法而不是 FindView .更多信息 here .

使用 PhantomJS 从 HTML 生成 PDF 文件

对于此任务,我们将使用 headless 浏览器来呈现 HTML(其中包含所有 CSS 和 JS)。有很多这样的工具,但我会使用 PhantomJS (可使用 JavaScript API 编写脚本的 headless WebKit)。 PhantomJS 可以非常快速地将渲染页面保存为小型 PDF。为了使 PDF 导出正常工作,我们需要 .js将使用 PhantomJS API 告诉工具我们要导出文件的文件:

"use strict";
var page = require('webpage').create(),
system = require('system'),
address,
output;

console.log('Usage: rasterize.js [URL] [filename] [paperformat]');
address = system.args[1];
output = system.args[2];
page.viewportSize = { width: 600, height: 600 };
page.paperSize = { format: system.args[3], orientation: 'portrait', margin: '0.5cm' };

page.open(address, function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
phantom.exit(1);
} else {
window.setTimeout(function () {
page.render(output);
phantom.exit();
}, 200);
}
});

接下来是运行 phantomjs.exe处理并通过 rasterize.js文件以及 HTML 文件的路径和 PDF 结果的输出文件名。这是在 HtmlToPdfConverter.cs 中完成的:

public interface IHtmlToPdfConverter
{
byte[] Convert(string htmlCode);
}

public class HtmlToPdfConverter : IHtmlToPdfConverter
{
public byte[] Convert(string htmlCode)
{
var inputFileName = "input.html";
var outputFileName = "output.pdf";
File.WriteAllText(inputFileName, htmlCode);
var startInfo = new ProcessStartInfo("phantomjs.exe")
{
WorkingDirectory = Environment.CurrentDirectory,
Arguments = string.Format(
"rasterize.js \"{0}\" {1} \"A4\"",
inputFileName,
outputFileName),
UseShellExecute = true,
};

var process = new Process { StartInfo = startInfo };
process.Start();

process.WaitForExit();

var bytes = File.ReadAllBytes(outputFileName);

File.Delete(inputFileName);
File.Delete(outputFileName);

return bytes;
}
}

如果您打算在 Azure 中部署您的应用程序,那么拥有 UseShellExecute 很重要设置为 true .

一起使用代码

因为我们现在已经实现了 IViewRenderServiceIHtmlToPdfConverter我们可以通过首先在 Startup.cs 中注册它们来开始使用它们ConfigureServices 方法所在的文件(services.AddScoped<IViewRenderService, ViewRenderService>()services.AddScoped<IHtmlToPdfConverter, HtmlToPdfConverter>())。现在让我们看看打包在一起的代码:

private readonly IViewRenderService viewRenderService;
private readonly IHtmlToPdfConverter htmlToPdfConverter;

public DashboardController(
IViewRenderService viewRenderService,
IHtmlToPdfConverter htmlToPdfConverter)
{
this.viewRenderService = viewRenderService;
this.htmlToPdfConverter = htmlToPdfConverter;
}

[HttpGet]
public async Task<IActionResult> GetPdf(SomeInputModel input)
{
var model = this.GetViewModel(input);
var htmlData = await this.viewRenderService.RenderToStringAsync("~/Views/Dashboard/GetPdf.cshtml", model);
var fileContents = this.htmlToPdfConverter.Convert(htmlData);
return this.File(fileContents, "application/pdf");
}

关于asp.net-mvc - 如何在没有任何第三方工具的情况下将我的 html Razor View 转换为 pdf 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23590221/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com