将HTML转换成PDF在MVC与MVC剃刀iTextSharp的(Convert HTML to P

2019-09-02 19:14发布

我想HTML转换为PDF与iTextSharp MVC中的剃须刀,但一切我都试过没有奏效。 有谁知道如何做到这一点?

Answer 1:

有一个详细的step-by-step tutorial CodeProject上,你可以遵循。 它说明了如何可以成为一个ASP.NET MVC查看使用iTextSharp的用于转换PDF文件。 请记住尽管这iTextSharp的不是给HTML转换为PDF格式,因此可能无法与复杂的HTML页面和CSS样式应付得很好。



Answer 2:

这里是你使用剃刀引擎与怪异如何实施这一方案<itext..标记。

这种方式,你有超过使用标准HTML输出的PDF演示文稿的完全控制。

用一个例子的解决方案和源代码的项目可以在这里用的NuGet安装说明:

https://github.com/andyhutch77/MvcRazorToPdf

Install-Package MvcRazorToPdf

这也采用了全新的iTextSharp的许可证,因此不会从任何其他的答案中提到的底片之苦。



Answer 3:

你应该看看RazorPDF这是一个利用iText生成PDF,但在一个友好的方式。



Answer 4:

public virtual void printpdf(string html)    
{
     String htmlText = html.ToString();
     Document document = new Document();
     string filePath = HostingEnvironment.MapPath("~/Content/Pdf/");
     PdfWriter.GetInstance(document, new FileStream(filePath + "\\pdf-"+Filename+".pdf", FileMode.Create));

     document.Open();    
     iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document);       
     hw.Parse(new StringReader(htmlText));    
     document.Close();    
}

只是通过html string中参数字符串你将得到renderpartialview text = viewname....



Answer 5:

从MVC HTML视图转换为PDF(即使它不是直接有关iTextSharp的主题)的一个好方法是使用Rotativa :

Install-Package Rotativa

这是基于wkhtmltopdf但是它具有更好的CSS支持比iTextSharp的有,并且是与MVC整合,你可以简单地返回阅读PDF文件非常简单:

public ActionResult GetPdf()
{
    //...
    return new ViewAsPdf(model);// and you are done!
}


Answer 6:

下面是MVC剃刀在C#中使用一个完整的示例EVO HTML到PDF的.NET当前的MVC视图转换为PDF和PDF结果发送到浏览器下载:

[HttpPost]
public ActionResult ConvertCurrentPageToPdf(FormCollection collection)
{
    object model = null;
    ViewDataDictionary viewData = new ViewDataDictionary(model);

    // The string writer where to render the HTML code of the view
    StringWriter stringWriter = new StringWriter();

    // Render the Index view in a HTML string
    ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, "Index", null);
    ViewContext viewContext = new ViewContext(
            ControllerContext,
            viewResult.View,
            viewData,
            new TempDataDictionary(),
            stringWriter
            );
    viewResult.View.Render(viewContext, stringWriter);

    // Get the view HTML string
    string htmlToConvert = stringWriter.ToString();

    // Get the base URL
    String currentPageUrl = this.ControllerContext.HttpContext.Request.Url.AbsoluteUri;
    String baseUrl = currentPageUrl.Substring(0, currentPageUrl.Length - "Convert_Current_Page/ConvertCurrentPageToPdf".Length);

    // Create a HTML to PDF converter object with default settings
    HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();

    // Convert the HTML string to a PDF document in a memory buffer
    byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlToConvert, baseUrl);

    // Send the PDF file to browser
    FileResult fileResult = new FileContentResult(outPdfBuffer, "application/pdf");
    fileResult.FileDownloadName = "Convert_Current_Page.pdf";

    return fileResult;
}


Answer 7:

在这里你可以找到的情况下,你想要写纯XML不同的方法,我觉得它更简单,重量更轻。

http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3



Answer 8:

这是怎么使用做MVC

[Route("ABCDD")]
[HttpGet]
public void ABCDD() {
    WebClient wc = new WebClient();
    // string url = HttpContext.Current.Request.Url.AbsoluteUri;
    string url = "http://localhost:3042/Reports/COAListing";
    string fileContent = wc.DownloadString(url);

    List<string> tableContents = GetContents(fileContent, table_pattern);

    string HTMLString = String.Join(" ", tableContents.ToArray());

    Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
    PdfWriter.GetInstance(pdfDoc, HttpContext.Current.Response.OutputStream);
    pdfDoc.Open();
    pdfDoc.Add(new Paragraph("Welcome to dotnetfox"));
    List<IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(HTMLString), null);
    for (int k = 0; k < htmlarraylist.Count; k++) {
        pdfDoc.Add((IElement) htmlarraylist[k]);
    }

    pdfDoc.Close();
    HttpContext.Current.Response.ContentType = "pdf/application";
    HttpContext.Current.Response.AddHeader("content-disposition", "attachment;" +
            "filename=sample.pdf");
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Write(pdfDoc);
    HttpContext.Current.Response.End();
}


Answer 9:

如果你正在使用ASP.NET的核心和iTextSharp的不是你,这里重要的是使用PhantomJS我的解决方案: http://nikolay.it/Blog/2018/03/Generate-PDF-file-from-Razor-view-使用-ASP-NET-核心- PhantomJS / 37

从Razor视图获取HTML字符串

这一步是非常直接的。 有一个叫服务IRazorViewEngine在ASP.NET核心可以注入,然后用得到的视图。 提供具有默认的视图后ViewDataDictionaryActionContext我们可以请求要被渲染到视图StringWriter可以很容易地转换成字符串。 下面是从给定的Razor视图文件中获取一个字符串准备使用的代码:

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

一个重要的考虑在这里:如果您使用视图编译(预编译意见YourProject.Web.PrecompiledViews.dll ),那么它得到使用的观点是重要的GetView方法,而不是FindView 。 更多信息这里 。

从生成使用HTML PhantomJS PDF文件

对于这个任务,我们将使用模拟浏览器将呈现HTML(所有的CSS和包含在里面JS)。 有很多这样的工具,但我会用PhantomJS (无头WebKit的编写脚本通过一段JavaScript API)。 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");
}


文章来源: Convert HTML to PDF in MVC with iTextSharp in MVC Razor