asp.net-mvc 在 ASP.NET MVC 中将 HTML 转换为 PDF

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21495273/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 03:29:53  来源:igfitidea点击:

Convert HTML to PDF in ASP.NET MVC

asp.net-mvcpdf-conversion

提问by Rameshwar Trivedi

Im working in a project which requires current html page to convert in pdf and that pdf will automatically save on button click on server and its reference will be save in database.I can convert the view if its data comes from data base but the data in this form is static that means on the view it has so many radio button and text box in which i can write the detail and check the check box on after clicking save button it will save on the server and and its reference will save in the data base.

我在一个项目中工作,该项目需要将当前的 html 页面转换为 pdf,该 pdf 将在服务器上的按钮单击时自动保存,其引用将保存在数据库中。如果其数据来自数据库,但数据来自数据库,我可以转换视图此表单是静态的,这意味着在视图上它有很多单选按钮和文本框,我可以在其中写入详细信息并在单击保存按钮后选中复选框,它将保存在服务器上,其引用将保存在数据中根据。

the reason is that im not saving the data in database is that the report is less use full for the client but if i save the data in data base then the database become very huge and its become complicate to handle. because the report has approx 100 fields. so please if any one can help me in it.

原因是我没有将数据保存在数据库中是因为报告对客户端的使用较少,但是如果我将数据保存在数据库中,那么数据库会变得非常庞大并且处理起来变得复杂。因为该报告有大约 100 个字段。所以请如果有人可以帮助我。

采纳答案by Rameshwar Trivedi

I have used Canvas to PDF and that worked great for me. Here is the perfect tutorial for the same: https://www.freakyjolly.com/jspdf-multipage-example-generate-multipage-pdf-using-single-canvas-of-html-document-using-jspdf/

我已经使用 Canvas 转 PDF,这对我来说非常有用。这是相同的完美教程:https: //www.freakyjolly.com/jspdf-multipage-example-generate-multipage-pdf-using-single-canvas-of-html-document-using-jspdf/

Thank you everyone.

谢谢大家。

回答by Tom

