0

我正在使用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();
4

1 回答 1

3

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

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

如果你在 上调用 dispose 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();
}

如果您的图像足够小,您可以跳过流并在打开后使用BitmapCacheOptionofOnLoad关闭源,但这会导致整个图像加载到内存中。

于 2013-11-07T15:19:20.427 回答