Passer au contenu du pied de page
VIDéOS

Comment convertir Razor en PDF dans Blazor Server en utilisant C#

La migration de Kaizen.io HTML-to-PDFà IronPDF remplace un conteneur Docker auto-hébergé exposé sur HTTP par une bibliothèque .NET en processus. Kaizen.io HTML-to-PDFest uniquement livré en tant qu'image Docker kaizenio.azurecr.io/html-to-pdf et expose un seul point de terminaison REST à POST /html-to-pdf sur le port 8080 — il n'y a pas de SDK .NET ou de package NuGet officiel, donc chaque appel C# doit être fait manuellement HttpClient contre le conteneur en cours d'exécution. Ce guide explique comment remplacer ce modèle par celui d'IronPDF ChromePdfRenderer.

Pourquoi migrer de Kaizen.io vers IronPDF

Les défis de l'API du conteneur

Kaizen.io HTML-to-PDF est un conteneur Docker avec une API v1.x délibérément petite, et l'intégration C# est ce que vous construisez vous-même par-dessus HttpClient. Cette configuration a de vraies limites en production :

  1. Conteneur à faire fonctionner : Vous exécutez, surveillez et mettez à jour kaizenio.azurecr.io/html-to-pdf:latest quelque part accessible depuis votre application — Docker local, sidecar ou un hôte séparé.

  2. Pas de SDK .NET : Chaque appel C# est fait manuellement HttpClient POST + JSON. Pas de IntelliSense, pas de vérifications à la compilation sur la forme de la requête.

  3. Surface d'API très petite v1.x : Le corps JSON documenté n'accepte qu'un seul champ html. URL-vers-PDF, feuilles de style personnalisées, en-têtes/pieds de page, taille de page, orientation et marges sont listés comme éléments de la feuille de route plutôt que des fonctionnalités disponibles — tout ce qui dépasse le rendu d'une chaîne HTML doit être exprimé dans le HTML lui-même, généralement via @page CSS et divs positionnés absolument.

  4. Pas de support pour les numéros de page : L'API ne dispose pas de {page}/ {total}espaces réservés, donc les pieds de page "Page X sur Y" ne peuvent pas être produits côté serveur.

  5. Un aller-retour HTTP par PDF : Même lorsque le conteneur fonctionne sur localhost, chaque PDF paie la sérialisation JSON et un saut de socket.

  6. Filigrane sur la version gratuite : Sans la variable d'environnement KAIZEN_PDF_LICENSE définie sur le conteneur, la sortie est marquée d'un filigrane.

Comparaison Kaizen.io vs IronPDF

Fonction Kaizen.io HTML-to-PDF IronPDF
Distribution Image Docker kaizenio.azurecr.io/html-to-pdf NuGet IronPdf
Intégration C# POST manuel HttpClient (pas de SDK) API fortement typée ChromePdfRenderer
Modèle de processus Conteneur hors processus En cours
Surface du point d'extrémité (v1.x) POST /html-to-pdf avec { "html": ... } Méthodes pour HTML, fichier, URL
Entrée URL Feuille de route RenderUrlAsPdf(url)
En-têtes / Pieds de page Pas dans l'API v1.x ; faux via CSS à position fixe TextHeader/Footer et HtmlHeader/Footer
Numéros de page Non pris en charge {page}et {total-pages}espaces réservés
Taille / Orientation de page Intégrer @page CSS dans le HTML RenderingOptions.PaperSize etc.
Licence d'utilisation Licence unique ; niveau gratuit filigrané Commercial (annuel ou perpétuel)

Pour les équipes standardisant sur le .NET moderne,IronPDF supprime le conteneur sidecar et le saut HTTP de la requête tout en exposant une surface de configuration fortement typée.


Évaluation de la complexité de la migration

Estimation de l'effort par fonctionnalité