You can use the Free Html To Pdf Converter from SelectPdf (http://selectpdf.com/community-edition/).

您可以使用 SelectPdf ( http://selectpdf.com/community-edition/) 中的免费 Html To Pdf 转换器。

Code for MVC looks like this:

MVC 的代码如下所示:

[HttpPost]
public ActionResult Convert(FormCollection collection)
{
    // read parameters from the webpage
    string url = collection["TxtUrl"];

    string pdf_page_size = collection["DdlPageSize"];
    PdfPageSize pageSize = (PdfPageSize)Enum.Parse(typeof(PdfPageSize), pdf_page_size, true);

    string pdf_orientation = collection["DdlPageOrientation"];
    PdfPageOrientation pdfOrientation = (PdfPageOrientation)Enum.Parse(
        typeof(PdfPageOrientation), pdf_orientation, true);

    int webPageWidth = 1024;
    try
    {
        webPageWidth = System.Convert.ToInt32(collection["TxtWidth"]);
    }
    catch { }

    int webPageHeight = 0;
    try
    {
        webPageHeight = System.Convert.ToInt32(collection["TxtHeight"]);
    }
    catch { }

    // instantiate a html to pdf converter object
    HtmlToPdf converter = new HtmlToPdf();

    // set converter options
    converter.Options.PdfPageSize = pageSize;
    converter.Options.PdfPageOrientation = pdfOrientation;
    converter.Options.WebPageWidth = webPageWidth;
    converter.Options.WebPageHeight = webPageHeight;

    // create a new pdf document converting an url
    PdfDocument doc = converter.ConvertUrl(url);

    // save pdf document
    byte[] pdf = doc.Save();

    // close pdf document
    doc.Close();

    // return resulted pdf document
    FileResult fileResult = new FileContentResult(pdf, "application/pdf");
    fileResult.FileDownloadName = "Document.pdf";
    return fileResult;
}

VB.NET MVC version of the code can be found here: http://selectpdf.com/convert-from-html-to-pdf-in-asp-net-mvc-csharp-and-vb-net/

VB.NET MVC 版本的代码可以在这里找到:http: //selectpdf.com/convert-from-html-to-pdf-in-asp-net-mvc-csharp-and-vb-net/

回答by Anestis Kivranoglou

In short:

简而言之:

HTML Renderer for PDF using PdfSharp

使用 PdfSharp 的 PDF 的 HTML 渲染器

    public static Byte[] PdfSharpConvert(String html)
    {
        Byte[] res = null;
        using (MemoryStream ms = new MemoryStream())
        {
            var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
            pdf.Save(ms);
            res = ms.ToArray();
        }
        return res;
    }

More Detailed Answer

更详细的答案

回答by EvoPdf

The C# code below can be used in a MVC application to convert the current view to PDF and produce a PDF in a buffer that can be saved on server or sent to browser for download. The code is using evopdf library for .netto perform the HTML to PDF conversion:

下面的 C# 代码可用于 MVC 应用程序将当前视图转换为 PDF 并在缓冲区中生成 PDF,该缓冲区可以保存在服务器上或发送到浏览器以供下载。代码使用.net 的 evopdf 库来执行 HTML 到 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;
}

回答by Kirill Bestemyanov

There is special nuget package RazorPDF. It simple works. RazorPDF site

有特殊的 nuget 包 RazorPDF。它简单的工作。RazorPDF 网站

回答by Athul Suresh

use ABCpdfdll, here in text area we can write html code and on a button click corresponding pdf will be shown.ABCpdftrail version is easily available for downloding, adding linlk to download the ABCpdfdll https://www.websupergoo.com/download.htm

使用ABCpdfdll,在这里我们可以在文本区域编写html代码,然后单击按钮会显示相应的pdf。ABCpdf跟踪版本很容易下载,添加linlk下载ABCpdfdll https://www.websupergoo.com/download.htm

index.cshtml

索引.cshtml

      @using (Html.BeginForm("covertopdf", "simple", FormMethod.Post))
{
        <p style="margin-top:50px">
            Input Html: @Html.TextArea("Htmlcontent", new { @class = "form-control",@cols="160" , @rows="20"})<br />
            <input type="submit" class="btn-primary" value="Convertopdf" />
        </p>
}

SimpleController.cs

简单控制器.cs

 public class SimpleController : Controller
    {
        public class FileViewModel
        {
            public byte[] Content { get; set; }
            public string Extension { get; set; }
            public string FileName { get; set; }
        }

       [HttpPost]
       [ValidateInput(false)]
       public FileStreamResult covertopdf(string Htmlcontent)
        //public FileStreamResult covertopdf(file fo)
        {
            var result = ExecuteAction(() =>
            {
                var fileViewmodel = new FileViewModel
                {
                    Content = ConvertHtmlToPdf(Htmlcontent),
                    //Content= ConvertHtmlToPdf(fo.cont),
                    Extension = "application/pdf",
                    FileName = "Policy Information.pdf"
                };
                return fileViewmodel;
            }, "covertopdf");
            // return result;
            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
            // Content is the file 
            Stream stream = new MemoryStream(result.Content);
            return new FileStreamResult(stream, "application/pdf")
            {

            };
        }



        public T ExecuteAction<T>(Func<T> action, string method)
        {
            try
            {
                return action.Invoke();
            }
            catch (Exception ex)
            {
                return default(T);
            }
        }



        protected byte[] ConvertHtmlToPdf(string html, string header = null, string footer = null, bool isPageNumberInFooter = false)
        {
            // Create ABCpdf Doc object
            var doc = new Doc();
            if (header == null && footer == null)
                doc.Rect.Inset(20, 20);
            else
                doc.Rect.String = "0 70 600 760"; /*padding from left, padding from bottom, width from left, height from bottom*/
            // Add html to Doc   
            //html = "<html><head></head><body></body></html>";
            int theId = doc.AddImageHtml(html);

            // Loop through document to create multi-page PDF
            while (true)
            {
                if (!doc.Chainable(theId))
                    break;
                doc.Page = doc.AddPage();
                theId = doc.AddImageToChain(theId);
            }
            var count = doc.PageCount;

            /*****************Footer area******************/
            if (footer != null)
            {
                var newfooter = "";
                doc.Rect.String = "40 20 580 50";
                for (int i = 1; i <= count; i++)
                {

                    doc.PageNumber = i;
                    if (isPageNumberInFooter)
                    {
                        newfooter = footer.Replace("PageNumber", "Page " + i.ToString() + " of " + count.ToString());
                        int id = doc.AddImageHtml(newfooter);

                        while (true)
                        {
                            if (!doc.Chainable(id))
                                break;
                            id = doc.AddImageToChain(id);
                        }
                    }
                    else
                        doc.AddText(footer);
                }
            }
            /*****************Footer area******************/


            // Flatten the PDF
            for (int i = 1; i <= doc.PageCount; i++)
            {
                doc.PageNumber = i;
                doc.Flatten();
            }

            var pdf = doc.GetData();
            doc.Clear();
            // Get PDF as byte array. Couls also use .Save() to save to disk
            return pdf;
        }
    }

回答by jnkna wen

I used iDiTect.Converter to convert html to pdf in asp.net mvc https://www.iditect.com/tutorial/html-to-pdf/, however it's not free code in short

我使用 iDiTect.Converter 在 asp.net mvc https://www.iditect.com/tutorial/html-to-pdf/中将 html 转换为 pdf ,但它不是简单的免费代码

public static Byte[] ConvertToBytes()
{
HtmlToPdfConverter converter = new HtmlToPdfConverter();

converter.DefaultStyleSheet = ".para{font-size: 24px; color: #FF0000;}";

string htmlContent = "<p class=\"para\">Content with special style.</p><p>Content without style</p>";
converter.Load(htmlContent);

return converter.SaveAsBytes();
}

回答by prog_sr08

There are a number of html to pdf converters for .NET available out there. I can recommend ExpertPdf (www.html-to-pdf.net).

有许多适用于 .NET 的 html 到 pdf 转换器可用。我可以推荐 ExpertPdf ( www.html-to-pdf.net)。

Code looks something like this:

代码如下所示:

PdfConverter pdfConverter = new PdfConverter();

pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
byte[] downloadBytes = pdfConverter.GetPdfFromUrlBytes(url);

There is an online demo here: http://www.html-to-pdf.net/free-online-pdf-converter.aspx

这里有一个在线演示:http: //www.html-to-pdf.net/free-online-pdf-converter.aspx