.NETでHTMLをPDFに変換する [closed] 質問する

.NETでHTMLをPDFに変換する [closed] 質問する

HTML コンテンツを関数に渡して PDF を生成したいと考えています。このために iTextSharp を使用しましたが、テーブルに遭遇するとパフォーマンスが悪く、レイアウトが乱雑になってしまいます。

もっと良い方法はあるでしょうか?

ベストアンサー1

編集(2024):WebViewとEdgeに関連する新しい方法 https://weblog.west-wind.com/posts/2024/Mar/26/Html-to-PDF-Generation-using-the-WebView2-Control

これにはWindows OSが必要です。ASP.net Coreアプリケーションでテストし、このNuGetを使用するためにターゲットフレームワークとして.net8.0-windowsを使用しました。ウェブビューランタイム

作成者も示したWindows デスクトップ ランタイム依存関係としても。

インストールするナゲット

/// <summary>
/// Return raw data as PDF
/// </summary>
/// <returns></returns>
[HttpGet("rawpdfex")]
public async Task<IActionResult> RawPdf()
{
var file = Path.GetFullPath("./HtmlSampleFile-SelfContained.html");

var pdf = new HtmlToPdfHost();
var pdfResult = await pdf.PrintToPdfStreamAsync(file, new 
WebViewPrintSettings {  PageRanges = "1-10"});

if (pdfResult == null || !pdfResult.IsSuccess)
{
    Response.StatusCode = 500;                
    return new JsonResult(new
    {
        isError = true,
        message = pdfResult.Message
    });
}

return new FileStreamResult(pdfResult.ResultStream, "application/pdf");             
}

編集: 新しい提案 PdfSharp を使用した PDF 用の HTML レンダラー

(wkhtmltopdf を試した後、それを避けるように提案しました)

HtmlRenderer.PdfSharp は100% 完全に C# で管理されたコードで、使いやすく、スレッドセーフで、最も重要なのは無料です (新しいBSDライセンス解決。

使用法

  1. HtmlRenderer.PdfSharp nuget パッケージをダウンロードします。

  2. 例の方法を使用します。

    public static Byte[] PdfSharpConvert(String html)
    {
        Byte[] res = null;
        using (MemoryStream ms = new MemoryStream())
        {
            var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
            pdf.Save(ms);
            res = ms.ToArray();
        }
        return res;
    }
    

非常に良い代替案無料版iTextSharp

バージョン4.1.6までiTextSharpはLGPLライセンスで提供されており、4.16までのバージョン(またはフォークもあるかもしれません)はパッケージとして提供されており、自由に使用できます。もちろん、継続した5+を使用することもできます。有料版

私は自分のプロジェクトにwkhtmltopdfソリューションを統合しようとしましたが、多くの障害に遭遇しました。

私は個人的に、次の理由から、Hosted Enterprise アプリケーションでwkhtmltopdf ベースのソリューションを使用することは避けます。

  1. まず、wkhtmltopdf は C# ではなく C++ で実装されており、特にプロジェクトの 32 ビット ビルドと 64 ビット ビルドを切り替えるときに、C# コード内に埋め込むとさまざまな問題が発生します。異なるマシンで「無効な形式の例外」を回避するために、条件付きプロジェクト ビルドなど、いくつかの回避策を試す必要がありました。
  2. 独自の仮想マシンを管理する場合は問題ありません。ただし、プロジェクトが ( Azure (TuesPenchin の著者が述べているように、Azure 内では実際には不可能)、Elastic Beanstalkなど) などの制約された環境内で実行されている場合、wkhtmltopdf が機能するようにその環境を構成するのは悪夢です。
  3. wkhtmltopdf はサーバー内にファイルを作成するため、ユーザー権限を管理し、wkhtmltopdf が実行されている場所に「書き込み」アクセスを許可する必要があります。
  4. Wkhtmltopdf はスタンドアロン アプリケーションとして実行されるため、IIS アプリケーション プールによって管理されません。したがって、別のマシンでサービスとしてホストする必要があります。そうしないと、運用サーバー内で処理スパイクとメモリ消費が発生します。
  5. PDF を生成するために一時ファイルを使用しますが、ディスク I/O が非常に遅いAWS EC2などの場合には、大きなパフォーマンスの問題が発生します。
  6. 多くのユーザーから報告された最も嫌われている「DLL 'wkhtmltox.dll' をロードできません」というエラー。

--- PRE 編集セクション ---

よりシンプルなアプリケーション/環境で HTML から PDF を生成したい人のために、私の古い投稿を提案として残しておきます。

火曜ペチキン

https://www.nuget.org/packages/TuesPechkin/

または特にMVC Webアプリケーション向け(ただし、どの.netアプリケーションでも使用できると思います)

ロタティバ

https://www.nuget.org/packages/Rotativa/

どちらも翻訳HTML を PDF に変換するためのバイナリ。ページのレンダリングに WebKit エンジンを使用するため、CSS スタイルシートも解析できます。

C# との使いやすくシームレスな統合を提供します。

Rotativa は、任意のRazorビューから直接 PDF を生成することもできます。

さらに、実際の Web アプリケーションでは、スレッドの安全性なども管理します。

おすすめ記事