2014-11-05 2 views
2

У меня есть следующий код, чтобы сгенерировать отчет в формате PDF, загрузите его, а затем удалить временный файл, используемый в генерировании:Release на файл изображения после использования section.AddImage() в MigraDoc-WPF

// Generate document and then add a section with an image 
var document = new Document {Info = {Title = "Results"}}; 
var section = document.AddSection(); 
var logo = section.AddImage(logoPath); 

// Render the PDF 
const PdfFontEmbedding embedding = PdfFontEmbedding.Always; 
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(unicode, embedding); 
pdfRenderer.Document = document; 
pdfRenderer.RenderDocument(); // This is the line which locks the files 

// Save the PDF to a memory stream and upload it to azure blob storage 
var reportPath = ""; 
using (var stream = new MemoryStream()) 
{ 
    pdfRenderer.Save(stream, false); 
    reportPath = UploadBlob("reports", "Report.pdf", stream); 
} 

// Delete the local copy of the logo - this is where the exception occurs 
Directory.Delete(Directory.GetParent(logoPath).ToString(), true); 

При попытке удалить каталог изображения, следующее исключение сгенерировано:

An exception of type 'System.IO.IOException' occurred in mscorlib.dll but was not handled in user code 

Additional information: The process cannot access the file 'Capture.PNG' because it is being used by another process. 

Я отлажена через код, чтобы убедиться, что файл доступен до вызова pdfRenderer.RenderDocument(), как было отмечено в комментариях кода.

Для класса PdfDocumentRenderer нет методов закрытия или удаления, и он не реализует IDisposable, поэтому я не могу использовать используемый блок.

Как я могу освободить блокировку файла?

+0

Вы сначала попытались сделать Google? «BitmapCacheOption.OnLoad» считается решением [здесь] (http://forum.pdfsharp.net/viewtopic.php?f=3&t=1832) (FYI: я не знаю, что такое Migradoc). – Sinatr

+0

Я глубоко разобрался, да. MigraDoc - это библиотека, которая (я считаю) работает с PDFSharp для создания PDF-файлов. Я овладел этим, используя менеджер пакетов nuget, поэтому я не думаю, что могу погрузиться в источник, чтобы изменить любые конструкторы. Изменения в кэшировании Bitmap не помогают, потому что я не контролирую Bitmap, функция AddImage() принимает только путь к изображению, поэтому то, что происходит внутри этой функции, для меня в настоящий момент является черным ящиком. –

ответ

0

Попробуйте использовать пакет «PDFsharp-MigraDoc-GDI» вместо пакета «PDFsharp-MigraDoc-WPF».

BTW: вы можете загрузить полный источник, если хотите внести изменения в «черный ящик».
http://pdfsharp.codeplex.com/releases

+0

Я не могу использовать пакет GDI, поскольку мое приложение работает в облаке Azure, и я получаю следующую ошибку: «Внутренняя ошибка. Данные шрифта не могут быть получены». Похоже, мое единственное решение - внести свои изменения в источник? Почему это не было исправлено в версии GDI, если это простое изменение? –

+0

@Starky: Это не проблема сборки GDI, это проблема WPF. Мы еще не опубликовали сборку WPF на Nuget, но в настоящее время мы планируем выпустить ее там в конце этого года - и исправление будет включено. Для быстрого исправления внесите изменения самостоятельно. –

4

Я установил "файл блокировки BitmapImage" ошибка изменяющее PdfSharp.Drawing \ XImage.cs следующим образом: замещающего линии 114:

this.wpfImage = new BitmapImage(new Uri(path)); // AGHACK 

с

BitmapImage imgTemp = new BitmapImage(); 
    imgTemp.BeginInit(); 
    imgTemp.CacheOption = BitmapCacheOption.OnLoad; 
    imgTemp.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
    imgTemp.UriSource = new Uri(path); 
    imgTemp.EndInit(); 
    this.wpfImage = imgTemp; 

Он работал меня.

+0

спасибо большое, это действительно спасло меня! –