IRONSOFTWAREHOME
VIDÉOS

Comment définir des tailles de papier personnalisées pour les PDF en utilisant C# | IronPDF

Curtis Chau
Curtis Chau
Updated: 19 juillet 2026

La migration de Scryber.Core vers IronPDF déplace votre flux de travail de génération de PDF d'un moteur de mise en page XHTML+CSS personnalisé vers un moteur de rendu basé sur Chromeavec un support complet de CSS3 et JavaScript. Ce guide fournit un chemin de migration étape par étape couvrant les considérations de licence LGPL v3, le modèle de modèle XHTML strict de Scryber, et les différences de rendu entre les deux moteurs.

Pourquoi migrer de Scryber.Core vers IronPDF

Comprendre Scryber.Core

Scryber.Core (maintenu par Richard Hewitson, version actuelle 9.3.1) est une bibliothèque open-source qui analyse les modèles XHTML+CSS avec son propre moteur de mise en page — pas un navigateur. Il prend en charge le style CSS, la liaison de données {{ }} de type Handlebars via doc.Params et le SVG, ce qui le rend attrayant pour les développeurs qui souhaitent des PDF générés par HTML sans dépendance de navigateur.

Bien que Scryber.Core soit une option viable pour la génération de PDF basée sur des modèles HTML, plusieurs contraintes poussent les équipes à migrer.

Principales raisons de migrer

  1. Préoccupations de licenceLGPL v3: Les obligations de divulgation de source s'appliquent si vous modifiez Scryber lui-même ; la liaison statique dans les apps à code source fermé est autorisée, mais les termes contraignent toujours la manière dont vous livrez les modifications.
  2. Saisie XHTML stricte : Les modèles doivent être du XML valide — la plupart des HTML du monde réel nécessitent un nettoyage avant que Scryber ne puisse les analyser.
  3. Moteur de rendu non-navigateur : Un moteur de mise en page XHTML/CSS personnalisé — le CSS moderne (Grid, Flexboxcomplet, requêtes de conteneurs) et tout JavaScriptne sont pas exécutés.
  4. Communauté plus petite : Moins d'exemples pratiques que les bibliothèques grand public.
  5. Pas d'exécution JavaScript: Rendu statique uniquement — les graphiques, les SPAs et les widgets dynamiques doivent être prérendus.
  6. Pas de document PDF à URL native : Vous devez récupérer le HTML vous-même (par exemple, avec HttpClient) et l'alimenter.
  7. Soutenu par la communauté : Les options de support commercial sont limitées.

Comparaison Scryber.Core vs IronPDF

AspectScryber.CoreIronPDF
LicenceLGPL v3Commercial
Moteur de renduMoteur de mise en page XHTML/CSS personnaliséChrome
Support CSSSous-ensemble (pas de grid, Flexboxpartiel)CSS3 complet
JavaScriptNon exécutéComplet (Chromium V8)
Reliure de modèleLiaison {{ }} + <template> de style HandlebarsStandard (Razor, RazorLight, etc.)
Rigueur d'entréeNécessite du XHTML bien forméAccepte le HTML du monde réel
Prise en charge de l'asynchronismePDFAsync assistant MVC ; sync coreAPI asynchrone complète
DocumentationSite read-the-docs + échantillonsUne traduction
Soutien à la communautéPlus petitPlus large
Soutien commercialSoutenu par la communautéSupport commercial disponible

IronPDF offre un support commercial, une documentation et une base d'utilisateurs plus large comparée à Scryber.Core. La bibliothèque est licenciée pour un usage commercial sans obligations LGPL.


Avant de commencer

Prérequis

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

Modifications du paquet NuGet

# Remove Scryber.Core
dotnet remove package Scryber.Core

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuration de la licence

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Référence API complète

Modifications de l'espace de nommage

// Before: Scryber.Core
using Scryber.Components;   // Document, Page, etc.
using Scryber.Drawing;      // Units, colours
using Scryber.PDF;          // RenderOptions / OutputCompressionType
using Scryber.Styles;       // Style elements (older XML template usage)

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;

Mappages de l'API de base

Scryber.CoreIronPDF
Document.ParseDocument(reader, "", ParseSourceType.DynamicContent)renderer.RenderHtmlAsPdf(html)
Document.ParseDocument(path)renderer.RenderHtmlFileAsPdf(path)
doc.SaveAsPDF(path)pdf.SaveAs(path)
doc.SaveAsPDF(stream)pdf.BinaryData (byte[])
doc.Info.Titlepdf.MetaData.Title
doc.Info.Authorpdf.MetaData.Author
@page CSS dans le templaterenderer.RenderingOptions.PaperSize / marges
doc.RenderOptionsrenderer.RenderingOptions
Handlebars {{value}} + doc.ParamsRazor / interpolation de chaîne

Exemples de migration de code

Exemple 1 : Conversion de base de HTML en PDF

Avant (Scryber.Core):

// NuGet: Install-Package Scryber.Core
using Scryber.Components;
using System.IO;

