У меня есть следующий код, чтобы сгенерировать отчет в формате 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, поэтому я не могу использовать используемый блок.
Как я могу освободить блокировку файла?
Вы сначала попытались сделать Google? «BitmapCacheOption.OnLoad» считается решением [здесь] (http://forum.pdfsharp.net/viewtopic.php?f=3&t=1832) (FYI: я не знаю, что такое Migradoc). – Sinatr
Я глубоко разобрался, да. MigraDoc - это библиотека, которая (я считаю) работает с PDFSharp для создания PDF-файлов. Я овладел этим, используя менеджер пакетов nuget, поэтому я не думаю, что могу погрузиться в источник, чтобы изменить любые конструкторы. Изменения в кэшировании Bitmap не помогают, потому что я не контролирую Bitmap, функция AddImage() принимает только путь к изображению, поэтому то, что происходит внутри этой функции, для меня в настоящий момент является черным ящиком. –