Pregunta

Estoy insertando un archivo TIFF en un PDF usando Pdfsharp. Ese proceso funciona bien, pero está dejando un bloqueo en el archivo TIFF. El archivo TIFF está en un SMB Share. Estoy usando la versión WPF porque la versión GDI no admite CMYK TIFFS.

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

ACTUALIZACIÓN: Simplemente hacer esto deja el TIFF bloqueado. No se abre ningún documento o Xgraphics ni nada.

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

ACTUALIZACIÓN: Esto funciona, y es con lo que voy por ahora.

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))
    {

    }
}

Indecentemente, este desagradable pieza de código también funciona :-)

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

}
GC.Collect();
¿Fue útil?

Solución

Con WPF BitmapSource, no hay una eliminación determinista de la corriente subyacente, por lo que puede terminar con cerraduras mientras haya una referencia.

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

Si llamas deseche en el XImage, lanzará su referencia en el BitmapSource, que permitirá que se finalice cuando el GC se sienta así.

Puede controlar cuándo el archivo está cerrado proporcionando transmisión en lugar de una ruta y cerrándolo explícitamente. Hacerlo prematuramente causará excepciones en BitmapSource, sin embargo, así que asegúrese de no estar usando el BitmapSource Después de cerrar la corriente.

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

Si su imagen es lo suficientemente pequeña, puede omitir la transmisión y simplemente usar el BitmapCacheOption de OnLoad Para cerrar la fuente después de la apertura, pero esto hará que toda la imagen se cargue en la memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top