class Program
{
    static void Main()
    {
        // Scryber requires well-formed XHTML wrapped in an html root with the xhtml namespace
        string html = @"<html xmlns='http://www.w3.org/1999/xhtml'>
            <body><h1>Hello World</h1><p>This is a PDF document.</p></body>
        </html>";

        using (var reader = new StringReader(html))
        using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
        using (var stream = new FileStream("output.pdf", FileMode.Create))
        {
            doc.SaveAsPDF(stream);
        }
    }
}

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

        var renderer = new ChromePdfRenderer();
        string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}

Scryber.Core enrobe la chaîne XHTML dans un StringReader, le transmet à Document.ParseDocument avec ParseSourceType.DynamicContent, et écrit le PDF à un FileStream via SaveAsPDF. La déclaration de namespace XHTML est requise — Scryber rejetera le HTML qui n'est pas du XML bien formé.

IronPDF utilise une instance ChromePdfRenderer avec RenderHtmlAsPdf() pour rendre HTML directement, et enregistre avec SaveAs(). Le HTML5 du monde réel est accepté tel quel. Voir la documentation HTML vers PDF pour d'autres exemples.

Exemple 2 : Conversion d'une URL en PDF

Avant (Scryber.Core):

// NuGet: Install-Package Scryber.Core
// Scryber has no native URL-to-PDF method — fetch the HTML yourself, then parse.
using Scryber.Components;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        string html = await client.GetStringAsync("https://www.example.com");

        // Most live HTML is not valid XHTML; expect to clean it
        // (e.g., HtmlAgilityPack) before Scryber will parse it.
        using (var reader = new StringReader(html))
        using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
        using (var stream = new FileStream("webpage.pdf", FileMode.Create))
        {
            doc.SaveAsPDF(stream);
        }
    }
}

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

Scryber.Core n'a pas de point d'entrée natif URL en PDF. Vous récupérez le HTML vous-même avec HttpClient.GetStringAsync() et l'alimentez dans Document.ParseDocument(). Parce que Scryber nécessite du XHTML bien formé, la plupart des pages en direct auront besoin d'un nettoyage (par exemple via HtmlAgilityPack) avant qu'elles ne soient analysées. Le JavaScriptn'est pas exécuté, donc tout contenu rendu dynamiquement sera manquant.

Le RenderUrlAsPdf() d'IronPDF gère la récupération, l'exécution JavaScriptet le rendu CSS en un seul appel via son moteur Chromium. Apprenez-en davantage dans nos tutoriels.

Exemple 3 : Paramètres et marges de page personnalisés

Avant (Scryber.Core):

// NuGet: Install-Package Scryber.Core
// Page size and margins are normally declared in the XHTML/CSS template;
// the runtime RenderOptions object exposes output-side settings such as compression.
using Scryber.Components;
using Scryber.PDF;
using System.IO;

class Program
{
    static void Main()
    {
        // Page size and margins go in CSS @page; this is the Scryber idiom.
        string html = @"<html xmlns='http://www.w3.org/1999/xhtml'>
            <head>
                <style>
                    @page { size: A4 portrait; margin: 40pt; }
                </style>
            </head>
            <body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body>
        </html>";

        using (var reader = new StringReader(html))
        using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
        using (var stream = new FileStream("custom.pdf", FileMode.Create))
        {
            // Output-side options (compression / conformance) are on RenderOptions.
            doc.RenderOptions.Compression = OutputCompressionType.FlateDecode;
            doc.SaveAsPDF(stream);
        }
    }
}

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 40;
        renderer.RenderingOptions.MarginBottom = 40;

        string html = "<html><body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("custom.pdf");
    }
}

Dans Scryber.Core, la taille de la page et les marges sont déclarées dans le template via @page CSS, tandis que doc.RenderOptions expose des paramètres côté sortie tels que la compression (OutputCompressionType.FlateDecode).

IronPDF déplace la géométrie de la page vers RenderingOptions sur le moteur de rendu : PaperSize (réglé sur PdfPaperSize.A4), MarginTop et MarginBottom en millimètres. La géométrie de la page se trouve sur la surface de l'API plutôt qu'à l'intérieur du modèle.


Modèles de migration de modèles

Migrer la liaison Scryber vers les modèles standards

Scryber.Core utilise du XHTML avec des liaisons de style {{ }} Handlebars (résolues via doc.Params) et une structure <template data-bind='...'> pour les sections répétées. Pour migrer, réexprimez-les dans la modélisation standard .NET :

Liaison Scryber (XHTML + Handlebars) :

<p>{{model.Name}}</p>
<p>Total: {{model.Total}}</p>
<template data-bind='{{model.Items}}'>
    <p>{{.Name}}: {{.Price}}</p>
</template>
XML

IronPDF avec l'interpolation de chaînes en C# :

var items = model.Items.Select(i => $"<li>{i.Name}: {i.Price:C}</li>");

var html = $@"
<p>{model.Name}</p>
<p>Total: {model.Total:C}</p>
<ul>
    {string.Join("", items)}
</ul>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);

Parce qu'IronPDF accepte du HTML simple, vous pouvez utiliser n'importe quel moteur de template .NET - Razor, RazorLight, Handlebars.Net - plutôt que {{ }} + <template> de Scryber.


Migration des en-têtes et pieds de page

