Печать графики на нескольких страницах с использованием System.Drawing.Printing на основе используемых координат в C # - PullRequest
3 голосов
/ 01 июня 2011

Используя System.Drawing.Printing, я хочу напечатать набор строк в печатном документе. Но проблема в том, что он печатает каждую строку на самой первой странице, какими бы ни были координаты, даже если я рисую изображение, Он печатает это на одной странице, независимо от ее размера.

Вот что я сделал для печати текста на нескольких страницах:

protected void ThePrintDocument_PrintPage (object sender, System.Drawing.Printing.PrintPageEventArgs ev)
{
  float linesPerPage = 0;
  float yPosition = 0;
  int count = 0;
  float leftMargin = ev.MarginBounds.Left;
  float topMargin = ev.MarginBounds.Top;
  string line = null;
  Font printFont = this.richTextBox1.Font;
  SolidBrush myBrush = new SolidBrush(Color.Black);

  // Work out the number of lines per page, using the MarginBounds.
  linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics);

  // Iterate over the string using the StringReader, printing each line.
  while(count < linesPerPage && ((line=myReader.ReadLine()) != null)) 
  {
    // calculate the next line position based on 
    // the height of the font according to the printing device
    yPosition = topMargin + (count * printFont.GetHeight(ev.Graphics));

    // draw the next line in the rich edit control

    ev.Graphics.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
    count++;
  }

  // If there are more lines, print another page.
  if(line != null)
    ev.HasMorePages = true;
  else
    ev.HasMorePages = false;

  myBrush.Dispose();

}

Что я должен сделать, чтобы напечатать строку на нескольких страницах, то есть следующий код должен напечатать на двух страницах, поскольку длина строки составляет 1400, а длина документа печати - 1100, поэтому оставшиеся 300 строки должны быть напечатаны на следующая страница

protected void ThePrintDocument_PrintPage (object sender, System.Drawing.Printing.PrintPageEventArgs ev)
{
    Pen P1 = new Pen(Brushes.Violet, 5);
    ev.Graphics.DrawLine(P1, new Point(0,0), new Point(500,1400));
}

1 Ответ

1 голос
/ 01 июня 2011

Это не то, как печать работает в .NET. Он не создает новую страницу только потому, что вы печатаете вне координат текущей страницы. Существуют события и аргументы событий, которые .NET использует, чтобы спросить у вас, сколько страниц будет содержать ваш документ. Затем он вызовет событие для печати страницы для каждой страницы .

См. здесь для примера.

EDIT
Хорошо, отвечая на ваш комментарий, я могу подумать о двух возможных решениях: Первое решение будет включать обрезку: пересекайте графические объекты с прямоугольником страницы и печатайте только то, что является общим для них обоих. Если за пределами области отсечения были части, возьмите эту часть в качестве новых графических объектов и снова обрежьте для печати на новой странице. Повторяйте это до тех пор, пока оставшаяся графика не уместится на прямоугольнике страницы. Однако я не могу придумать способ сделать это легко.

Моя вторая идея заключается в следующем:

  1. Подсчитайте, сколько страниц потребуется для печати всех графических объектов, разделив ограничивающий прямоугольник графических объектов на высоту «визуального прямоугольника» одной страницы (увеличьте количество страниц на одну, если в этом разделе есть остаток ).
  2. Повторяйте цикл до последней страницы
    • Печать всех графических объектов на текущей странице
    • Уменьшить все y-координаты на «визуальную высоту» страницы (эффективно перемещая графические объекты вверх за пределы «границ бумаги»)

Несмотря на то, что накладные расходы на печать всего списка графических объектов для каждой страницы могут быть высокими, вы оставляете часть отсечения для драйвера принтера / самого принтера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...