微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 ASP.net core 3.1 Razor Pages 中打印 PDF

如何解决在 ASP.net core 3.1 Razor Pages 中打印 PDF

为了学习 ASP.net 核心,我使用 ASP.NET 核心 3.1 创建了一个简单的 CRUD 应用程序。我想将我的详细信息页面打印为发票。我环顾四周,似乎在完整的 .Net Framework 中打印 PDF 更可用。

谁能指出我正确的方向?我遇到过像 SelectPDF、WKHTMLTOPDF、PDFSharp 这样的免费库,但坦率地说,这些样本是 pre-asp.net 核心,不能安静地将它与 asp.net 核心 Razor Pages 集成。实际上,如果我没记错的话,上面提到的一些库与 Razor Pages Core 不兼容。

解决方法

免责声明:我为 SelectPdf 工作。

SelectPdf 确实支持 ASP.NET Core + Razor Page。可从 SelectPdf 网站下载示例。

此处的示例代码:

@page
@model SelectPdf.Samples.Pages.ConvertUrlToPdfModel
@{
    Layout = "~/Pages/_Layout.cshtml";
    ViewData["Title"] = "SelectPdf Free Html To Pdf Converter for .NET Core - Convert from Url to Pdf - C# / ASP.NET Core MVC6";
    ViewData["Description"] = "SelectPdf Convert from Url to Pdf Sample for C# ASP.NET MVC. Pdf Library for .NET with full sample code in C# and VB.NET.";
    ViewData["Keywords"] = "convert from url to pdf,pdf library,sample code,html to pdf,pdf converter";
}

<form method="post">
    <article class="post type-post status-publish format-standard hentry">
        <header class="entry-header">
            <h1 class="entry-title">SelectPdf Free Html To Pdf Converter for .NET Core - Convert from Html to Pdf - C# / ASP.NET Core MVC6 Sample</h1>
        </header>
        <!-- .entry-header -->

        <div class="entry-content">
            <p>
                This sample shows how to use SelectPdf html to pdf converter to convert an url to pdf,also setting a few properties.
            </p>
            <p>
                Url:<br />
                <input type="text" style="width: 90%;" value="https://selectpdf.com" asp-for="TxtUrl" />
            </p>
            <div class="col2">
                Pdf Page Size:<br />
                <select asp-for="DdlPageSize" asp-items="Model.PageSizes"></select>
                <br />
                <br />
                Pdf Page Orientation:<br />
                <select asp-for="DdlPageOrientation" asp-items="Model.PageOrientations"></select><br />
                <br />
            </div>
            <div class="col2">
                Web Page Width:<br />
                <input type="text" style="width: 50px;" value="1024" asp-for="TxtWidth" /> px<br />
                <br />
                Web Page Height:<br />
                <input type="text" style="width: 50px;" value="" asp-for="TxtHeight" /> px<br />
                (leave empty to auto detect)<br />
                <br />

            </div>
            <div class="col-clear"></div>
            <p>
                <input type="submit" name="BtnConvert" value="Create PDF" class="mybutton" />
            </p>
        </div>
        <!-- .entry-content -->
    </article>
</form>

// C# code below

using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;

namespace SelectPdf.Samples.Pages
{
    public class ConvertUrlToPdfModel : PageModel
    {
        public void OnGet()
        {
            DdlPageSize = "A4";
        }

        [BindProperty]
        public string TxtUrl { get; set; }

        [BindProperty]
        public string DdlPageSize { get; set; }

        public List<SelectListItem> PageSizes { get; } = new List<SelectListItem>
        {
            new SelectListItem { Value = "A1",Text = "A1" },new SelectListItem { Value = "A2",Text = "A2" },new SelectListItem { Value = "A3",Text = "A3" },new SelectListItem { Value = "A4",Text = "A4" },new SelectListItem { Value = "A5",Text = "A5" },new SelectListItem { Value = "Letter",Text = "Letter" },new SelectListItem { Value = "HalfLetter",Text = "HalfLetter" },new SelectListItem { Value = "Ledger",Text = "Ledger" },new SelectListItem { Value = "Legal",Text = "Legal" },};

        [BindProperty]
        public string DdlPageOrientation { get; set; }

        public List<SelectListItem> PageOrientations { get; } = new List<SelectListItem>
        {
            new SelectListItem { Value = "Portrait",Text = "Portrait" },new SelectListItem { Value = "Landscape",Text = "Landscape" },};

        [BindProperty]
        public string TxtWidth { get; set; }

        [BindProperty]
        public string TxtHeight { get; set; }

        public IActionResult OnPost()
        {
            // read parameters from the webpage
            PdfPageSize pageSize =
                (PdfPageSize)Enum.Parse(typeof(PdfPageSize),DdlPageSize,true);

            PdfPageOrientation pdfOrientation =
                (PdfPageOrientation)Enum.Parse(typeof(PdfPageOrientation),DdlPageOrientation,true);

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

            int webPageHeight = 0;
            try
            {
                webPageHeight = System.Convert.ToInt32(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(TxtUrl);

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

        }
    }
}
,

我遇到了像 SelectPDF、WKHTMLTOPDF、PDFSharp 这样的免费库,但坦率地说,这些示例是 pre-asp.net 核心,无法安静地将它与 asp.net 核心 Razor Pages 集成。

我建议你可以使用客户端库。因为你提到的都是服务端库,它们都需要找到视图并转换为字符串。据我所知,似乎没有这种直接转换剃刀的方法pages 到 string。所以我建议你可以使用 jsPDF 库。

这是一个完整的工作演示:

@page
@model DetailsModel
<div id="details">       //be sure add this id...

    <h1>Details</h1>

    <div>
        <h4>test</h4>
        <hr />
        <dl class="row">
            <dt class="col-sm-2">
                @Html.DisplayNameFor(model => model.test.Name)
            </dt>
            <dd class="col-sm-10">
                @Html.DisplayFor(model => model.test.Name)
            </dd>
        </dl>
    </div>
    <div>
        <a asp-page="./Edit" asp-route-id="@Model.test.Id">Edit</a> |
        <a asp-page="./Index">Back to List</a>
    </div>
</div>

<button onclick="javascript:demoFromHTML();">Generate PDF</button>

@section Scripts
{
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
    <script>
        function demoFromHTML() {
            var pdf = new jsPDF('p','pt','letter');
            // source can be HTML-formatted string,or a reference
            // to an actual DOM element from which the text will be scraped.
            source = $('#details')[0];

            // we support special element handlers. Register them with jQuery-style
            // ID selector for either ID or node name. ("#iAmID","div","span" etc.)
            // There is no support for any other type of selectors
            // (class,of compound) at this time.
            specialElementHandlers = {
                // element with id of "bypass" - jQuery style selector
                '#bypassme': function (element,renderer) {
                    // true = "handled elsewhere,bypass text extraction"
                    return true
                }
            };
            margins = {
                top: 80,bottom: 60,left: 40,width: 522
            };
            // all coords and widths are in jsPDF instance's declared units
            // 'inches' in this case
            pdf.fromHTML(
                source,// HTML string or DOM elem ref.
                margins.left,// x coord
                margins.top,{ // y coord
                'width': margins.width,// max width of content on PDF
                'elementHandlers': specialElementHandlers
            },function (dispose) {
                    // dispose: object with X,Y of the last line add to the PDF
                    //          this allow the insertion of new lines after html
                    pdf.save('Test.pdf');
                },margins);
        }
    </script>
}
,

您也可以查看 Syncfusion,他们有一个很棒的图书馆。

https://www.syncfusion.com/pdf-framework/net-core/pdf-library

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。