Экспорт в pdf с использованием ASP.NET 5

Я работаю над приложением MVC 6 (DNX Core 5.0 framework). К сожалению, я не нахожу библиотеку для экспорта в PDF.

Любая помощь будет оценена.

5 ответов

Решение

Если вы должны полагаться на Core, у вас будет два варианта:

1 - Подождите немного

Ядро все еще RC1, медленно переходящее на RC2, и вы не скоро найдете много libs. Поскольку.NET Core уделяет много внимания, первые библиотеки должны появиться через несколько месяцев, но я думаю, вам придется подождать хотя бы релиз RC2.

2 - Вилка (или аналогичная)

Вы можете получить проект с открытым исходным кодом, который наилучшим образом соответствует вашим потребностям, разветвиться (если на GitHub) или просто загрузить и начать обновление до.NET Core. Я только что сделал это с DapperExtensions и это работает как шарм. Вы даже можете добавить немного пряного только для вас;)


С другой стороны, если вам просто нужно что-то, что работает, но без прямой необходимости встраивания в.NET Core, мне удалось заставить JsReport работать нормально. Он запустит свой собственный сервер (встроенный сервер) на основе Node но интеграция действительно проста (с собственной системой Dependecy Injection AspNet Core!) и PDF создаются без каких-либо проблем.

Если вас это интересует, вот несколько инструкций:

1 - Ссылки

Добавьте их в свой project.json:

"jsreport.Embedded": "0.8.1",
"jsreport.Client": "0.8.1"

2 - интеграция с AspNet

После этого следуйте инструкциям из jsReport здесь. Вы можете настроить систему AspNet DI как здесь:

public void ConfigureServices(IServiceCollection services)
{
   // ...
   var _server = new EmbeddedReportingServer();
   _server.StartAsync().Wait();
   services.AddInstance<IEmbeddedReportingServer>(_server);
   services.AddSingleton<IReportingService>((s) => { return s.GetRequiredService<IEmbeddedReportingServer>().ReportingService; });
   // ...
}

Для использования вам просто нужно либо получить IReportingService или вручную захватить его из Resolver на вашем контроллере, например.

3 - Использование

public IActionResult SomeReport()
{
   // This is <my> type of usage. It's a bit manual because I'm currently loading reports from DB. You can use it in a diferent way (check jsReport docs).
   var service = Resolver.GetRequiredService<jsreport.Client.IReportingService>();

   var phantomOptions = new jsreport.Client.Entities.Phantom()
   {
      format = "A4",
      orientation = "portrait",
      margin = "0cm"
   };
   phantomOptions.footer = "<h2>Some footer</h2>";
   phantomOptions.footerHeight = "50px";
   phantomOptions.header = "<h2>Some header</h2>";
   phantomOptions.headerHeight = "50px";
   var request = new jsreport.Client.RenderRequest()
   {
      template = new jsreport.Client.Entities.Template()
      {
         content = "<div>Some content for your report</div>",
         recipe = "phantom-pdf",
         name = "Your report name",
         phantom = phantomOptions
      }
   };

   var _report = service.RenderAsync(request).Result;

   // Request file download.
   return File(_report.Content, "application/pdf", "Some fancy name.pdf");
}

4 - Важно: ваш сервер не запускается (отсутствует файл zip)

Из-за изменений в NuGet в проектах AspNet вам придется вручную перемещать некоторые файлы содержимого, которые не перемещаются автоматически.

Сначала найдите ваш dnx-кеш для встроенного сервера. Должно быть что-то вроде:
C:\Users\<name>\.dnx\packages\jsreport.Embedded\0.8.1,

Вы заметите папку с именем content там. Просто скопируйте его содержимое (два файла: node.exe а также jsreport-net-embedded.zip) в lib\net45,

Итак, чтобы быть простым и надежным: скопируйте содержимое (только файлы) из
C:\Users\<name>\.dnx\packages\jsreport.Embedded\0.8.1\contents
в
C:\Users\<name>\.dnx\packages\jsreport.Embedded\0.8.1\lib\net45,

Это должно решить проблемы запуска. Помните: первый запуск извлечет файлы и должен занять несколько минут. После этого все будет намного быстрее.

Наконец-то я понял, что для создания PDF-файлов из.NET Core (без каких-либо зависимостей фреймворка.NET) используется Node.js из моего приложения.NET Core. В следующем примере показано, как реализовать преобразователь HTML в PDF в чистом проекте ASP.NET Core Web Application (шаблон Web API).

Установите пакет NuGet Microsoft.AspNetCore.NodeServices

В Startup.cs добавьте строку services.AddNodeServices() как это

public void ConfigureServices(IServiceCollection services)
{
    // ... all your existing configuration is here ...

    // Enable Node Services
    services.AddNodeServices();
}

Теперь установите необходимые пакеты Node.js:

Из командной строки перейдите в корневой каталог проекта.NET Core и запустите эти команды.

npm init

и следуйте инструкциям для создания файла package.json

npm install jsreport-core --save
npm install jsreport-jsrender --save
npm install jsreport-phantom-pdf --save

Создать файл pdf.js в корне проекта, содержащего

module.exports = function (callback) {
    var jsreport = require('jsreport-core')();

    jsreport.init().then(function () {
        return jsreport.render({
            template: {
                content: '<h1>Hello {{:foo}}</h1>',
                engine: 'jsrender',
                recipe: 'phantom-pdf'
            },
            data: {
                foo: "world"
            }
        }).then(function (resp) {
            callback(/* error */ null, resp.content.toJSON().data);
        });
    }).catch(function (e) {
        callback(/* error */ e, null);
    })
};

Посмотрите здесь для получения дополнительной информации о jsreport-core,

Теперь создайте действие в контроллере Mvc, который вызывает этот скрипт Node.js

[HttpGet]
public async Task<IActionResult> MyAction([FromServices] INodeServices nodeServices)
{
    var result = await nodeServices.InvokeAsync<byte[]>("./pdf");

    HttpContext.Response.ContentType = "application/pdf";

    string filename = @"report.pdf";
    HttpContext.Response.Headers.Add("x-filename", filename);
    HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "x-filename");
    HttpContext.Response.Body.Write(result, 0, result.Length);
    return new ContentResult();
}

Конечно, вы можете делать все, что вы хотите с byte[] возвращается из nodeServices, в этом примере я просто выводю его из действия контроллера, чтобы его можно было просмотреть в браузере.

Вы также можете обмениваться данными между Node.js и.NET Core с помощью строки в кодировке base64, используя resp.content.toString('base64') в pdf.js и использовать var result = await nodeServices.InvokeAsync<byte[]>("./pdf"); в действии, а затем декодировать закодированную строку base64.


альтернативы

Большинство решений генератора PDF по-прежнему зависят от платформы.NET 4.5 / 4.6. Ни один из двух приведенных выше ответов (JsReport и RazorPDFCore) пока не работает для.NET Core.

Кажется, есть некоторые платные альтернативы, если вы не любите использовать Node.js:

  • NReco.PdfGenerator.LT
  • EVO Конвертер HTML в PDF Клиент для.NET Core
  • Winnovative Конвертер HTML в PDF Клиент для.NET Core

Я не пробовал ничего из этого, хотя.

Я надеюсь, что вскоре мы увидим прогресс в этой области с открытым исходным кодом.

Я знаю, что этот вопрос был задан некоторое время назад, и я знаю, что уже было предоставлено несколько ответов, которые вполне могут быть подходящими для определенных проектов. Но недавно я создал репозиторий GitHub, который позволяет создавать PDF-файлы непосредственно из вашего кода C# без каких-либо требований для nodejs, javascript или razor. На данный момент набор функций немного ограничен, но он генерирует PDF-файлы с изображениями (только на этом этапе.jpg), фигурами и форматированным текстом. Библиотека работает с.net core 2.0 и не зависит ни от какого другого инструмента для создания PDF.

Обратите внимание, что это мой собственный репозиторий: https://github.com/GZidar/CorePDF

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

Я исправил https://github.com/RazorAnt/RazorPDF, который работал только для более старых версий MVC для работы с ASP.NET Core. Его RazorPDFCore, доступный на nuget и github:

Пример использования

class YourBaseController : RazorPDF.Controller {
    // [...]
    public IActionResult Pdf() {
        var model = /* any model you wish */
        return ViewPdf(model);
    }
}

В вашем Startup.cs

добавьте следующую строку перед services.AddMVc();

services.AddSingleton<PdfResultExecutor>();

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ:

Вам нужно вписать RazorPDF.Controller от вашего базового контроллера перед использованием ViewPdf() метод

Necromancing.

Добавление зависимости к NodeJS является побочным ИМХО, особенно с учетом автономного развертывания.NET Core.

По состоянию на 2017 год вы можете использовать мой порт PdfSharpCore для.NET Core 1.1
Разрешает шрифты, и он может использовать изображения. Поставляется с хорошим примером приложения. Однако вам придется заменить часть БД.

Кредиты идут на:
https://github.com/groege/PdfSharpCore

который немного устарел и не содержит пример того, как использовать его с изображениями.

Обратите внимание, что вам необходимо зарегистрировать распознаватель шрифтов и imageSource-реализации перед использованием соответствующих функций:

PdfSharpCore.Fonts.GlobalFontSettings.FontResolver = new FontResolver();

MigraDocCore.DocumentObjectModel.MigraDoc.DocumentObjectModel
    .Shapes.ImageSource.ImageSourceImpl = 
          new PdfSharpCore.ImageSharp.ImageSharpImageSource();
Другие вопросы по тегам