IRONSOFTWAREHOME
UTILISATION DE IRONPDF

Comment fusionner deux tableaux d'octets PDF en C# en using IronPDF

Curtis Chau
Curtis Chau
Updated: 9 mars 2026

Récupérer un fichier PDF à partir d'une base de données dans ASP.NET utilisant C# nécessite trois étapes : interroger la table de la base de données pour la colonne BLOB binaire, charger les octets dans un objet PdfDocument en utilisant IronPDF, et renvoyer les octets au navigateur via une réponse Contenu du fichierResult ou File(). IronPDF gère le rendu, le filigrane et les fonctions de sécurité afin que vous puissiez vous concentrer sur la logique d'accès aux données.

Comment installer IronPDF pour ASP.NET?

Avant d'écrire le moindre code de récupération de PDF, ajoutez IronPDF à votre projet via le gestionnaire de packages NuGet :

PM > Install-Package IronPdf

Après l'installation, définissez votre clé de licence dans Program.cs ou appsettings.json avant d'appeler toute méthode IronPDF :

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

IronPDF prend en charge .NET 10 , .NET 8, .NET 6 et .NET Framework 4.6.2+. Il fonctionne sous Windows, Linux et macOS sans nécessiter de dépendances supplémentaires ni d'installation de navigateur sans interface graphique. Une licence d'essai gratuite est disponible pour évaluation.

Comment configurer une table de base de données SQL Server ?

L'approche la plus courante est de stocker les fichiers PDF sous forme de données binaires dans une colonne VARBINAIRE(MAX) de SQL Server. Cela permet de conserver le document et ses métadonnées dans un seul tableau, simplifie la sauvegarde et évite la gestion des chemins d'accès au système de fichiers.

Utilisez le script SQL suivant pour créer la table de stockage :

// SQL Server table definition (run this in SSMS or via EF migrations)
// CREATE TABLE PdfDocuments (
//     Identifiant IDENTITÉ INT(1,1) PRIMARY KEY,
//     Nom de fichier NVARCHAR(255) NOT NULL,
//     Contenu du fichier VARBINAIRE(MAX) NOT NULL,
//     Téléchargé à DATETIME2 DEFAULT GETUTCDATE()
// );
C#

Une fois que la table existe, configurez la chaîne de connexion dans appsettings.json :

// appsettings.json snippet (not C# -- shown as reference)
// "ConnectionStrings": {
//   "DefaultConnection": "Server=localhost;Database=PdfStorage;Integrated Security=True;"
// }

Enregistrez la chaîne de connexion via l'injection de dépendance dans Program.cs :

using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddSingleton<IConfiguration>(builder.Configuration);

IronPdf.License.LicenseKey = builder.Configuration["IronPdf:LicenseKey"];

var app = builder.Build();
app.MapControllers();
app.Run();

Comment récupérer un fichier PDF depuis SQL Server dans ASP.NET Core?

Le schéma de récupération suit trois étapes : ouvrir une connexion, exécuter une requête SELECT avec paramètres, et lire la colonne binaire dans un byte[]. IronPDF charge ensuite ce tableau dans un objet PdfDocument pour un traitement optionnel avant de le diffuser au client.

Création du contrôleur d'API

Créez un contrôleur qui expose des points de terminaison GET pour l'affichage en ligne et le téléchargement de fichiers :

using IronPdf;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    private readonly string _connectionString;

    public PdfController(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("DefaultConnection")
            ?? throw new InvalidOperationException("Connection string not found.");
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetPdf(int id)
    {
        byte[] pdfBytes = await RetrievePdfBytesAsync(id);
        if (pdfBytes is null || pdfBytes.Length == 0)
            return NotFound("PDF document not found.");

        // Load into IronPDF for validation or optional modification
        using var pdfDocument = new PdfDocument(pdfBytes);

        // Inline display -- browser opens PDF viewer
        Response.Headers.Append("Content-Disposition", "inline; filename=\"document.pdf\"");
        return File(pdfDocument.BinaryData, "application/pdf");
    }

    private async Task<byte[]> RetrievePdfBytesAsync(int documentIdentifiant)
    {
        await using var connection = new SqlConnection(_connectionString);
        await connection.OpenAsync();

        const string query = "SELECT Contenu du fichier FROM PdfDocuments WHERE Identifiant = @Identifiant";
        await using var command = new SqlCommand(query, connection);
        command.Parameters.AddWithValue("@Identifiant", documentIdentifiant);

        var result = await command.ExecuteScalarAsync();
        return result as byte[] ?? Array.Empty<byte>();
    }
}
C#

Ce contrôleur utilise des requêtes paramétrées pour prévenir l'injection SQL et await using pour bien libérer SqlConnection et SqlCommand. La classe PdfDocument valide le tableau d'octets et expose la propriété BinaryData pour le streaming.

Retour d'un fichier nommé pour téléchargement

Lorsque les utilisateurs ont besoin d'enregistrer le document plutôt que de le voir en ligne, définissez l'en-tête Content-Disposition à attachment et passez le nom du fichier original :

[HttpGet("download/{id}")]
public async Task<IActionResult> DownloadPdf(int id)
{
    await using var connection = new SqlConnection(_connectionString);
    await connection.OpenAsync();

    const string query = "SELECT Nom de fichier, Contenu du fichier FROM PdfDocuments WHERE Identifiant = @Identifiant";
    await using var command = new SqlCommand(query, connection);
    command.Parameters.AddWithValue("@Identifiant", documentIdentifiant);

    await using var reader = await command.ExecuteReaderAsync();
    if (!await reader.ReadAsync())
        return NotFound("Document not found.");

    var fileName = reader.GetString(reader.GetOrdinal("Nom de fichier"));
    var pdfBytes = (byte[])reader["Contenu du fichier"];

    using var pdfDocument = new PdfDocument(pdfBytes);
    return File(pdfDocument.BinaryData, "application/pdf", fileName);
}
C#

Passer fileName comme troisième argument à File() définit automatiquement l'en-tête Content-Disposition à attachment. ASP.NET Core gère correctement l'encodage des noms de fichiers contenant des espaces.

Comment ajouter un filigrane à un PDF récupéré ?

L'une des opérations de post-récupération les plus pratiques consiste à apposer un filigrane sur chaque page avant de diffuser le document. Ceci est utile pour les rapports confidentiels, les documents de travail ou tout fichier nécessitant un marquage de sécurité visible.

Appliquer un filigrane HTML avec IronPDF

L'API de filigrane d'IronPDF accepte n'importe quelle chaîne HTML, ce qui signifie que vous pouvez styliser le texte du filigrane à l'aide de CSS en ligne. Réglez l'opacité à un niveau suffisamment bas pour que le contenu sous-jacent reste lisible :

[HttpGet("watermarked/{id}")]
public async Task<IActionResult> GetWatermarkedPdf(int id)
{
    byte[] pdfBytes = await RetrievePdfBytesAsync(id);
    if (pdfBytes is null || pdfBytes.Length == 0)
        return NotFound("PDF document not found.");

    using var pdfDocument = new PdfDocument(pdfBytes);

    // HTML watermark applied to every page
    string watermarkHtml = "<h2 style='color:red; opacity:0.4; font-family:Arial;'>CONFIDENTIAL</h2>";
    pdfDocument.ApplyWatermark(
        watermarkHtml,
        rotation: 30,
        verticalAlignment: VerticalAlignment.Middle,
        horizontalAlignment: HorizontalAlignment.Center
    );

    return File(pdfDocument.BinaryData, "application/pdf");
}

La méthode ApplyWatermark accepte le HTML et le CSS standard, vous permettant de contrôler pleinement la police, la couleur, l'opacité et la position. Le filigrane est automatiquement appliqué à toutes les pages du document. Pour des fonctionnalités supplémentaires de manipulation de fichiers PDF , notamment l'ajout d'images, d'en-têtes et de pieds de page, ou la fusion de plusieurs documents, consultez la documentation IronPDF .

Comment stocker les fichiers PDF téléchargés dans SQL Server ?

Pour effectuer l'aller-retour, il faut un point de terminaison de téléchargement qui lit les fichiers de formulaire entrants et les écrit dans la base de données. Associé aux points de terminaison de récupération ci-dessus, cela forme un système complet de gestion de documents :

[HttpPost("upload")]
public async Task<IActionResult> UploadPdf(IFormFile file)
{
    if (file is null || file.Length == 0)
        return BadRequest("No file uploaded.");

    if (!file.Type de contenu.Equals("application/pdf", StringComparison.OrdinalIgnoreCase))
        return BadRequest("Only PDF files are accepted.");

    using var memoryStream = new MemoryStream();
    await file.CopyToAsync(memoryStream);
    byte[] pdfBytes = memoryStream.ToArray();

    // Validate using IronPDF before storage
    using var pdfDocument = new PdfDocument(pdfBytes);

    await using var connection = new SqlConnection(_connectionString);
    await connection.OpenAsync();

    const string insertQuery = @"
        INSERT INTO PdfDocuments (Nom de fichier, Contenu du fichier)
        VALUES (@Nom de fichier, @Contenu du fichier);
        SELECT SCOPE_IDENTITY();";

    await using var command = new SqlCommand(insertQuery, connection);
    command.Parameters.AddWithValue("@Nom de fichier", file.Nom de fichier);
    command.Parameters.AddWithValue("@Contenu du fichier", pdfDocument.BinaryData);

    var newIdentifiant = Convert.ToInt32(await command.ExecuteScalarAsync());
    return Ok(new { id = newIdentifiant, fileName = file.Nom de fichier });
}
C#

Utiliser PdfDocument pour valider avant le stockage garantit que seuls les fichiers PDF analysables et bien formés entrent dans la base de données. Si le tableau d'octets est corrompu ou tronqué, IronPDF lance une exception que vous pouvez intercepter et renvoyer sous forme de réponse 400 Bad Request.

Quels sont les principaux types de tables et de colonnes pour le stockage PDF ?

Le schéma que vous utilisez influe sur les performances des requêtes et l'efficacité du stockage. Le tableau ci-dessous présente la configuration de colonnes recommandée pour SQL Server :

Schéma SQL Server recommandé pour le stockage BLOB PDF
ColonneType de donnéesObjectif
IdentifiantIDENTITÉ INTClé primaire, auto-incrémentée
Nom de fichierNVARCHAR(255)Nom de fichier d'origine pour les en-têtes de téléchargement
Contenu du fichierVARBINAIRE(MAX)Données binaires PDF brutes (BLOB)
Type de contenuNVARCHAR(100)Type MIME, par exemple, application/pdf
Taille du fichier (octets)BIGINTTaille stockée pour la gestion des quotas
Téléchargé àDATETIME2Horodatage UTC pour l'audit
Téléchargé parNVARCHAR(100)Identifiantentité de l'utilisateur pour le contrôle d'accès

Pour les systèmes à grande échelle nécessitant le streaming de fichiers SQL Server, Microsoft présente la fonctionnalité FILESTREAM comme une alternative permettant de stocker de gros BLOB sur le système de fichiers tout en restant interrogeable via T-SQL. Cependant, pour la plupart des applications ASP.NET servant des documents jusqu'à quelques centaines de mégaoctets, le stockage VARBINAIRE(MAX) en ligne fonctionne bien et simplifie le déploiement.

Comment gérez-vous les erreurs et optimisez-vous les performances ?

Pour une récupération fiable des fichiers PDF en production, il est nécessaire de gérer les erreurs à chaque niveau : base de données, IronPDF et réponse HTTP. Le tableau ci-dessous résume les principales pratiques :

Gestion des erreurs et modèles de performance pour la récupération de fichiers PDF
PréoccupationRecommandationRaison
Élimination des connexionsawait using des instructionsEmpêche l'épuisement du pool de connexions
Destruction de documents PDFusing des instructionsLibère rapidement la mémoire non gérée
Injection SQLRequêtes paramétrées uniquementEmpêche les entrées malveillantes de modifier les requêtes
validation du type de fichierVérifiez le type MIME et les octets magiquesBloque les chargements non PDF avant le stockage
Gestion des fichiers volumineuxRéponse du flux avec FileStreamResultÉvite de charger l'intégralité du fichier dans la mémoire du serveur
Mise en cacheUtilisez IMemoryCache ou IDistributedCacheRéduit les allers-retours répétés vers la base de données
opérations asynchronesasync / await tout au longMaintient les threads libres pendant les attentes disque et réseau.

Pour la gestion des chaînes de connexion, stockez la valeur dans appsettings.json et ne la codez jamais en dur dans les fichiers source. Utilisez la gestion des secrets intégrée d' ASP.NET Core lors du développement local, et Azure Key Vault ou AWS Secrets Manager en production. Ne jamais consigner les chaînes de connexion ou les clés de licence dans un système de contrôle de version.

Lors de la diffusion de fichiers PDF volumineux, envisagez de renvoyer un FileStreamResult soutenu par un MemoryStream plutôt que de charger tout le tableau d'octets en mémoire. Pour les documents très volumineux (plus de 100 Mo), l' API FILESTREAM de SQL Server permet la diffusion par blocs directement depuis le système de fichiers.

Mise en cache des documents fréquemment consultés

Si certains fichiers PDF sont demandés à plusieurs reprises -- par exemple, un document de conditions générales ou un catalogue de produits -- mettre en cache le tableau d'octets dans IMemoryCache évite les allers-retours répétés à la base de données. Enregistrez IMemoryCache dans Program.cs avec builder.Services.AddMemoryCache(), puis injectez-le dans le contrôleur et vérifiez le cache avant d'interroger la base de données. Définissez une date d'expiration absolue qui corresponde à la fréquence de mise à jour prévue des documents. Lorsqu'un document est mis à jour, supprimez l'entrée mise en cache par clé afin que la requête suivante récupère la nouvelle version.

Pour les scénarios distribués -- tels qu'un déploiement équilibré avec plusieurs instances de serveur -- remplacez IMemoryCache par IDistributedCache soutenu par Redis ou SQL Server. Les abstractions de cache distribué d' ASP.NET Core permettent de conserver un code de contrôleur quasiment identique ; seule l'enregistrement dans Program.cs change.

Comment déployer la récupération de PDF avec IronPDF sur plusieurs plateformes ?

IronPDF fonctionne sous Linux, Windows et macOS sans nécessiter d'installation séparée de Chromium ni aucune modification de configuration. Le même package NuGet cible toutes les plateformes, votre contrôleur PDF fonctionne donc de manière identique, que vous le déployiez sur :

  • Serveur Windows avec IIS
  • Conteneurs Ubuntu sur Docker ou Kubernetes
  • Azure App Service (Linux ou Windows)
  • AWS Elastic Beanstalk

Déploiement sur Docker et Linux

Pour les déploiements Docker, ajoutez les dépendances IronPDF à votre Dockerfile. La documentation Linux IronPDF fournit les paquets apt exacts requis pour les images de base Debian et Alpine. Un Dockerfile multi-étapes classique installe les dépendances du système d'exploitation lors de la création de l'image d'exécution, puis y copie l'application ASP.NET publiée. Pour Azure, le guide de déploiement Azure détaille la configuration d'App Service, notamment les paramètres de mémoire et de processeur nécessaires au rendu PDF à grande échelle.

Comme IronPDF intègre son propre moteur de rendu basé sur Chromium, vous n'avez pas besoin d'installer un navigateur séparé sur le serveur. Cela simplifie considérablement la configuration des conteneurs Linux par rapport aux solutions qui nécessitent un navigateur système. L'équipe IronPDF effectue des tests sur les images de base Linux les plus courantes à chaque version, vous pouvez donc être sûr qu'un conteneur Alpine ou Debian fonctionnera immédiatement.

Utilisation d'Entity Framework Core au lieu d' .NET

IronPDF s'intègre également à Entity Framework Core comme alternative à .NET brut. Si votre projet utilise déjà EF Core, vous pouvez mapper la colonne Contenu du fichier à une propriété byte[] sur une classe de modèle et laisser EF gérer la génération de requêtes. Cette approche réduit considérablement le code répétitif et facilite l'ajout de fonctionnalités de filtrage, de pagination et d'audit via le fournisseur LINQ d'EF.

En contrepartie, EF Core charge l'intégralité du BLOB en mémoire dans le cadre du graphe d'entités. Pour les fichiers PDF très volumineux, envisagez d'utiliser ADO.NET brut ou la méthode FromSql d'EF Core avec une projection qui sélectionne uniquement la colonne de tableau d'octets plutôt que l'entité complète.

Quelles sont vos prochaines étapes ?

Récupérer les fichiers PDF d'une base de données SQL Server dans ASP.NET Core en utilisant C# et IronPDF suit un schéma clair : interroger la colonne BLOB avec un SELECT paramétré, charger les octets dans un PdfDocument, et retourner les données binaires avec le bon en-tête Content-Disposition. IronPDF permet en plus de valider, d'ajouter un filigrane, de fusionner ou de sécuriser des documents avant qu'ils ne quittent votre serveur.

Pour aller plus loin avec les fonctionnalités de gestion de documents d'IronPDF, consultez ces ressources :

Commencez par une licence d'essai gratuite IronPDF pour tester toutes les fonctionnalités sans restriction. L'essai produit des résultats marqués d'un filigrane ; Supprimez le filigrane en appliquant une clé de licence payante. La documentation de référence API complète et des exemples de code sont disponibles sur le site web IronPDF pour chaque méthode utilisée dans cet article.

Si votre projet utilise déjà Entity Framework Core, le guide d'intégration IronPDF avec EF Core explique comment remplacer le code .NET brut par des modèles d'entités tout en conservant le même pipeline de traitement IronPDF . Pour les équipes travaillant avec .NET 10 et les dernières fonctionnalités ASP.NET Core , les mêmes modèles décrits ici fonctionnent sans modification : IronPDF est compatible avec toutes les versions LTS et STS de .NET .

Consultez la page des tarifs IronPDF pour trouver le niveau de licence adapté à votre déploiement. Une seule licence de développeur couvre le développement et les tests locaux ; Des licences de redistribution sont disponibles pour les produits SaaS et les déploiements sur site avec plusieurs serveurs.

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.

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