AccessViolationException After InsertPdf with HTML Headers/Footers
Ein AccessViolationException wird ausgelöst, wenn AddHtmlHeadersAndFooters auf einem PdfDocument nach Verwendung von InsertPdf aufgerufen wird, um Seiten aus einem anderen Dokument zu verbinden. Die Ausnahme tritt in Debug-Builds nicht auf, oder wenn ein Debugger angehängt ist.
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at IronPdf.PdfDocument.AddHtmlHeadersAndFooters(...)
In Release-Builds erlaubt der .NET JIT-Optimierer dem Garbage Collector, verwaltete Objekte zurückzufordern, bevor ihr lexikalischer Bereich endet, wenn er nachweisen kann, dass diese Objekte nicht mehr durch verwalteten Code referenziert werden. Ein PdfDocument, das an InsertPdf übergeben wurde, kann gesammelt werden, während die native Chrome-Schicht von IronPDF es noch liest. Der folgende AddHtmlHeadersAndFooters-Aufruf greift dann auf den freigegebenen Speicher zu, was die Zugriffsverletzung verursacht.
Lösungen
Option 1: Header und Footer vor InsertPdf anwenden (Empfohlen)
Ordnen Sie die Vorgänge neu, sodass Header und Footer im Basisdokument geschrieben werden, bevor Seiten eingefügt werden:
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: Verwenden Sie GC.KeepAlive, um eine frühzeitige Sammlung zu verhindern
Wenn die Reihenfolge der Vorgänge nicht geändert werden kann, verlängern Sie die verwaltete Lebensdauer der Quell-PdfDocument über den AddHtmlHeadersAndFooters-Aufruf hinaus:
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), das nach AddHtmlHeadersAndFooters platziert wurde, verhindert, dass der JIT die Sammlung von supplementPdf plant, bevor das native Zusammenführen abgeschlossen ist.

