c # - Распечатать winform в высоком качестве? - PullRequest
0 голосов
/ 28 июня 2018

Этот вопрос может показаться знакомым, но я искал в интернете и не смог найти решение.

Я знаю, что для печати мы можем использовать Crystal Report , но я отказываюсь от этой идеи из-за ее определенных недостатков. Вот некоторые из недостатков: -

  • Требуется установка на ПК, и если Visual Studio версия 2017, то вам нужно загрузить 200MB + setup.
  • Если вы сделали определенные объекты, такие как текстовый объект и строки в одном разделе, и вам нужно что-то добавить в середине тогда вам нужно вручную установить местоположение каждого объекта, в противном случае, если вы все вместе выберете объект и переместите его, тогда их первоначальное местоположение и расстояние между каждым объектом будут потеряны.
  • В настоящее время я использую VS2008 , и в него встроен отчет Crystal, в котором имеется хорошо известная проблема изменения текста каждого текстового объекта и добавления "i. " в нем по какой-то причине.

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

Альтернатива, которую я выбираю

Теперь я разработал свой отчет в форме Windows. Когда я пытаюсь печатать, его качество хуже по сравнению с Crystal Reports . Вот код для этого

    private System.IO.Stream streamToPrint;
    string streamType;

    private void printDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
        System.Drawing.Image image = System.Drawing.Image.FromStream(this.streamToPrint);
        int x = e.MarginBounds.X;
        int y = e.MarginBounds.Y;
        int width = image.Width;
        int height = image.Height;
        if ((width / e.MarginBounds.Width) > (height / e.MarginBounds.Height))
        {
            width = e.MarginBounds.Width;
            height = image.Height * e.MarginBounds.Width / image.Width;
        }
        else
        {
            height = e.MarginBounds.Height;
            width = image.Width * e.MarginBounds.Height / image.Height;
        }
        System.Drawing.Rectangle destRect = new System.Drawing.Rectangle(x, y, width, height);
        e.Graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, System.Drawing.GraphicsUnit.Pixel);
    }

    private void btnPrint_Click(object sender, EventArgs e)
    {
        string fileName = Application.StartupPath + "\\PrintPage.jpg";
        using (Graphics gfx = this.CreateGraphics())
        {
            using (Bitmap bmp = new Bitmap(this.Width, this.Height, gfx))
            {
                this.DrawToBitmap(bmp, new Rectangle(0, 0, this.Width, this.Height));
                bmp.Save(fileName);
            }
        }
        FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        StartPrint(fileStream, "Image");
        fileStream.Close();
        if (System.IO.File.Exists(fileName))
        {
            System.IO.File.Delete(fileName);
        }
    }

    public void StartPrint(Stream streamToPrint, string streamType)
    {
        this.printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
        this.streamToPrint = streamToPrint;
        this.streamType = streamType;
        System.Windows.Forms.PrintDialog PrintDialog1 = new PrintDialog();
        PrintDialog1.AllowSomePages = true;
        PrintDialog1.ShowHelp = true;
        PrintDialog1.Document = printDoc;
        DialogResult result = PrintDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            printDoc.Print();
            //docToPrint.Print();
        }
    }

    private void Frm_Test_Shown(object sender, EventArgs e)
    {
        try
        {
            btnPrint_Click(sender, e);
        }
        catch (Exception ex) { clsUtility.ShowErrMsg(ex.Message); }
    }

Я понимаю причину, по которой это происходит из-за изображения и разрешения экрана (ссылка: https://stackoverflow.com/a/12547806/2994869).. Упомянутые люди обходились в том, чтобы увеличить размер формы окна и его объекта в 6 раз, но это тот же результат, но качество еще хуже.

Есть ли какой-нибудь обходной путь или какой-либо трюк, который я могу сделать, чтобы напечатать форму окна, чтобы качество было близко к качеству Crystal Report.

1 Ответ

0 голосов
/ 02 июля 2018

Для высокого качества вам нужно создать источник с более высоким разрешением, чем экран, и это все, что вы можете получить от DrawToBitmap.

Использование DrawToBitmap поможет только в том случае, если вы сможете значительно увеличить один элемент управления. Для всей формы это не поможет.

Вам потребуется полностью заново создать детали, которые вы хотите распечатать, и использовать столько DrawString и других DrawXXX методов, сколько необходимо. Да, много работы. (Но весело ;-)

Но код, который вы показываете, также ошибается при использовании формата файла jpg, который был создан для мягких изображений (то есть фотографий). Измените это на png и сравните!

...