Экспорт в pdf с помощью ASP.NET 5

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

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

5 ответов


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

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

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

2 - вилка (или аналогичные)

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


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

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

1 - ссылки

добавьте их в свой проект.в 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.8.1.

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

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

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


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

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

В Автозагрузку.cs добавить строку services.AddNodeServices() такой

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

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

теперь установите необходимый узел.Яш пакеты:

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

npm init

и следуйте инструкциям по созданию пакета.файл 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, который вызывает этот узел.Яш скрипт

[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, в этом примере я просто выводю его из действия контроллера, чтобы его можно было просмотреть в браузере.

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


варианты

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

там, кажется, некоторые платные альтернативы доступны, если вы не хотите использовать узел.js:

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

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

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


некромантии.

добавление зависимости к NodeJS является субидеальным IMHO, особенно учитывая автономное развертывание .NET Core.

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

кредиты идут к:
https://github.com/groege/PdfSharpCore

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

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

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

MigraDocCore.DocumentObjectModel.MigraDoc.DocumentObjectModel
    .Shapes.ImageSource.ImageSourceImpl = 
          new PdfSharpCore.ImageSharp.ImageSharpImageSource();

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

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

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


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

использование

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

в свой стартап.cs

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

services.AddSingleton<PdfResultExecutor>();

ОБРАТИТЕ ВНИМАНИЕ:

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