AccessViolationException Após InsertPdf com Cabeçalhos/Rodapés HTML
Um AccessViolationException é lançado ao chamar AddHtmlHeadersAndFooters em um PdfDocument após InsertPdf ter sido usado para mesclar páginas de outro documento. A exceção não ocorre em compilações Debug ou quando um debugger está anexado.
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at IronPdf.PdfDocument.AddHtmlHeadersAndFooters(...)
Em compilações Release, o otimizador JIT do .NET permite que o coletor de lixo recupere objetos gerenciados antes que seu escopo lexical termine, quando pode provar que esses objetos não serão referenciados novamente pelo código gerenciado. Um PdfDocument passado para InsertPdf pode ser coletado enquanto a camada nativa do Chrome do IronPDF ainda está lendo. A chamada subsequente AddHtmlHeadersAndFooters então acessa a memória liberada, produzindo a violação de acesso.
Soluções
Opção 1: Aplique cabeçalhos e rodapés antes do InsertPdf (Recomendado)
Reordene operações para que cabeçalhos e rodapés sejam escritos no documento base antes de qualquer página ser inserida:
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")
Opção 2: Use GC.KeepAlive para prevenir a coleta antecipada
Se a ordem das operações não puder mudar, estenda a duração gerenciada do PdfDocument fonte além da chamada 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 após AddHtmlHeadersAndFooters impede que o JIT agende a coleta de supplementPdf antes que a mesclagem nativa esteja completa.

