Exception AccessViolationException après InsertPdf avec en-têtes/pieds de page HTML

This article was translated from English: Does it need improvement?
Translated
View the article in English

Un AccessViolationException est levé lors de l'appel de AddHtmlHeadersAndFooters sur un PdfDocument après que InsertPdf ait été utilisé pour fusionner des pages d'un autre document. L'exception ne se produit pas dans les builds Debug ou lorsqu'un débogueur est attaché.

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at IronPdf.PdfDocument.AddHtmlHeadersAndFooters(...)

Dans les builds Release, l'optimiseur JIT de .NET permet au collecteur de déchets de récupérer des objets gérés avant que leur portée lexicale se termine, lorsqu'il peut prouver que ces objets ne seront plus référencés par du code géré. Un PdfDocument passé à InsertPdf peut être collecté pendant que la couche native Chrome d'IronPDF le lit encore. L'appel subséquent de AddHtmlHeadersAndFooters accède alors à la mémoire libérée, produisant la violation d'accès.

Solutions

Option 1 : Appliquer les en-têtes et pieds de page avant InsertPdf (Recommandé)

Réorganisez les opérations afin que les en-têtes et pieds de page soient écrits dans le document de base avant que des pages ne soient insérées :

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right; font-size:10px'>Page {page} of {total-pages}</div>"
};

var basePdf = renderer.RenderHtmlAsPdf(baseHtml);

basePdf.AddHtmlHeadersAndFooters(renderer.RenderingOptions);

var supplementPdf = PdfDocument.FromFile("supplement.pdf");
basePdf.InsertPdf(supplementPdf, 0);

basePdf.SaveAs("output.pdf");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right; font-size:10px'>Page {page} of {total-pages}</div>"
};

var basePdf = renderer.RenderHtmlAsPdf(baseHtml);

basePdf.AddHtmlHeadersAndFooters(renderer.RenderingOptions);

var supplementPdf = PdfDocument.FromFile("supplement.pdf");
basePdf.InsertPdf(supplementPdf, 0);

basePdf.SaveAs("output.pdf");
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = "<div style='text-align:right; font-size:10px'>Page {page} of {total-pages}</div>"
}

Dim basePdf = renderer.RenderHtmlAsPdf(baseHtml)

basePdf.AddHtmlHeadersAndFooters(renderer.RenderingOptions)

Dim supplementPdf = PdfDocument.FromFile("supplement.pdf")
basePdf.InsertPdf(supplementPdf, 0)

basePdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Option 2 : Utilisez GC.KeepAlive pour éviter la collecte anticipée

Si l'ordre des opérations ne peut pas être modifié, prolongez la durée de vie gérée de la source PdfDocument au-delà de l'appel AddHtmlHeadersAndFooters :

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right; font-size:10px'>Page {page} of {total-pages}</div>"
};

var basePdf = renderer.RenderHtmlAsPdf(baseHtml);
var supplementPdf = PdfDocument.FromFile("supplement.pdf");

basePdf.InsertPdf(supplementPdf, 0);
basePdf.AddHtmlHeadersAndFooters(renderer.RenderingOptions);

GC.KeepAlive(supplementPdf);

basePdf.SaveAs("output.pdf");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right; font-size:10px'>Page {page} of {total-pages}</div>"
};

var basePdf = renderer.RenderHtmlAsPdf(baseHtml);
var supplementPdf = PdfDocument.FromFile("supplement.pdf");

basePdf.InsertPdf(supplementPdf, 0);
basePdf.AddHtmlHeadersAndFooters(renderer.RenderingOptions);

GC.KeepAlive(supplementPdf);

basePdf.SaveAs("output.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = "<div style='text-align:right; font-size:10px'>Page {page} of {total-pages}</div>"
}

Dim basePdf = renderer.RenderHtmlAsPdf(baseHtml)
Dim supplementPdf = PdfDocument.FromFile("supplement.pdf")

basePdf.InsertPdf(supplementPdf, 0)
basePdf.AddHtmlHeadersAndFooters(renderer.RenderingOptions)

GC.KeepAlive(supplementPdf)

basePdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

GC.KeepAlive(supplementPdf) placé après AddHtmlHeadersAndFooters empêche le JIT de planifier la collecte de supplementPdf avant que la fusion native ne soit terminée.

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
Prêt à commencer ?
Nuget Téléchargements 20,088,359 | Version : 2026.7 vient de sortir
Still Scrolling Icon

Vous faites encore défiler ?

Vous voulez une preuve rapidement ? PM > Install-Package IronPdf
exécuter un échantillon Regardez votre code HTML se transformer en PDF.