Scryber.Core (XHTML + @page boîtes de marge) :

<html xmlns='http://www.w3.org/1999/xhtml'>
    <head>
        <style>
            @page {
                @top-center { content: 'Company Report'; }
                @bottom-center { content: 'Page ' counter(page) ' of ' counter(pages); }
            }
        </style>
    </head>
    <body>
        <h1>Content Here</h1>
    </body>
</html>
HTML

IronPDF (en-têtes/pieds de page HTML):

using IronPdf;

var renderer = new ChromePdfRenderer();

// HTML header with full CSS support
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; text-align: center; font-size: 12pt; border-bottom: 1px solid #ccc;'>
            Company Report
        </div>",
    MaxHeight = 30
};

// HTML footer with page numbers
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; text-align: center; font-size: 10pt;'>
            Page {page} of {total-pages}
        </div>",
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf("<h1>Content Here</h1>");
pdf.SaveAs("report.pdf");

Scryber.Core définit les en-têtes et pieds de page via des boîtes de marge @page dans CSS, utilisant counter(page) et counter(pages) pour les numéros de page.IronPDF utilise HtmlHeaderFooter avec HTML/CSS complet pour les en-têtes et pieds de page et les espaces réservés {page} et {total-pages}.


Nouvelles capacités après la migration

Après avoir migré vers IronPDF, vous bénéficiez de fonctionnalités que Scryber.Core ne peut pas vous offrir :

Fusion de fichiers PDF

var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var pdf3 = PdfDocument.FromFile("chapter3.pdf");

var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("complete_book.pdf");

Sécurité et métadonnées

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

// Metadata
pdf.MetaData.Title = "My Document";
pdf.MetaData.Author = "John Doe";
pdf.MetaData.Subject = "Annual Report";
pdf.MetaData.Keywords = "report, annual, confidential";

// Security
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user456";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;

pdf.SaveAs("protected.pdf");

Résumé de la comparaison des fonctionnalités

FonctionScryber.CoreIronPDF
HTML vers PDFXHTML+CSS via moteur de mise en page personnaliséChromecomplet
URL vers PDFExtraction manuelle uniquementNatif RenderUrlAsPdf
Grille CSSNon pris en chargePrise en charge complète
FlexboxPartielPrise en charge complète
JavaScriptNon exécutéComplet (V8)
Liaison de données{{ }} Handlebars + doc.ParamsRazor / RazorLight / interpolation
En-têtes/Pieds de page@page boîtes de marge / sections de templateHtmlHeaderFooter avec {page} {total-pages}
Fusionner des PDFNon pris en chargeIntégré PdfDocument.Merge
Diviser les PDFNon pris en chargeOui
FiligranesVia HTML superposé dans le modèleNatif ApplyStamp / ApplyWatermark
Signatures numériquesNon pris en chargeOui
PDF/ANon pris en chargeOui (PDF/A-1b, PDF/A-3)
Protection par mot de passeNon pris en chargeComplet (utilisateur/propriétaire + autorisations)
Prise en charge de l'asynchronismePDFAsync assistant MVC ; sync coreSurface asynchrone complète
MultiplateformeOui (.NET Std 2.0/2.1, .NET 8/9/10)Oui

Liste de contrôle de la migration

Pré-migration

  • Auditer tous les modèles Scryber pour les modèles XHTML/liaison
  • Modèles de liaison de données document utilisés ({{model.Property}})
  • Identifier les styles personnalisés nécessitant une conversion CSS
  • Obtenez votre clé de licence IronPDF sur IronPDF

Mises à jour du code

  • Retirer le paquet NuGet Scryber.Core
  • Installer le paquet NuGet IronPdf
  • Mettre à jour les imports de namespaces (using Scryber.Components; / Scryber.Drawing; / Scryber.PDF;using IronPdf;)
  • Remplacer Document.ParseDocument(reader, "", ParseSourceType.DynamicContent) par renderer.RenderHtmlAsPdf(html)
  • Remplacer doc.SaveAsPDF(stream) par pdf.SaveAs(path) ou pdf.BinaryData
  • Convertir les modèles XHTML en HTML5 simple (aucune exigence de namespace)
  • Remplacer {{ }} liaison Handlebars par un templating standard (Razor / interpolation de chaîne)
  • Déplacer le CSS @page vers renderer.RenderingOptions (TaillePapier, MarginHaut, etc.)
  • Convertir les en-têtes/pieds de page de boîtes de marge @page en HtmlHeaderFooter avec {page} et {total-pages} espaces réservés
  • Ajouter l'initialisation de la licence au démarrage de l'application

Essai

  • Tester tous les modèles de documents
  • Vérifier la correspondance des styles (tirer pleinement parti de la prise en charge CSS)
  • Tester la liaison de données avec le nouveau modèle
  • Vérifier les sauts de page
  • Tester les en-têtes/pieds de page avec des espaces réservés pour les numéros de page
  • Comparaison des performances

Veuillez noter: Scryber est une marque déposée de son propriétaire respectif. Ce site n'est pas affilié à, approuvé par, ou sponsorisé par PerceiveIT Limited. 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 et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise