将错误的纸张尺寸发送到打印机

时间:2019-07-12 21:18:44

标签: c# .net wpf

我们已经启动了一个打印项目,但是在告诉打印机选择哪种纸张尺寸时,我们完全陷入了僵局。

每次选择纸张尺寸并进行打印时,打印机预览每次都会显示A4,而不是我们选择的尺寸,尽管如果打开打印首选项会选择正确的尺寸。

namespace CPrint
{
    /// <summary>
    /// Логика взаимодействия для ucPrint.xaml
    /// </summary>
    public partial class ucPrint : UserControl
    {
        bool SystemChange = false;
        double? PaperHeight = null;
        double? PaperWidth = null;
        public ucPrint()
        {
            InitializeComponent();
            App.Localization.AddControls(this, new string[]
             {
                    "cHeader", "lPrinter", "lCopies","lLayout", "bPrintSettings","lColorManagement","lPrinterProfile", "lPositionSize", "cCenter", "lTop", "lLeft"
             });
        }

        public static BitmapSource ConvertColorProfile(BitmapSource bitmapSource, ColorContext sourceProfile, ColorContext destinationProfile)
        {
            var bitmapConverted = new ColorConvertedBitmap();
            bitmapConverted.BeginInit();
            bitmapConverted.Source = bitmapSource;
            //bitmapConverted.SourceColorContext = new ColorContext(PixelFormats.Pbgra32);//  bitmapSourceFrame.ColorContexts == null ? sourceProfile : bitmapSourceFrame.ColorContexts[0];
            bitmapConverted.SourceColorContext = sourceProfile;
            bitmapConverted.DestinationColorContext = destinationProfile;
            bitmapConverted.DestinationFormat = PixelFormats.Bgra32;
            bitmapConverted.EndInit();
            return bitmapConverted;
        }

        private void BPrint_Click(object sender, RoutedEventArgs e)
        {
            if (cPrinter.SelectedItem == null) { MessageBox.Show("Printer not set"); return; }
            if (cPaperSize.SelectedItem == null) { MessageBox.Show("Paper size not set"); return; }


            double marging = 30;

            if (App.CurrentTemplateControl != null)
            {
                var img = App.CurrentTemplateControl.GetImage(true);
                if (img == null) return;
                var image = new Image() { Source = img };

                if (cColorProfile != null && cColorProfile.SelectedItem != null && cColorProfile.SelectedIndex > 0)
                {
                    Uri sourceProfileUri = new Uri((cColorProfile.SelectedItem as FileInfo).FullName);
                    image.Source = ConvertColorProfile(image.Source as BitmapSource, new ColorContext(PixelFormats.Pbgra32), new ColorContext(sourceProfileUri));
                }

                if (cMirror.IsChecked == true)
                {
                    var transformGroup = new TransformGroup();
                    transformGroup.Children.Add(new ScaleTransform(-1, 1, img.Width / 2, img.Height / 2));
                    image.RenderTransform = transformGroup;
                }
                PrintDialog printDialog2 = new PrintDialog();
                Size size = (Size)(cPaperSize.SelectedItem as ComboBoxItem).DataContext;
                printDialog2.PrintQueue = new PrintQueue(new PrintServer(), cPrinter.Text);


                //if (printDialog2.ShowDialog() == true)
                //{
                //Size size = new Size(printDialog2.PrintableAreaWidth, printDialog2.PrintableAreaHeight);

                printDialog2.PrintTicket = new PrintTicket()
                {
                    PageMediaSize = new PageMediaSize(size.Width, size.Height)
                };
                //printDialog2.PrintTicket
                Canvas canvas = new Canvas()
                {
                    //Height = PrintContext.ToPx(size.Height),
                    //Width = PrintContext.ToPx(size.Width),
                    Height = size.Height,
                    Width = size.Width,
                    Background = Brushes.White
                };
                canvas.Children.Add(image);

                double scaleW = (size.Width - marging * 2) / img.Width;
                double scaleH = (size.Height - marging * 2) / img.Height;
                if (scaleW < 1 || scaleH < 1)
                {
                    Canvas.SetLeft(image, marging);
                    Canvas.SetTop(image, marging);
                    double scale = scaleW > scaleH ? scaleH : scaleW;
                    var transformGroup = new TransformGroup();
                    transformGroup.Children.Add(new ScaleTransform(scale, scale, 0, 0));
                    image.RenderTransform = transformGroup;
                }
                else if (cCenter.IsChecked == true)
                {
                    Canvas.SetLeft(image, size.Width / 2 - img.Width / 2);
                    Canvas.SetTop(image, size.Height / 2 - img.Height / 2);
                }
                else
                {
                    Canvas.SetLeft(image, marging);
                    Canvas.SetTop(image, marging);
                }
                printDialog2.PrintVisual(canvas, "Print");
                //}
            }


            return;

        }

        private void CPrinter_DropDownOpened(object sender, EventArgs e)
        {
            SystemChange = true;
            var lastPrinterName = cPrinter.Text;
            cPrinter.Items.Clear();
            int index = -1;
            cPrinter.SelectedIndex = index;
            foreach (string strPrinter in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            {
                index++;
                cPrinter.Items.Add(strPrinter);
                if (strPrinter == lastPrinterName)
                    cPrinter.SelectedIndex = index;
            }
            SystemChange = false;
        }

        private void CPrinter_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0 && SystemChange == false)
            {
                var printer = new System.Drawing.Printing.PrinterSettings();
                printer.PrinterName = e.AddedItems[0].ToString();
                var lastPaperName = cPaperSize.Text;
                cPaperSize.Items.Clear();
                int index = -1;
                cPaperSize.SelectedIndex = index;
                foreach (System.Drawing.Printing.PaperSize paper in printer.PaperSizes)
                {
                    index++;
                    cPaperSize.Items.Add(new ComboBoxItem() { Content = paper.PaperName, DataContext = new Size(paper.Width, paper.Height) });
                    if (paper.PaperName == lastPaperName)
                        cPaperSize.SelectedIndex = index;
                }
                Properties.Settings.Default.DefaultDirectPrinter = printer.PrinterName;
                Properties.Settings.Default.Save();
            }
        }

        private void CPaperSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0)
            {
                Properties.Settings.Default.DefaultDirectPaper = ((ComboBoxItem)e.AddedItems[0]).Content.ToString();
                Properties.Settings.Default.Save();
            }
        }

        public void UpdateControls()
        {
            SystemChange = true;

            if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectPrinter))
            {
                SystemChange = true;
                var lastPrinterName = cPrinter.Text;
                cPrinter.Items.Clear();
                int index = -1;
                cPrinter.SelectedIndex = index;
                foreach (string strPrinter in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                {
                    index++;
                    cPrinter.Items.Add(strPrinter);
                    if (strPrinter == Properties.Settings.Default.DefaultDirectPrinter)
                        cPrinter.SelectedIndex = index;
                }
                SystemChange = false;

                if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectPaper))
                {
                    var printer = new System.Drawing.Printing.PrinterSettings();
                    printer.PrinterName = Properties.Settings.Default.DefaultDirectPrinter;
                    string lastPaperName = Properties.Settings.Default.DefaultDirectPaper;
                    cPaperSize.Items.Clear();
                    int indexP = -1;
                    cPaperSize.SelectedIndex = indexP;
                    foreach (System.Drawing.Printing.PaperSize paper in printer.PaperSizes)
                    {
                        indexP++;
                        cPaperSize.Items.Add(new ComboBoxItem() { Content = paper.PaperName, DataContext = new Size(paper.Width, paper.Height) });
                        if (paper.PaperName == lastPaperName)
                            cPaperSize.SelectedIndex = indexP;
                    }
                }
            }

            if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectColorProfile))
            {
                var lastValue = Properties.Settings.Default.DefaultDirectColorProfile;
                cColorProfile.Items.Clear();
                int index = -1;
                cColorProfile.SelectedIndex = index;
                cColorProfile.Items.Add("");
                index++;
                foreach (var file in App.Icc.items)
                {
                    index++;
                    cColorProfile.Items.Add(file);
                    if (file.FullName == lastValue)
                        cColorProfile.SelectedIndex = index;
                }
            }
            SystemChange = false;
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void CColorProfile_DropDownOpened(object sender, EventArgs e)
        {
            var lastValue = cColorProfile.Text;
            cColorProfile.Items.Clear();
            int index = -1;
            cColorProfile.SelectedIndex = index;
            cColorProfile.Items.Add("");
            index++;
            foreach (var file in App.Icc.items)
            {
                index++;
                cColorProfile.Items.Add(file);
                if (file.Name == lastValue)
                    cColorProfile.SelectedIndex = index;
            }
        }

        private void CColorProfile_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (!SystemChange)
            {
                Properties.Settings.Default.DefaultDirectColorProfile = (cColorProfile.SelectedItem as FileInfo)?.FullName;
                Properties.Settings.Default.Save();
            }
        }
    }
}

我希望如果我们选择A5,它会告诉打印驱动程序打印A5,

如果我们选择自定义的“用户定义”纸张尺寸,它将告诉打印机选择了哪种尺寸。而不是每次都将其固定在A4上

我们似乎无法在打印对话框之外设置纸张尺寸。

2 个答案:

答案 0 :(得分:0)

我相信;在thisthis MSDN文章之后;您将要按照以下方式做一些事情:

System.Drawing.Printing.PaperSize paperSize = new System.Drawing.Printing.PaperSize("custom", width, height);
PrintDocument printDoc = new PrintDocument();
printDoc.DefaultPageSettings.PaperSize = paperSize;

答案 1 :(得分:0)

我已经遍历了您的代码,

我认为前端(XAML)在特定用例上会引发一些事件,该事件是“ Properties.Settings.Default”中的实际值的替代。

如果您为此问题提供XAML代码,则最好解决。

我可以研究一下,并将为您提供更好的解决方案。

您可以在此处分享我的代码,这是我的skype:shsakariya