Fonction Complexité de la migration
HTML de base vers PDF Très faible
Fichier HTML vers PDF Très faible
URL vers PDF Faible (Kaizen v1.x n'a pas de point d'extrémité URL — le contournement est remplacé en bloc)
En-têtes/Pieds de page Moyen (divs CSS faux remplacés par de vraies zones d'en-tête)
Numéros de page Nouvelle capacité (non disponible dans Kaizen v1.x)
Paramètres de la page Faible (@page CSS se déplace vers RenderingOptions)

Changement de paradigme

Le changement fondamental passe des appels HTTP hors processus à un conteneur Docker à un rendu dans le processus :

Kaizen.io:  HttpClient.PostAsync("http://.../html-to-pdf", { html }) → byte[]
IronPDF:    ChromePdfRenderer → RenderHtmlAsPdf(html) → PdfDocument

Avant de commencer

Prérequis

  1. .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5+
  2. Accès à NuGet : possibilité d'installer des packages NuGet
  3. Licence IronPDF : Obtenez votre clé de licence sur IronPDF

Modifications du paquet

Il n'y a pas de package NuGet Kaizen à supprimer — Kaizen n'est livré que sous forme d'image Docker. Arrêtez le conteneur et ajoutez le package IronPDF:

# Stop and remove the running Kaizen container (if any)
docker stop kaizen-pdf
docker rm kaizen-pdf

# Install IronPDF
dotnet add package IronPdf
# Stop and remove the running Kaizen container (if any)
docker stop kaizen-pdf
docker rm kaizen-pdf

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuration de la licence

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Identifier l'utilisation de Kaizen.io

Parce que Kaizen n'a pas de SDK, les appels s'y font comme des POST génériques HttpClient. Recherchez le point d'extrémité, le nom de l'image, et la variable d'environnement de la licence plutôt qu'un espace de noms :

grep -r "html-to-pdf\|KAIZEN_PDF_LICENSE\|kaizenio.azurecr.io\|localhost:8080" \
  --include="*.cs" --include="*.json" --include="*.yml" .
grep -r "html-to-pdf\|KAIZEN_PDF_LICENSE\|kaizenio.azurecr.io\|localhost:8080" \
  --include="*.cs" --include="*.json" --include="*.yml" .
SHELL

Référence API complète

Correspondances de concept

Il n'y a pas de classe .NET Kaizen à mapper — seulement la forme de la requête JSON et les conventions que vous avez bâties autour.

Concept Kaizen.io Équivalent d'IronPDF
HttpClient + POST /html-to-pdf ChromePdfRenderer
Corps JSON { "html": "..." } RenderHtmlAsPdf(string html)
(No URL field in v1.x) RenderUrlAsPdf(string url)
(No file field in v1.x) RenderHtmlFileAsPdf(string path)
CSS en ligne @page pour la taille RenderingOptions.PaperSize
CSS en ligne @page pour l'orientation RenderingOptions.PaperOrientation
En ligne @page { margin: ... } RenderingOptions.MarginTop/Bottom/Left/Right
Hack en position fixe <div class='header'> RenderingOptions.TextHeader / HtmlHeader
Hack en position fixe <div class='footer'> RenderingOptions.TextFooter / HtmlFooter
HttpClient.PostAsync RenderHtmlAsPdfAsync
Variable d'environnement Conteneur KAIZEN_PDF_LICENSE IronPdf.License.LicenseKey
Réponse HTTP byte[] pdf.BinaryData / pdf.SaveAs(path)

Mappages de caractères de substitution

Kaizen v1.x n'a pas de marque-places côté serveur. Si vous substituiez auparavant des chaînes dans le HTML avant de les envoyer en POST, passez aux marque-places de temps de rendu d'IronPDF :

Ce que vous faisiez auparavant IronPDF Placeholder
html.Replace("{page}", currentPage.ToString()) {page}
html.Replace("{total}", total.ToString()) {total-pages}
html.Replace("{date}", DateTime.Now.ToShortDateString()) {date}
html.Replace("{title}", docTitle) {html-title}

Exemples de migration de code

Exemple 1 : HTML de base vers PDF

Avant (Kaizen.io — POST JSON au conteneur) :

// Container must be running:
//   docker run -d -p 8080:8080 -e KAIZEN_PDF_LICENSE=... \
//     kaizenio.azurecr.io/html-to-pdf:latest
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        var payload = JsonSerializer.Serialize(new { html = "<html><body><h1>Hello World</h1></body></html>" });
        var content = new StringContent(payload, Encoding.UTF8, "application/json");
        var response = await http.PostAsync("http://localhost:8080/html-to-pdf", content);
        response.EnsureSuccessStatusCode();
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
// Container must be running:
//   docker run -d -p 8080:8080 -e KAIZEN_PDF_LICENSE=... \
//     kaizenio.azurecr.io/html-to-pdf:latest
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        var payload = JsonSerializer.Serialize(new { html = "<html><body><h1>Hello World</h1></body></html>" });
        var content = new StringContent(payload, Encoding.UTF8, "application/json");
        var response = await http.PostAsync("http://localhost:8080/html-to-pdf", content);
        response.EnsureSuccessStatusCode();
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using http As New HttpClient()
            Dim payload = JsonSerializer.Serialize(New With {.html = "<html><body><h1>Hello World</h1></body></html>"})
            Dim content As New StringContent(payload, Encoding.UTF8, "application/json")
            Dim response = Await http.PostAsync("http://localhost:8080/html-to-pdf", content)
            response.EnsureSuccessStatusCode()
            Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
            File.WriteAllBytes("output.pdf", pdfBytes)
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System.IO

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

L'approche Kaizen.io sérialise JSON, le poste au point d'extrémité REST du conteneur, vérifie le code d'état, lit la réponse sous forme d'octets, et écrit ces octets sur le disque. L'exécution ChromePdfRenderer d'IronPDF se fait dans le processus — RenderHtmlAsPdf() renvoie un PdfDocument avec une méthode SaveAs(), donc l'aller-retour et la gestion manuelle des octets disparaissent. Voir la documentation HTML vers PDF pour des options de rendu supplémentaires.

Exemple 2 : Fichier HTML vers PDF avec paramètres de page

Kaizen v1.x n'a pas de point de terminaison de fichier et pas de champs de mise en page – vous lisez vous-même le fichier et vous intégrez la taille/orientation de la page dans @page CSS.

Avant (Kaizen.io):

using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var body = File.ReadAllText("input.html");
        var html = "<style>@page { size: A4 portrait; }</style>" + body;

        using var http = new HttpClient();
        var payload = JsonSerializer.Serialize(new { html });
        var response = await http.PostAsync(
            "http://localhost:8080/html-to-pdf",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        response.EnsureSuccessStatusCode();
        File.WriteAllBytes("document.pdf", await response.Content.ReadAsByteArrayAsync());
    }
}
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var body = File.ReadAllText("input.html");
        var html = "<style>@page { size: A4 portrait; }</style>" + body;

        using var http = new HttpClient();
        var payload = JsonSerializer.Serialize(new { html });
        var response = await http.PostAsync(
            "http://localhost:8080/html-to-pdf",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        response.EnsureSuccessStatusCode();
        File.WriteAllBytes("document.pdf", await response.Content.ReadAsByteArrayAsync());
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim body = File.ReadAllText("input.html")
        Dim html = "<style>@page { size: A4 portrait; }</style>" & body

        Using http As New HttpClient()
            Dim payload = JsonSerializer.Serialize(New With {Key .html = html})
            Dim response = Await http.PostAsync(
                "http://localhost:8080/html-to-pdf",
                New StringContent(payload, Encoding.UTF8, "application/json"))
            response.EnsureSuccessStatusCode()
            File.WriteAllBytes("document.pdf", Await response.Content.ReadAsByteArrayAsync())
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("document.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("document.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
        Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
        pdf.SaveAs("document.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

RenderHtmlFileAsPdf() lit directement le fichier, et la taille et l'orientation de la page passent de CSS en ligne @page à des propriétés RenderingOptions.

Exemple 3 : URL vers PDF avec en-têtes et pieds de page

Kaizen v1.x n'a pas de ConvertUrl, pas de champs d'en-tête/pied de page, et pas d'espaces réservés pour les numéros de page. La solution de contournement consiste à récupérer vous-même la page et l'envelopper avec @page CSS et des divs à position fixe pour simuler l'en-tête/le pied de page — sans possibilité de rendus les numéros de page.

Avant (Kaizen.io):

using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        var page = await http.GetStringAsync("https://example.com");
        var html = $@"<!doctype html><html><head><style>
            @page {{margin: 20mm;}}
            .h {{position: fixed; top: -15mm; left: 0; right: 0; text-align: center;}}
            .f {{position: fixed; bottom: -15mm; left: 0; right: 0; text-align: center;}}
        </style></head><body>
            <div class='h'>Company Header</div>
            <div class='f'>Footer (page numbers unsupported in Kaizen v1.x)</div>
            {page}
        </body></html>";

        var payload = JsonSerializer.Serialize(new { html });
        var response = await http.PostAsync(
            "http://localhost:8080/html-to-pdf",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        response.EnsureSuccessStatusCode();
        File.WriteAllBytes("webpage.pdf", await response.Content.ReadAsByteArrayAsync());
    }
}
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        var page = await http.GetStringAsync("https://example.com");
        var html = $@"<!doctype html><html><head><style>
            @page {{margin: 20mm;}}
            .h {{position: fixed; top: -15mm; left: 0; right: 0; text-align: center;}}
            .f {{position: fixed; bottom: -15mm; left: 0; right: 0; text-align: center;}}
        </style></head><body>
            <div class='h'>Company Header</div>
            <div class='f'>Footer (page numbers unsupported in Kaizen v1.x)</div>
            {page}
        </body></html>";

        var payload = JsonSerializer.Serialize(new { html });
        var response = await http.PostAsync(
            "http://localhost:8080/html-to-pdf",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        response.EnsureSuccessStatusCode();
        File.WriteAllBytes("webpage.pdf", await response.Content.ReadAsByteArrayAsync());
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using http As New HttpClient()
            Dim page As String = Await http.GetStringAsync("https://example.com")
            Dim html As String = $"<!doctype html><html><head><style>
                @page {{margin: 20mm;}}
                .h {{position: fixed; top: -15mm; left: 0; right: 0; text-align: center;}}
                .f {{position: fixed; bottom: -15mm; left: 0; right: 0; text-align: center;}}
            </style></head><body>
                <div class='h'>Company Header</div>
                <div class='f'>Footer (page numbers unsupported in Kaizen v1.x)</div>
                {page}
            </body></html>"

            Dim payload As String = JsonSerializer.Serialize(New With {Key .html = html})
            Dim response As HttpResponseMessage = Await http.PostAsync(
                "http://localhost:8080/html-to-pdf",
                New StringContent(payload, Encoding.UTF8, "application/json"))
            response.EnsureSuccessStatusCode()
            File.WriteAllBytes("webpage.pdf", Await response.Content.ReadAsByteArrayAsync())
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader.CenterText = "Company Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page} of {total-pages}";
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader.CenterText = "Company Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page} of {total-pages}";
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.TextHeader.CenterText = "Company Header"
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page} of {total-pages}"
        renderer.RenderingOptions.MarginTop = 20
        renderer.RenderingOptions.MarginBottom = 20
        Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

RenderUrlAsPdf() récupère et rend directement l'URL — pas de récupération de page côté client — et les divs simulés à position fixe sont remplacés par TextHeader / TextFooter zones. Les numéros de page sont produits via les espaces réservés {page}et {total-pages}, que Kaizen v1.x ne fournit pas. En savoir plus sur la conversion d'URL en PDF et les en-têtes et pieds de page.


Notes de migration essentielles

La licence réside dans le code, pas dans le conteneur

La licence de Kaizen se configure via la variable d'environnement KAIZEN_PDF_LICENSE sur le conteneur Docker. La licence IronPDF est une propriété statique définie une fois au démarrage de l'application :

// DELETE the Kaizen container env var:
//   docker run ... -e KAIZEN_PDF_LICENSE=... kaizenio.azurecr.io/html-to-pdf

// IronPDF: set once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
// DELETE the Kaizen container env var:
//   docker run ... -e KAIZEN_PDF_LICENSE=... kaizenio.azurecr.io/html-to-pdf

// IronPDF: set once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
' DELETE the Kaizen container env var:
'   docker run ... -e KAIZEN_PDF_LICENSE=... kaizenio.azurecr.io/html-to-pdf

' IronPDF: set once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

Syntaxe des marque-places

Si vous substituiez auparavant des chaînes dans le HTML avant de les envoyer en POST, passez aux marque-places de temps de rendu d'IronPDF :

  • {page}(inchangé)
  • {total}{total-pages}
  • {title}{html-title}
  • {date}{date}(inchangé)

Changement de type de retour

Kaizen renvoie des octets bruts sur HTTP.IronPDF renvoie un PdfDocument :

// Kaizen.io returns byte[] via HTTP
byte[] pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("output.pdf", pdfBytes);

//IronPDF returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Or get bytes if needed
// Kaizen.io returns byte[] via HTTP
byte[] pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("output.pdf", pdfBytes);

//IronPDF returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Or get bytes if needed
Imports System.IO

' Kaizen.io returns Byte() via HTTP
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("output.pdf", pdfBytes)

' IronPDF returns PdfDocument
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")           ' Direct save
Dim bytes As Byte() = pdf.BinaryData ' Or get bytes if needed
$vbLabelText   $csharpLabel

Supprimer la plomberie HTTP

Une fois que le rendu est en processus, le code de support disparaît :

// DELETE all of:
// - HttpClient lifetime management
// - JSON serialization of { html }
// - response.EnsureSuccessStatusCode() / status-code branches
// - "container unreachable" retry/backoff
// - ReadAsByteArrayAsync()

// Replaced with a single in-process call:
var pdf = renderer.RenderHtmlAsPdf(html);
// DELETE all of:
// - HttpClient lifetime management
// - JSON serialization of { html }
// - response.EnsureSuccessStatusCode() / status-code branches
// - "container unreachable" retry/backoff
// - ReadAsByteArrayAsync()

// Replaced with a single in-process call:
var pdf = renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

Dépannage

Problème 1 : Pas de classe HtmlToPdfConverter

Problème : Il n'y a pas de classe HtmlToPdfConverter à remplacer par — Kaizen n'a pas du tout de SDK .NET.

Solution : La migration se fait à partir de POST HttpClient contre le conteneur vers ChromePdfRenderer :

// Kaizen.io: hand-rolled HTTP
using var http = new HttpClient();
var response = await http.PostAsync("http://localhost:8080/html-to-pdf", content);

// IronPDF: in-process renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Kaizen.io: hand-rolled HTTP
using var http = new HttpClient();
var response = await http.PostAsync("http://localhost:8080/html-to-pdf", content);

// IronPDF: in-process renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
Imports System.Net.Http
Imports IronPdf

' Kaizen.io: hand-rolled HTTP
Using http As New HttpClient()
    Dim response = Await http.PostAsync("http://localhost:8080/html-to-pdf", content)
End Using

' IronPDF: in-process renderer
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

Problème 2 : Où est passé l'objet Options ?

Problème : Kaizen v1.x n'a pas de ConversionOptions — la mise en page des pages était en CSS en ligne @page, les en-têtes/pieds de page étaient des divs à position fixe.

Solution : Déplacer cette configuration vers RenderingOptions sur le moteur de rendu :

// Before: <style>@page { size: A4 portrait; margin: 20mm; }</style>
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
// Before: <style>@page { size: A4 portrait; margin: 20mm; }</style>
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
' Before: <style>@page { size: A4 portrait; margin: 20mm; }</style>
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
$vbLabelText   $csharpLabel

Problème 3 : Les numéros de page ne se rendent pas

Problème : Kaizen v1.x n'a pas de support d'espaces réservés {page}/ {total}, donc tout pied de page "Page X sur Y" avant la migration était soit manquant soit un texte statique.

Solution : Utilisez les espaces réservés d'en-tête/pied de page d'IronPDF :

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    CenterText = "Page {page} of {total-pages}"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    CenterText = "Page {page} of {total-pages}"
};
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
    .CenterText = "Page {page} of {total-pages}"
}
$vbLabelText   $csharpLabel

