none
C# .NetFramework Печать формы с кастомным размером бумаги RRS feed

  • Общие обсуждения

  • Приветствую, фрумчане!

    Сразу оговорюсь, что разработчиком не являюсь, так что просьба сдерживать ваш гнев праведный ;. Так или иначе понадобилось мне, для проверки некоторых нюансов работы ScrewDirevers, небольшая аппа могущая печать изображения на кастомного размера бумаге. Так как в годы лихой молодости интереcовался (совсем поверхностно) разработкой под .NetFramework, то решил для реализации использовать его, уж очень дружелюбен он к нубам. Взял пример с MSDN, слегка поправил и вот что получилось:

            public PrintDocument printDoc = new PrintDocument();
            .....
            private void PrintButton_Click(object sender, EventArgs e)
            {
                string FileName = "D:\\temp\\testprint.png";
                
                try
                {
                    if (string.IsNullOrWhiteSpace(FileName)) return; // Prevents execution of below statements if filename is not selected.
     
                    PrintDocument pd = new PrintDocument();
                    PaperSize paperSize = new PaperSize("TEST PAPER SIZE", 50, 50);
                    paperSize.RawKind = (int)PaperKind.Custom;
     
                    //Disable the printing document pop-up dialog shown during printing.
                    PrintController printController = new StandardPrintController();
                    pd.PrintController = printController;
     
                    //For testing only: Hardcoded set paper size to particular paper.
                    pd.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;
                    pd.DefaultPageSettings.PaperSize = paperSize;
     
                    pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
                    pd.PrinterSettings.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
     
                    pd.PrintPage += (sndr, args) =>
                    {
                        System.Drawing.Image i = System.Drawing.Image.FromFile(FileName);
                        args.Graphics.PageUnit = System.Drawing.GraphicsUnit.Millimeter;
     
                        //Adjust the size of the image to the page to print the full image without loosing any part of the image.
                        System.Drawing.Rectangle m = args.MarginBounds;
     
                        //Logic below maintains Aspect Ratio.
                        if ((double)i.Width / (double)i.Height > (double)m.Width / (double)m.Height) // image is wider
                        {
                            m.Height = (int)((double)i.Height / (double)i.Width * (double)m.Width);
                        }
                        else
                        {
                            m.Width = (int)((double)i.Width / (double)i.Height * (double)m.Height);
                        }
                        //Calculating optimal orientation.
                        pd.DefaultPageSettings.Landscape = m.Width > m.Height;
                        //Putting image in center of page.
                        m.Y = (int)((((System.Drawing.Printing.PrintDocument)(sndr)).DefaultPageSettings.PaperSize.Height - m.Height) / 2);
                        m.X = (int)((((System.Drawing.Printing.PrintDocument)(sndr)).DefaultPageSettings.PaperSize.Width - m.Width) / 2);
                        args.Graphics.DrawImage(i, m);
                    };
                    
                    pd.Print();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }


    Создаем печатный документ, добавляем ему нужный размер бумаги, устанавливает отступы, загружаем изображение, скейлим его в соответствии с размером бумаги, печатаем на дефолтном принтере. Печатается, картинка скейлится, но вот сам лис не меняет размер на заданный и печатается в А4. Гуглил долго и упорно, применил несколько рекомендаций, но воз и ныне там .

    Нужно чтобы размер листа менялся в соответствии со свойствами paperSize. Просьба помочь разобраться или ткнуть носом, где искать .

    Спасибо.