Exception AccessViolationException après InsertPdf avec en-têtes/pieds de page HTML
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")
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")
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.

