Question

J'inserte un fichier TIFF dans un PDF en utilisant Pdfsharp. Ce processus fonctionne bien, mais il laisse un verrou sur le fichier TIFF. Le fichier TIFF est sur une part SMB. J'utilise la version WPF car la version GDI ne prend pas en charge les TIFF CMYK.

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

MISE À JOUR: Le simple fait de faire cela laisse le TIFF verrouillé. Aucun document ouvert ou xgraphics ou quoi que ce soit.

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

MISE À JOUR: Cela fonctionne, et c'est ce que je vais pour l'instant.

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

    }
}

Indécemment, ce méchant morceau de code fonctionne aussi :-)

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

}
GC.Collect();
Était-ce utile?

La solution

Avec WPF BitmapSource, il n'y a pas d'élimination déterministe du flux sous-jacent, vous pouvez donc vous retrouver avec des serrures aussi longtemps qu'il y a une référence.

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

Si vous appelez disposer sur le XImage, il libérera sa référence sur le BitmapSource, ce qui permettra de finaliser quand le GC l'a envie.

Vous pouvez contrôler lorsque le fichier est fermé en fournissant un flux au lieu d'un chemin et en le fermant explicitement. Le faire prématurément provoquera des exceptions dans BitmapSource, Cependant, assurez-vous donc que vous n'utilisez pas le BitmapSource Après avoir fermé le flux.

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 votre image est suffisamment petite, vous pouvez sauter le flux et simplement utiliser le BitmapCacheOption de OnLoad Pour fermer la source après l'ouverture, mais cela entraînera la charge de l'image entière dans la mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top