我正在使用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();
答案 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
关闭源,但这会导致整个图像被加载到内存中。