Si vous remplaciez auparavant manuellement {total}dans votre propre code avant d'envoyer le POST, supprimez cette substitution —IronPDF résout {total-pages}au moment du rendu.

Problème 4 : Erreurs de connexion du conteneur

Problème : Les chemins de code gérant les erreurs "conteneur inaccessible" / port-8080.

Solution :IronPDF fonctionne en processus — il n'y a pas de point de connexion. Supprimer le traitement des erreurs de connexion.

Édition 5 : Premier rendu lent

Problème : La première génération du PDF prend 1 à 3 secondes.

Solution :IronPDF initialise Chromium lors de sa première utilisation. Réchauffement au démarrage de l'application :

// In Program.cs or Startup.cs:
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");
// In Program.cs or Startup.cs:
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");
' In Program.vb or Startup.vb:
Call New ChromePdfRenderer().RenderHtmlAsPdf("<html></html>")
$vbLabelText   $csharpLabel

Liste de contrôle de la migration

Pré-migration

  • Localisez chaque site d'appel de Kaizen (cherchez html-to-pdf, KAIZEN_PDF_LICENSE, kaizenio.azurecr.io, localhost:8080)
  • Documentez le CSS en ligne @page utilisé pour la taille, l'orientation, les marges
  • Documenter les faux divs d'en-tête/pied de page (position fixe avec décalages négatifs)
  • Listez toute substitution de place-holders côté client (html.Replace("{page}", ...) etc.)
  • Noter le cycle de vie du conteneur : tirer, exécuter, redémarrer, variable d'environnement de licence
  • Obtenir une clé de licence IronPDF

