在ASP.NET MVC中将HTML转换为PDF

10

我正在参与一个需要将当前HTML页面转换为PDF并在点击按钮后自动保存到服务器并将其引用保存在数据库中的项目。如果页面数据来自数据库,则可以将视图转换为PDF,但是此表单中的数据是静态的,也就是说,在页面上有许多单选按钮和文本框,我可以在其中写入详细信息并勾选复选框,点击保存按钮后,它将保存在服务器上,并将其引用保存在数据库中。

之所以不将数据保存在数据库中的原因是报告对客户来说不是很有用,但如果我将数据保存在数据库中,则数据库会变得非常庞大且难以处理。因为该报告有大约100个字段。因此,请帮助我解决这个问题。

9个回答

5
你可以使用SelectPdf提供的免费Html转Pdf转换器(http://selectpdf.com/community-edition/)。
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版本的代码:http://selectpdf.com/convert-from-html-to-pdf-in-asp-net-mvc-csharp-and-vb-net/

该链接提供了将HTML转换为PDF的ASP.NET MVC C#和VB.NET代码示例。

2
免费版本只能生成最多5页的文档。 - Lord Darth Vader

4
简而言之:

使用PdfSharp的HTML渲染器进行PDF转换

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

更详细的答案


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

2

2

有一个特殊的NuGet包叫做RazorPDF。它非常简单易用。RazorPDF网站


2

使用ABCpdf DLL,在文本区域中可以编写HTML代码,并在单击按钮时显示相应的PDF。可以轻松下载ABCpdf试用版,添加链接以下载ABCpdf DLL。https://www.websupergoo.com/download.htm

index.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

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

1

我使用iDiTect.Converter将html转换为pdf在asp.net mvc中https://www.iditect.com/tutorial/html-to-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();
}

1

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

代码大致如下:

PdfConverter pdfConverter = new PdfConverter();

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

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


5
$550 开发者许可证 - Rebecca

1

将Canvas转换为PDF是正确的选择

function getPDF(){

    var HTML_Width = $(".canvas_div_pdf").width();
    var HTML_Height = $(".canvas_div_pdf").height();
    var top_left_margin = 15;
    var PDF_Width = HTML_Width+(top_left_margin*2);
    var PDF_Height = (PDF_Width*1.5)+(top_left_margin*2);
    var canvas_image_width = HTML_Width;
    var canvas_image_height = HTML_Height;
    
    var totalPDFPages = Math.ceil(HTML_Height/PDF_Height)-1;
    

    html2canvas($(".canvas_div_pdf")[0],{allowTaint:true}).then(function(canvas) {
        canvas.getContext('2d');
        
        console.log(canvas.height+"  "+canvas.width);
        
        
        var imgData = canvas.toDataURL("image/jpeg", 1.0);
        var pdf = new jsPDF('p', 'pt',  [PDF_Width, PDF_Height]);
        pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin,canvas_image_width,canvas_image_height);
        
        
        for (var i = 1; i <= totalPDFPages; i++) { 
            pdf.addPage(PDF_Width, PDF_Height);
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height);
        }
        
        pdf.save("HTML-Document.pdf");
    });
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接