2016-09-07 1 views
14

Я хочу экспортировать часть html в pdf-файл, но у меня нет совместимого пакета nuget.Экспорт html в pdf в ASP.NET Core

Когда я пытаюсь установить кого-либо: «X не совместим с netcoreapp1.0 (.NETCoreApp, Version = v1.0)».

Кто-нибудь знает какой-либо способ экспорта в pdf с использованием ядра asp.net?

Большое спасибо!

+0

Возможный дубликат [Экспорт в PDF с помощью ASP.NET 5] (http://stackoverflow.com/questions/36983300/export -to-pdf-using-asp-net-5) –

+2

Чистое ядро ​​отличается от asp.net 5, другая структура, другие библиотеки – Carlos

+0

AspNet Core 1.0 - новое имя. AspNet 5 (формально AspNet vNext) был оригинальным, но поскольку он был совершенно новым продуктом, MS решила полностью изменить его имя на AspNet Core. –

ответ

12

Скопировано из моего первоначального ответа здесь Export to pdf using ASP.NET 5:

Один способ создания PDF из HTML в .NET Ядра (без каких-либо рамок .NET зависимостей) использует Node.js из приложения .NET Core. В следующем примере показано, как реализовать конвертер HTML в PDF в чистый проект ASP.NET Core Web Application (шаблон веб-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 

и следуйте инструкциям, чтобы создать файл

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

package.json Создайте файл 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); 
    }) 
}; 

Посмотрите here для более подробного объяснения на 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(); 
} 

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

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


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

Большинство решений PDF Generator все еще зависят от .NET 4.5/4.6 рамки. Но, похоже, есть некоторые платные альтернативы, если вы не любите использовать Node.ЯШ:

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

Я не пробовал любой из них, хотя ,

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

+1

Любая идея, как использовать существующий вид Razor (или любой другой html-страницы) в качестве входных данных? – jao

+0

Если вы просто ищете wkHtmlToPdf-Wrapper, вы можете использовать мой: https://github.com/ststeiger/wkHtmlToPdfSharp, вам придется немного изменить его для .NET Core. –

+1

@jao Вы должны иметь возможность изменить pdf.js с помощью функции module.exports = function (callback, html) {'и в шаблоне set' content: html', а затем в вашем действии выполните команду var result = wait nodeServices.InvokeAsync ("./pdf", razorRenderedHtmlString); '. Однако вы, вероятно, будете бороться с css, если вы не внесете это заранее. – Sjolund

1

У меня была такая же проблема! Я хотел создать файлы PDF из строк HTML. Затем я столкнулся с PhantomJs, который является утилитой командной строки для преобразования html-файлов в pdf. Я написал кросс-платформенную оболочку над ним в C# для .NET CORE и отлично работает в Linux! Хотя на данный момент это единственное для 64-битного Linux, потому что это единственная платформа .NET Core Support в настоящее время. Проект можно найти here

PhantomJs.NetCore.PdfGenerator gen = new PhantomJs.NetCore.PdfGenerator("/path/to/pantomjsfolder"); 
string outputFilePath = gen.GeneratePdf("<h1>Hello</h1>","/folder/to/write/file/in"); 
2

Вы можете проверить DinkToPdf библиотеку. Это оболочка библиотеки wkhtmltopdf для .NET Core.

Синхронный преобразователь

Этот конвертер в многопоточных приложений и веб-серверов. Задачи преобразования сохраняются для блокировки коллекции и выполняются в одном потоке.

var converter = new SynchronizedConverter(new PdfTools()); 

Определение документа для преобразования

var doc = new HtmlToPdfDocument() 
{ 
    GlobalSettings = { 
     ColorMode = ColorMode.Color, 
     Orientation = Orientation.Landscape, 
     PaperSize = PaperKind.A4Plus, 
    }, 
    Objects = { 
     new ObjectSettings() { 
      PagesCount = true, 
      HtmlContent = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur mauris eget ultrices iaculis. Ut        odio viverra, molestie lectus nec, venenatis turpis.", 
      WebSettings = { DefaultEncoding = "utf-8" }, 
      HeaderSettings = { FontSize = 9, Right = "Page [page] of [toPage]", Line = true, Spacing = 2.812 } 
     } 
    } 
}; 
+0

Это работает очень хорошо с Kestrel, но не на IIS. Любые идеи почему? –

+0

Проблема с IIS заключается в том, как IIS управляет пулами приложений. Чтобы устранить эту проблему, следует использовать Remoting, но они не поддерживаются в .NET Core. Если у кого-нибудь есть решение этой проблемы, прокомментируйте. – user1646245

+0

Посмотрите на [https://github.com/TheSalarKhan/PhantomJs.NetCore], он также работает на IIS, и в отличие от wkhtmltopdf он работает на Linux, Mac и Windows. –

10

Вы можете использовать jsreport .net sdk, если вы находитесь в .net ядра 2.0 и без более сложных узлов служб. Это включает в себя среди других функций фильтры для преобразования существующих видов бритвы в pdf. Из docs:

1. Установите nugets jsreport.Binary, jsreport.Local и jsreport.AspNetCore

2. В вы Startup.cs настроить его в качестве следующего

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc();    
    services.AddJsReport(new LocalReporting() 
     .UseBinary(JsReportBinary.GetBinary()) 
     .AsUtility() 
     .Create()); 
} 

3. Затем вам нужно добавить атрибут MiddlewareFilter к конкретному действию и указать, какое преобразование вы хотите использовать. В этом случае преобразование html в pdf.

[MiddlewareFilter(typeof(JsReportPipeline))] 
public IActionResult Invoice() 
{ 
    HttpContext.JsReportFeature().Recipe(Recipe.PhantomPdf); 
    return View(); 
} 

Вы можете достичь кучи других вариантов заголовков, колонтитулы или макет страницы на JsReportFeature(). Обратите внимание, что вы также можете создавать файлы excel из html. Дополнительную информацию см. В разделе documentation.

PS: Я автор jsreport.