-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ReportOutput
- 戻る(.NET開発)
.NET Core 対応モジュールを探す序(ついで)にまとめてみた。
補足(読む際の前提): 本ページは 2018 年頃の調査であり、
「[.NET Core](MS_DotNetCore)対応か否か」という当時の関心軸で
書かれている。現在は前提が変わっている。
【当時(2018 年頃)】 .NET Framework が本流。.NET Core 対応が「特別な」条件 → 「.NET Core で動くか」が選定の第一関門 【現在】 .NET(Core 系)が本流。.NET Framework は保守対象 → 「.NET Core 対応か」はほぼ全製品が Yes → 選定軸は【ライセンス】【描画方式】【運用形態】へ移ったしたがって、以下の各項目の「.NET Core 非対応(2018/8 現在)」は
現在は解消しているものが多い。
各項目に現況を追記する。
-
古い OSS は .NET 対応されていないものが多いが、
新しい OSS は、.NET Core 対応されているものが多い。
-
注意:AGPL
-
.NET Core 対応
-
NuGet Gallery | iTextSharp
https://www.nuget.org/packages/iTextSharp/.NET Core 非対応(2018/8 現在)
-
-
参考
- iTextSharpでPDF出力
https://qiita.com/mistolteen/items/c94ad35a9740748440fc - iTextSharpでPDFを作成
http://to-annot-pdf.blogspot.com
- iTextSharpでPDF出力
補足(現況:iText 7 / 8 へ):
iTextSharpは 5.x 系で開発終了し、
後継のitext7/itext8に移行している。
iTextSharp (5.x) iText 7 / 8 パッケージ iTextSharpitext(旧itext7).NET 対応 .NET Framework のみ .NET Standard 2.0 / .NET 6+ 状態 開発終了 現役 ライセンスは依然 AGPL である(原文の警告は今も有効)。
【AGPL の意味】 ・ソースを公開すれば無償で使える ・"Affero" なので、【ネットワーク越しに提供する場合も】 利用者にソースを開示する義務が生じる → Web アプリで使うと、アプリ全体の公開義務が及び得る ・回避したければ【商用ライセンスを購入する】業務システムで安易に採用してはならない類のライブラリである。
原文が赤字で警告しているのは正しい。
CommonMark.NET + HtmlRenderer.PdfSharp
-
.NET Core 対応
-
NuGet Gallery | HtmlRenderer.PdfSharp
https://www.nuget.org/packages/HtmlRenderer.PdfSharp.NET Core 非対応(2018/8 現在)
-
-
参考
- Knagis/CommonMark.NET:
https://github.com/Knagis/CommonMark.NET - C#で日本語をPDFに出力する(PDFSharpを利用) | ガンマソフト株式会社
https://gammasoft.jp/blog/pdf-japanese-font-by-csharp/
- Knagis/CommonMark.NET:
補足(現況:PDFsharp 6 系):
PDFsharp本体は .NET 6+ に対応した
(6.x 系、MIT ライセンス)。ただし
HtmlRenderer.PdfSharpはSystem.Drawingに依存しており、
ここが問題になる。【System.Drawing.Common の制約(.NET 6 以降)】 ・.NET 6 … Windows 以外では既定で無効(設定で回避可) ・.NET 7+ … 【Windows 専用】。Linux では PlatformNotSupportedExceptionLinux コンテナで動かす前提なら、この系統は避けるのが無難である。
代替はSkiaSharp/ImageSharpベースのもの。なお
CommonMark.NETも開発停止しており、
Markdown 変換はMarkdigが現在の定番である。
-
.NET Core 対応
-
NuGet Gallery | DinkToPdf
https://www.nuget.org/packages/DinkToPdf/.NET Core 対応(netstandard1.6 から提供されている)
-
-
参考
- How to Easily Create a PDF Document in ASP.NET Core Web API
https://code-maze.com/create-pdf-dotnetcore/
- How to Easily Create a PDF Document in ASP.NET Core Web API
補足(現況:
wkhtmltopdf系は退潮):DinkToPdfは
wkhtmltopdf(ネイティブ DLL)のラッパーである。【構造】 C# コード └─ P/Invoke → libwkhtmltox.dll / .so(ネイティブ) └─ 内部は【古い WebKit】で HTML を描画問題点:
問題 内容 wkhtmltopdf本体がアーカイブ済み2023 年に開発終了が宣言された 描画エンジンが古い Flexbox / Grid / 最近の CSS が正しく出ない ネイティブ依存 OS ごとに DLL を配置する必要。コンテナで詰まりやすい スレッド安全でない 同時実行で落ちる報告が多い(要ロック) 新規採用は推奨しない。
HTML → PDF が要るなら、後述の Playwright / Puppeteer(Chromium)か、
QuestPDF(HTML を経由しない)を検討する。
-
.NET Core 対応
-
NuGet Gallery | Rotativa.AspNetCore
https://www.nuget.org/packages/Rotativa.AspNetCore/.NET Core 対応(netstandard2.0 から提供されている)
-
-
参考
- Creating PDF on ASP.NET Core | Gunnar Peipman - Programming Blog
https://gunnarpeipman.com/aspnet/aspnet-core-pdf/ - Creating PDF In ASP.NET Core MVC Using Rotativa.AspNetCore
https://www.c-sharpcorner.com/article/creating-pdf-in-asp-net-core-mvc-using-rotativa-aspnetcore/
- Creating PDF on ASP.NET Core | Gunnar Peipman - Programming Blog
補足(現況):
Rotativaもwkhtmltopdfのラッパーであり、
DinkToPdfと同じ制約を負う。特徴は ASP.NET Core MVC の View をそのまま PDF 化
できる点で、「画面をそのまま印刷したい」要件には嵌まる。public IActionResult PrintInvoice(int id) => new ViewAsPdf("Invoice", GetModel(id)) { FileName = "invoice.pdf" };ただしエンジンが古い問題は同じである。
補足(現在の OSS の選択肢): 2018 年当時にはなかった、
あるいは当時は未成熟だった選択肢を挙げる。現在はこちらが主流である。
ライブラリ 方式 ライセンス 備考 QuestPDF C# の Fluent API で直接記述 MIT(小規模)/ 有償 最有力。速く、Linux で完動 PuppeteerSharp Chromium で HTML → PDF MIT 最新の CSS が使える。要ブラウザ Playwright for .NET 同上(Microsoft 製) MIT CI との相性が良い PDFsharp / MigraDoc 低レベル API / 文書モデル MIT 6.x で .NET 6+ 対応 ClosedXML Excel(.xlsx)出力 MIT 帳票を Excel で出すなら定番 NPOI Excel / Word 出力 Apache 2.0 POI の .NET 移植 Syncfusion / Aspose 商用の総合ライブラリ 有償 機能は最も広い QuestPDF の例:
Document.Create(container => { container.Page(page => { page.Size(PageSizes.A4); page.DefaultTextStyle(x => x.FontFamily("Yu Gothic")); // 日本語フォント page.Header().Text("請求書").FontSize(20).Bold(); page.Content().Table(table => { /* 明細 */ }); page.Footer().AlignCenter().Text(x => x.CurrentPageNumber()); }); }).GeneratePdf("invoice.pdf");QuestPDF のライセンスに注意する。
**年商が一定額未満の組織は無償(MIT)**だが、
それを超えると有償という Community License 方式である
(2024 年に変更された)。導入前に条件を確認すること。日本語フォントの埋め込みは、どの方式でも共通の課題である。
・Linux コンテナには日本語フォントが入っていない → Dockerfile で fonts-noto-cjk 等を入れる ・フォントを PDF に埋め込まないと、環境によって文字化けする → 埋め込み設定を必ず有効にする ・フォントのライセンスを確認する(再配布可否)
製品系は、(今の所、)基本的に、.NET Core 対応なし。
移行メモ(現況:ほぼ全て対応済み): この総括は
2018 年時点では正しかったが、現在は逆転している。
主要な国産帳票製品は .NET 対応を済ませている(各項目に後述)。
補足(現況:.NET へは移行していない): ReportViewer は
.NET Framework専用のままで、.NET(Core 系)版は提供されていない。
ここは原文の記述が今も当てはまる数少ない例である。【現在の選択肢】 ① SSRS / Power BI Report Server 側でレンダリングし、 アプリは REST API で PDF/Excel を取得する → 【ASP.NET と SSRS の連携と認証】が参考になる ② Web ページに埋め込む(iframe / URL アクセス) ③ サードパーティのビューアに置き換える② の URL アクセス方式は、認証の引き回しが課題になる
(ASP.NETとSSRSの連携と認証)。
https://www.grapecity.co.jp/developer/activereports
-
.NET Core 対応
- ActiveReportsの「ASP.NET Core 非対応」を回避する方法 - GrapeCity.devlog
https://devlog.grapecity.co.jp/entry/2018/07/27/activereports-dotnet-core
- ActiveReportsの「ASP.NET Core 非対応」を回避する方法 - GrapeCity.devlog
補足(現況:正式対応済み): ActiveReports for .NET は
.NET 6 / 8 に正式対応しており、
ActiveReportsJS(JavaScript 版)も提供されている。
原文が参照する「回避方法」の記事は、過渡期のものである。
https://www.hos.co.jp/package/crdotnet2/
補足(現況): CoReports も .NET(Core 系)対応版が提供されている。
https://opentype.jp/rprtnet.htm
https://www.wingarc.com/product/svf/
補足(現況): SVF Cloud をはじめ、
クラウド/ .NET 対応の系統が提供されている。
SVF は帳票サーバとして独立しているため、
アプリ側のランタイムに依存しにくい構造である。
-
.NET Core 対応
- .NET ではなくて、Node.js(サーバ側)。
-
Node Servicesを使用して、
ASP.NET Core との連携が可能である模様。
-
参考
- pdf generation - Export html to pdf in ASP.NET Core - Stack Overflow
https://stackoverflow.com/questions/39364687/export-html-to-pdf-in-asp-net-core
- pdf generation - Export html to pdf in ASP.NET Core - Stack Overflow
移行メモ(NodeServices は廃止済み): 原文が挙げる
Node Servicesは
廃止済みである(JavaScript Services)。現在 jsreport を .NET から使うなら、以下になる。
方式 内容 jsreport サーバを別に立て、HTTP で呼ぶ これが素直。 jsreport.ClientパッケージありDocker で jsreport を動かす 公式イメージがある。運用が分離できる jsreport.Local .NET から Node.js を同梱起動(Windows 前提になりがち) 帳票エンジンを別プロセス/別サービスに切り出すという発想自体は
現在の構成として妥当である(スケールも分離できる)。
-
C# の PDF作成用ライブラリ
https://qiita.com/TsuyoshiUshio@github/items/da5d134ac778ee26f64f -
.NET で使用できる帳票ツールについて(2) - 山田健一のブログ
http://yamadaken1.hatenablog.com/entry/2015/11/21/113608
-
jsclasses の jsreport とは違うので注意する。
-
Node.js の Module なので、
Node Servicesを使用して呼び出す。 -
jsreport: javascript based reporting platform
https://jsreport.net/learn/dotnet- .Net Client
https://jsreport.net/learn/dotnet-client - .Net local reporting
https://jsreport.net/learn/dotnet-local - ASP.NET Core
https://jsreport.net/learn/dotnet-aspnetcore - ASP.NET MVC
https://jsreport.net/learn/dotnet-mvc
- .Net Client
補足(帳票方式の選び方): ライブラリの一覧より、
どの方式を採るかを先に決める方が実務では効く。
方式 向く要件 弱点 コードで組み立てる(QuestPDF、PDFsharp) レイアウトが固定の帳票。速度が要る デザイン変更にコード修正が要る HTML → PDF(Playwright、Puppeteer) 既存の画面を流用したい。CSS で組める ブラウザが必要(重い)。ページ分割の制御が難しい テンプレート製品(ActiveReports、SVF) 非開発者が帳票を保守する。日本の帳票要件 有償。製品にロックインされる Excel 出力(ClosedXML、NPOI) 利用者が加工したい。集計表 印刷レイアウトの厳密な制御は苦手 帳票サーバ(SSRS、jsreport) 大量出力。アプリから分離したい 運用対象が増える 日本の業務帳票に特有の要件(罫線の細かい制御、
帳票フォーマットの厳密な再現、外字
——Windowsの外字——、
JIS2004 の文字)がある場合、
国産の帳票製品が最も確実である。
OSS で無理に押し切ると、細部の詰めに工数が溶ける。大量出力の際の注意:
・1 件ずつ生成すると、起動オーバーヘッドが支配的になる → エンジンを使い回す/バッチでまとめて処理する ・メモリに全件を載せない(ストリームで書き出す) ・Web リクエストの中で同期生成しない → キューに積んで非同期に生成し、完了後にダウンロードさせる
- Reporting Services (SSRS)
https://learn.microsoft.com/ja-jp/sql/reporting-services/create-deploy-and-manage-mobile-and-paginated-reports - System.Drawing.Common は Windows 専用(.NET 7 の破壊的変更)
https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only
Tags: 移行, プログラミング, .NET開発
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。