Как визуализировать область страницы бритвы ASP .Net Core (для pdf) - PullRequest
0 голосов
/ 08 марта 2019

Я пишу ASP.Net Core Web App со страницами Razor, и мне нужно отобразить часть страницы в PDF. Я уверен, что создание PDF-файла должно быть простым с использованием одной из доступных PDF-библиотек, таких как jsreport. Я нашел несколько примеров для рендеринга страницы в строку, и это здорово, за исключением того, что мне нужна только область отчета.

То, с чем я борюсь, это то, как отрисовать только часть моей страницы для PDF. Это изображение показывает в основном, как структурирована моя страница. Заголовок, навигация и нижний колонтитул взяты из _Layout для моего приложения. Частичный диапазон является общим для всех страниц отчета, а содержимое отчета является фактической страницей.

enter image description here

Есть ли способ отобразить только часть страницы?

Если область содержимого также была частичной, можно ли ее визуализировать отдельно?

У меня почти нет опыта разработки пользовательского интерфейса, поэтому, пожалуйста, извините за мою наивность:)

1 Ответ

0 голосов
/ 08 марта 2019

Вот мое решение для рендеринга области отчета моей страницы. Ответ прост: опубликуйте html-контент раздела страницы, который я хочу отрендерить, на сервер, отредактируйте его в PDF и верните в виде файла для загрузки.

Для этого мне сначала нужно было получить html-контент для раздела страницы, содержащей отчет. Я сделал это, установив идентификатор div для моих отчетов в «report-content», а затем использовал некоторый скрипт для захвата этого html.

$(function () {
    $("#btnSubmit").click(function () {
        $("input[name='ReportContent']").val($("#report-content").html());
    });
});

Форма для отправки запроса имеет скрытый элемент «ReportContent», в котором хранится html.

@using (Html.BeginForm("Export", "Home", FormMethod.Post))
{
    <input type="hidden" name="ReportContent" />
    <input type="submit" id="btnSubmit" value="Download PDF" />
}

На стороне сервера я создал метод, использующий API JsReport для рендеринга PDF из html.

protected async Task<IActionResult> RenderPDFAsync(string content)
{
    var rs = new LocalReporting().UseBinary(JsReportBinary.GetBinary()).AsUtility().Create();

    var report = await rs.RenderAsync(new RenderRequest()
    {
        Template = new Template()
        {
            Recipe = Recipe.ChromePdf,
            Engine = Engine.None,
            Content = content
        }
    });

    return new FileStreamResult(report.Content, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("application/pdf"));
}

Наконец, я добавил обработчик для поста, который отображает PDF и возвращает результат файла на каждую страницу отчета.

public async Task<IActionResult> OnPostAsync()
{
    return await RenderPDFAsync(Request.Form["ReportContent"].ToString());
}

Мой код имеет немного больше проверок, чем показано здесь, и у меня есть общий производный базовый класс PageModel для всех страниц моего отчета, поэтому единственное, что требуется для новых отчетов, - это добавление пост-хандера и установка идентификатора в разделе так, чтобы включены в PDF. Я также намерен переместить рендеринг в службу, чтобы он мог использоваться совместно, а не пересоздаваться при каждом создании отчета.

...