Отправка файла EMF на конкретный принтер / лоток в приложении WPF

У меня есть приложение WPF, которому необходимо отправлять предварительно сгенерированные файлы EMF на указанный принтер / лоток.

Я не хочу показывать PrintDialog; фактический принтер / лоток настраивается заранее. Мне также не нужно просматривать файл EMF; а лучше просто отправить на принтер.

Пока что все мои исследования и разработки в этом направлении привели к кучке сообщений пятилетней давности, посвященных EMF и WPF и тому, как они не поддерживаются.

Кому-нибудь раньше везло с этим? Может ли кто-нибудь указать мне правильное направление?


person Jim B    schedule 10.04.2012    source источник


Ответы (1)


Оказалось, это было проще, чем я думал. Вы можете сделать это с помощью элемента управления Image и использования преобразователя. В этом примере используется расположение файла emf и помещается в пользовательский элемент управления WPF, который я затем отправляю на принтер.

В XAML:

<Grid Margin="12">
    <Image Source="{Binding Path=FileName, Converter={StaticResource emfImageConverter}, Mode=OneWay}"></Image>
</Grid>

и ваш класс конвертера:

[ValueConversion(typeof(string), typeof(BitmapImage))]
public class EmfImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var fileName = (string)value;
        if (fileName == null || !File.Exists(fileName))
            return new BitmapImage();
        using (var stream = File.Open(fileName, FileMode.Open))
        {
            return GetImage(stream);
        }
    }

    internal BitmapImage GetImage(Stream fileStream)
    {
        var img = Image.FromStream(fileStream);
        var imgBrush = new BitmapImage { CacheOption = BitmapCacheOption.OnLoad, CreateOptions = BitmapCreateOptions.PreservePixelFormat };
        imgBrush.BeginInit();
        imgBrush.StreamSource = ConvertImageToMemoryStream(img);
        imgBrush.EndInit();
        return imgBrush;
    }

    public MemoryStream ConvertImageToMemoryStream(Image img)
    {
        var ms = new MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        return ms;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
person Jim B    schedule 29.06.2012