PDFSharp锁定Tiff文件

时间:2013-11-07 15:00:08

标签: c# pdfsharp

我正在使用PDFSharp将TIFF文件插入PDF。这个过程运行正常,但是它会锁定TIFF文件。 TIFF文件位于SMB共享上。我使用的是WPF版本,因为GDI版本不支持CMYK TIFF。

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();

1 个答案:

答案 0 :(得分:3)

使用WPF BitmapSource,没有确定性的基础流处理,因此只要有引用就可以最终得到锁。

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

如果您在XImage上调用dispose,它将在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关闭源,但这会导致整个图像被加载到内存中。