Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在MVC中使用iTextSharp将HTML转换为PDF_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Itext_Html To Pdf - Fatal编程技术网

Asp.net 在MVC中使用iTextSharp将HTML转换为PDF

Asp.net 在MVC中使用iTextSharp将HTML转换为PDF,asp.net,asp.net-mvc,asp.net-mvc-4,itext,html-to-pdf,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Itext,Html To Pdf,我正试图用MVC Razor中的iTextSharp将HTML转换为PDF,但我尝试的一切都没有成功。有人知道如何做到这一点吗?您可能会遵循一个详细的、基于代码的项目。它说明了如何使用iTextSharp将ASP.NET MVC视图转换为PDF文件。请记住,iTextSharp不是用于将HTML转换为PDF的,因此它可能无法很好地处理复杂的HTML页面和CSS样式。您应该检查哪个用户使用iText生成PDF,但使用更友好的方式。如果您想编写纯xml,您可以在这里找到不同的方法,我发现它更简单、更

我正试图用MVC Razor中的
iTextSharp
将HTML转换为PDF,但我尝试的一切都没有成功。有人知道如何做到这一点吗?

您可能会遵循一个详细的、基于代码的项目。它说明了如何使用iTextSharp将ASP.NET MVC视图转换为PDF文件。请记住,iTextSharp不是用于将HTML转换为PDF的,因此它可能无法很好地处理复杂的HTML页面和CSS样式。

您应该检查哪个用户使用iText生成PDF,但使用更友好的方式。

如果您想编写纯xml,您可以在这里找到不同的方法,我发现它更简单、更轻


以下是如何使用Razor引擎NOT和奇怪的

只需将
html字符串
传入参数
您将通过renderpartialview获得的字符串
text=viewname….

这是如何使用
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();
}
[路线(“ABCDD”)]
[HttpGet]
公开无效ABCDD(){
WebClient wc=新的WebClient();
//字符串url=HttpContext.Current.Request.url.AbsoluteUri;
字符串url=”http://localhost:3042/Reports/COAListing";
string fileContent=wc.DownloadString(url);
List tableContents=GetContents(fileContent,table_模式);
字符串HTMLString=string.Join(“,tableContents.ToArray());
文档pdfDoc=新文档(PageSize.A4、10f、10f、10f、0f);
GetInstance(pdfDoc,HttpContext.Current.Response.OutputStream);
pdfDoc.Open();
pdfDoc.Add(新段落(“欢迎使用dotnetfox”);
List htmlaraylist=HTMLWorker.parsetList(新的StringReader(HTMLString),null);
for(int k=0;k
将MVC HTML视图转换为PDF的一个好方法(即使它与iTextSharp主题无关)是使用:

这是基于
wkhtmltopdf
的,但是它比iTextSharp有更好的css支持,并且与MVC集成非常简单,因为您可以简单地将视图返回为pdf:

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

以下是C#中MVC Razor的完整示例,使用将当前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;
}

如果您使用的是ASP.NET Core,而iTextSharp对您来说并不重要,那么下面是我使用PhantomJS的解决方案:

从Razor视图获取HTML字符串 这一步很直接。ASP.NET核心中有一个名为
IRazorViewEngine
的服务,可以注入该服务,然后使用该服务获取视图。在为视图提供默认的
ViewDataDictionary
ActionContext
后,我们可以请求将视图呈现为
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();
        }
    }
}
下一步是运行
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
非常重要

一起使用代码 由于我们现在已经实现了
IViewRenderService
IHtmlToPdfConverter
,我们可以首先在ConfigureServices方法应该位于的
Startup.cs
文件中注册它们来开始使用它们(
services.AddScoped()
services.AddScoped()
)。现在,让我们来看看打包在一起的代码:

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");
}
private只读IViewRenderService视图渲染服务;
专用只读IHtmlToPdfConverter HTMLOPDFConverter;
公共仪表板控制器(
IViewRenderService视图渲染服务,
IHtmlToPdfConverter HTMLOPDFConverter)
{
this.viewRenderService=viewRenderService;
this.htmlToPdfConverter=htmlToPdfConverter;
}
[HttpGet]
公共异步任务GetPdf(SomeInputModel输入)
{
var model=this.GetViewModel(输入);
var htmlData=wait this.viewRenderService.RenderToStringAsync(“~/Views/Dashboard/GetPdf.cshtml”,model);
var fileContents=this.htmlToPdfConverter.Convert(htmlData);
返回此.File(fileContents,“application/pdf”);
}

Hi Rosdi Kasim。很明显,最新的iTextSharp版本(5.4.4)不能与RazorPDF一起正常工作,并使其变得无用。@real_yggdrasil小心。。最新的iTextSharp(从5.x开始)具有不同的许可证。此外,“变得无用”也没有帮助。。试着用一些例子或详细的描述来提交你的问题。我不同意。它已经变得毫无用处,因为它什么都不做,自2012年以来一直没有更新过。我想知道,如果iTextSharp不是用来将HTML转换为PDF的,哪一个是免费的?如果今天的日期>2015年7月14日,请不要看这个答案@为什么不呢?那么我应该去哪里看呢?这个循序渐进的教程不是“剃须刀”。这是aspx,网络表单。。。这不是最新的。伙计,你太棒了,谢谢。我可以改变页面方向吗?@EdgarSalazar没问题。由于它在下面使用了iTextXmlWorker,我认为您应该能够通过将div设置为横向比例来解决这个问题。@是的,这里的表格示例:此dll不支持区域性特定字符您的答案使用了
HTMLWorker
,这是不推荐的。您应该使用
XMLWorker
。当前上下文中不存在给出错误的XMLWorker
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();
        }
    }
}
"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);
    }
});
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;
    }
}
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");
}