2013-11-07 1 views
0

Я вставляю файл TIFF в PDF, используя PDFSharp. Этот процесс работает нормально, но он оставляет блокировку в файле TIFF. Файл TIFF находится на SMB-ресурсе. Я использую версию WPF, потому что версия GDI не поддерживает CMYK TIFF.PDFSharp Locking Tiff Files

var output = new PdfDocument(); 
var input = PdfReader.Open(template_path, PdfDocumentOpenMode.Import); 

var page = input.Pages[0]; 
output.AddPage(page); 
page = output.Pages[0]; 

var gfx = XGraphics.FromPdfPage(page); 

var image = XImage.FromFile(tiff_path); 

gfx.DrawImage(image, 500, 200, 400, 400); 

output.Save(destination_path); 
output.Close(); 

Обновление: Простое выполнение этого оставляет TIFF заблокированным. Документ не открыт или XGraphics или что-либо еще.

using (var image = XImage.FromFile(path)) 
{} 

Обновление: Это работает, и с этим я и собираюсь сейчас.

using (var fsImage = File.Open(tiffPath, FileMode.Open, FileAccess.Read, FileShare.None)) 
{ 
    var bitmapSource = new BitmapImage(); 
    bitmapSource.BeginInit(); 
    bitmapSource.StreamSource = fsImage; 
    bitmapSource.EndInit(); 

    using (var image = XImage.FromBitmapSource(bitmapSource)) 
    { 

    } 
} 

Неприлично, этот противный кусок кода работает также :-)

using (var image = XImage.FromFile(tiffPath)) 
{ 

} 
GC.Collect(); 
+0

Я предполагаю, что ваш вопрос: «Как снять этот замок?» Одно из предложений заключалось бы в том, чтобы избавиться от изображения: оно может содержать блокировку файла. Итак, 'image.Dispose()', после того, как вы нарисовали его. –

+0

Я пробовал это, изображение все еще заблокировано. Пробовал выпустить выходной документ. – mxmissile

ответ

3

С WPF BitmapSource, нет детерминированной удаление основного потока, так что вы можете в конечном итоге с замками для до тех пор, так как есть ссылка.

You --> XImage --> BitmapSource --> Stream 

Если вы звоните выбрасывайте на XImage, он выпустит свою ссылку на BitmapSource, что позволит ему быть завершена, когда GC чувствует, как он.

Вы можете контролировать, когда файл закрыт, предоставляя поток вместо пути и закрывая его явно. Однако преждевременно вызывать исключения в BitmapSource, поэтому убедитесь, что вы не используете BitmapSource после закрытия потока.

using (var fsImage = File.Open(tiff_path, FileMode.Open, FileAccess.Read, FileShare.None)) 
{ 
    var output = new PdfDocument(); 
    var input = PdfReader.Open(template_path, PdfDocumentOpenMode.Import); 

    var page = input.Pages[0]; 
    output.AddPage(page); 
    page = output.Pages[0]; 

    var gfx = XGraphics.FromPdfPage(page); 

    var bitmapSource = new BitmapImage(); 
    bitmapSource.BeginInit(); 
    bitmapSource.StreamSource = fsImage; 
    bitmapSource.EndInit(); 
    using (var image = XImage.FromBitmapSource(bitmapSource)) 
    { 
     gfx.DrawImage(image, 500, 200, 400, 400); 
    } 

    output.Save(destination_path); 
    output.Close(); 
} 

Если изображение достаточно мало, вы можете пропустить поток и использовать только BitmapCacheOption из OnLoad, чтобы закрыть источник после открытия, но это приведет к тому, всему изображению будет загружено в память.

+0

'XImage.FromFile' не принимает параметр потока. Должно ли это? Перейдя к двойному проверке, я запускаю последнее. Я попытался обернуть «DrawImage» при использовании одной и той же проблемы. – mxmissile

+0

Прости, я пропустил это. Вместо этого вы можете использовать 'XImage (BitmapSource)', но вам придется открыть растровое изображение самостоятельно. См. Редактирование для кода. – Mitch

+0

Существует 'XImage.FromStream()' и есть 'XImage.FromBitmapSource()'. И 'XImage.FromFile()' можно вызывать с потоком, но помечается как устаревший. –