AccessViolationException después de InsertPdf con encabezados/pies de página HTML
Se lanza un AccessViolationException al llamar a AddHtmlHeadersAndFooters en un PdfDocument después de que se utilizó InsertPdf para fusionar páginas de otro documento. La excepción no ocurre en compilaciones de Debug o cuando un depurador está adjunto.
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at IronPdf.PdfDocument.AddHtmlHeadersAndFooters(...)
En compilaciones de Release, el optimizador JIT de .NET permite que el recolector de basura reclame objetos gestionados antes de que finalice su ámbito léxico, cuando puede probar que esos objetos no serán referenciados de nuevo por el código gestionado. Un PdfDocument pasado a InsertPdf puede ser recogido mientras la capa nativa de Chrome de IronPDF aún lo está leyendo. La llamada posterior a AddHtmlHeadersAndFooters luego accede a memoria liberada, produciendo la violación de acceso.
Soluciones
Opción 1: Aplicar encabezados y pies de página antes de InsertPdf (Recomendado)
Reorganice las operaciones para que los encabezados y pies de página se escriban en el documento base antes de insertar cualquier página:
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")
Opción 2: Use GC.KeepAlive para prevenir recolección anticipada
Si no se puede cambiar el orden de las operaciones, extienda el ciclo de vida gestionado de la fuente PdfDocument más allá de la llamada a 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) colocado después de AddHtmlHeadersAndFooters evita que el JIT programe la recolección de supplementPdf antes de que se complete la fusión nativa.

