AccessViolationException After InsertPdf with HTML Headers/Footers

This article was translated from English: Does it need improvement?
Translated
View the article in English

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

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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

GC.KeepAlive(supplementPdf), das nach AddHtmlHeadersAndFooters platziert wurde, verhindert, dass der JIT die Sammlung von supplementPdf plant, bevor das native Zusammenführen abgeschlossen ist.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 20,088,359 | Version: 2026.7 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronPdf
Führen Sie eine Probe aus Sehen Sie zu, wie Ihr HTML-Code in eine PDF-Datei umgewandelt wird.