Démontage du conteneur

  • Arrêtez et supprimez le conteneur Kaizen en cours d'exécution (docker stop kaizen-pdf && docker rm kaizen-pdf)
  • Supprimer les étapes de tirage / exécution de Kaizen du CI/CD
  • Supprimez KAIZEN_PDF_LICENSE des secrets/env
  • Installez le packageNuGet IronPdf(dotnet add package IronPdf)

Modifications du code

  • Ajouter la configuration de la clé de licence au démarrage
  • Remplacez le POST HttpClient par ChromePdfRenderer
  • Déplacez le CSS intégré @page dans les propriétés RenderingOptions
  • Remplacez le POST JSON par RenderHtmlAsPdf() / RenderHtmlFileAsPdf() / RenderUrlAsPdf()
  • Remplacez les divs d'en-tête/pied de page simulés par TextHeader/Footer ou HtmlHeader/Footer
  • Mettez à jour la syntaxe des espaces réservés ({total}{total-pages}, {title}{html-title})
  • Remplacez le corps HTTP byte[] par pdf.BinaryData
  • Utilisez pdf.SaveAs() au lieu de File.WriteAllBytes()
  • Supprimer le traitement des erreurs de connectivité du conteneur et la gestion/rétentissement

Essai

  • Tester tous les chemins de génération de PDF
  • Vérifiez le rendu des en-têtes/pieds de page et les numéros de page (nouvelle capacité)
  • Valider les marges, la taille de la page et l'orientation
  • Tester le fonctionnement hors ligne (aucun conteneur requis)

Après la migration

  • Démanteler l'infrastructure du conteneur Kaizen
  • Mettre à jour les variables d'environnement / secrets
  • Supprimer les vérifications de l'état des conteneurs de la surveillance/alerte
  • Documenter les nouvelles erreurs de type exception typée

Veuillez noterKaizen.io est une marque déposée de son propriétaire respectif. Ce site n'est pas affilié à, approuvé par, ou sponsorisé par Kaizen.io. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi