AccessViolationException po InsertPdf z nagłówkami/stopkami HTML
Rzucany jest AccessViolationException podczas wywoływania AddHtmlHeadersAndFooters na PdfDocument po użyciu InsertPdf do scalania stron z innego dokumentu. Wyjątek nie występuje w kompilacjach Debug ani gdy podłączony jest debugger.
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at IronPdf.PdfDocument.AddHtmlHeadersAndFooters(...)
W kompilacjach Release optymalizator JIT .NET pozwala na odzyskanie zarządzanych obiektów przez garbage collector przed zakończeniem ich zasięgu leksykalnego, jeśli można udowodnić, że te obiekty nie będą ponownie referencjonowane przez kod zarządzany. PdfDocument przekazany do InsertPdf może zostać zebrany, gdy natywna warstwa Chrome IronPDF nadal go czyta. Kolejne wywołanie AddHtmlHeadersAndFooters uzyskuje wtedy dostęp do zwolnionej pamięci, co powoduje naruszenie dostępu.
Rozwiązania
Opcja 1: Zastosuj nagłówki i stopki przed InsertPdf (Zalecane)
Zmień kolejność operacji, aby nagłówki i stopki były zapisywane w dokumencie podstawowym przed wstawieniem jakichkolwiek stron:
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")
Opcja 2: Użyj GC.KeepAlive, aby zapobiec wczesnemu zbieraniu
Jeśli kolejność operacji nie może się zmienić, przedłuż zarządzany czas życia źródła PdfDocument poza wywołanie 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) umieszczony po AddHtmlHeadersAndFooters zapobiega planowaniu zbierania przez JIT supplementPdf przed zakończeniem natywnego scalania.

