1

我有一个 WPF 应用程序,它需要将预先生成的 EMF 文件发送到指定的打印机/托盘。

我不想显示 PrintDialog;实际的打印机/托盘是事先配置好的。我也不需要实际查看 EMF 文件。而是将其发送到打印机。

到目前为止,我在这方面的所有研发都导致了一堆 5 年前的帖子,这些帖子涉及 EMF 和 WPF 以及它是如何不受支持的。

有没有人有过这方面的运气?有人可以指出我正确的方向吗?

4

1 回答 1

0

事实证明这比我想象的要容易。您可以通过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();
    }
}
于 2012-06-29T19:41:31.447 回答