2016-03-20 12 views
1

Ich schreibe ein kleines Werkzeug für mich, um PDF-Dateien mit PDFSharp-Bibliothek zusammenzuführen. Ich verwende die neueste Vorabversion (1.5) von PDFSharp.PDFSharp keine Ressourcen (Speicherleck)

Ich stoße auf ein Problem, bei dem Dokumente, die in den Arbeitsspeicher geladen werden, nicht freigegeben werden, wenn sie den Gültigkeitsbereich verlassen. Ich verfolgte diesen Speicherverlust des Codes auf den folgenden Teil nach unten:

using (var mergedDocument = new PdfDocument()) 
{ 
    for (var i = 0; i < SelectedDocuments.Count; i++) 
    { 
     using (var document = PdfReader.Open(SelectedDocuments[i].FilePath, PdfDocumentOpenMode.Import)) 
     { 
      for (var j = 0; j < document.PageCount; j++) 
      { 
       mergedDocument.AddPage(document.Pages[j]); 
      } 
     } 
    } 
    mergedDocument.Save(savePath); 
} 

Ein Beispiel wäre ich 10 PDF-Dokumente haben, die auf 178 Mb beträgt. Das zusammengeführte Dokument, das erstellt wird, ist auch etwa 178 Mb. Wenn der obige Code beendet wird, wird die Speicherbelegung bei 356 Mb gehalten. Wenn ich mehr Dokumente zusammenführe, steigt dieses Speicherleck und verursacht schließlich einen Absturz.

Ich habe versucht, mit Anweisungen zu entfernen und mit Dispose(), wenn ich das Dokument aus dem Speicher freigegeben werden wollte, aber es funktioniert nicht so gut.

Jede Hilfe wäre willkommen. Vielen Dank.

Edit:

Um genauer zu sein:

 var parentDirectory = Directory.GetParent(SelectedDocuments[0].FilePath); 
     var savePath = parentDirectory + "\\MergedDocument.pdf"; 

     using (var mergedDocument = new PdfDocument()) 
     { 
      for (var i = 0; i < SelectedDocuments.Count; i++) 
      { 
       using (var document = PdfReader.Open(SelectedDocuments[i].FilePath, PdfDocumentOpenMode.Import)) 
       { 
        for (var j = 0; j < document.PageCount; j++) 
        { 
         mergedDocument.AddPage(document.Pages[j]); 
        } 
       } 
      } 
      mergedDocument.Save(savePath); 
     } 

SelectedDocuments ist eine Liste, die eine Reihe von Dateipfaden zu den ausgewählten PDF-Dateien enthält.

+0

Bitte geben Sie eine MCVE: http://stackoverflow.com/help/mcve –

+0

Haben Sie LOH Verdichtung versucht? https://msdn.microsoft.com/en-us/library/system.runtime.gcsettings.largeobjectheapcompactionmode(v=vs.110).aspx –

+0

Haben Sie Ihre App profiliert, um zu sehen, was verhindert, dass der Speicher freigegeben wird? –

Antwort

1

Ich landete iTextSharp stattdessen mit dem folgenden Code unter Verwendung Speicherprobleme zu vermeiden:

var parentDirectory = Directory.GetParent(SelectedDocuments[0].FilePath); 
var savePath = parentDirectory + "\\MergedDocument.pdf"; 

using (var fs = new FileStream(savePath, FileMode.Create)) 
{ 
    using (var document = new Document()) 
    { 
     using (var pdfCopy = new PdfCopy(document, fs)) 
     { 
      document.Open(); 
      for (var i = 0; i < SelectedDocuments.Count; i++) 
      { 
       using (var pdfReader = new PdfReader(SelectedDocuments[i].FilePath)) 
       { 
        for (var page = 0; page < pdfReader.NumberOfPages;) 
        { 
         pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfReader, ++page)); 
        } 
       } 
      } 
     } 
    } 
}