Search code examples
c#multilinemultilinestring

Printing long strings in C# with Graphics.DrawString


Good morning. I have to print some long strings that falls off the margins of my page. I'm not able to split automatically as a multi-line string.

private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
  ...
  string line ="Condimentum a a ac aenean parturient risus suscipit et orci scelerisque convallis porttitor enim venenatis viverra.Egestas nibh natoque mus etiam a parturient feugiat hendrerit a sagittis viverra dui ante varius lectus arcu."
  float leftMargin = ev.MarginBounds.Left;
  float topMargin = ev.MarginBounds.Top;    
  ev.Graphics.DrawString(line, printFont, Brushes.Black, new RectangleF(leftMargin, yPos, 400.0f, 200.0f));
  ...
}

I tried using the overload with the bounding box specification, as you can see, but the result is a jam of chars on the page, because the lines from the long string is printed over itself.

Is there a quick way to solve this problem?

Thanks


Solution

  • SOLVED I finally solved my problem. It's not so easy to explain how, so I post here a piece of code that shows what I did:

    private void pd_PrintPage(object sender, PrintPageEventArgs ev)
        {
            float linesPerPage = 0;
            int count = 0;
            float leftMargin = ev.MarginBounds.Left;
            float topMargin = ev.MarginBounds.Top;
            float printAreaHeight = ev.MarginBounds.Height;
            float printAreaWidth = ev.MarginBounds.Width;
            string line = null;
            float yPos = topMargin;
    
            int charactersFitted = 0;
            int linesFilled = 0;
            SizeF theSize = new SizeF();
            Font printFont = new Font("Arial", 12, FontStyle.Regular);
    
            SizeF layoutSize = new SizeF(printAreaWidth, printAreaHeight);
    
            // Calculate the number of lines per page.
            linesPerPage = printAreaHeight / printFont.GetHeight(ev.Graphics);
    
            // Print each line of the array.
            while (count < linesPerPage && lineIdx < linesArray.Count())
            {
                line = linesArray[lineIdx++];
                theSize = ev.Graphics.MeasureString(line, printFont, layoutSize, new StringFormat(), out charactersFitted, out linesFilled);
                ev.Graphics.DrawString(line, printFont, Brushes.Black, new RectangleF(50.0F, yPos, theSize.Width, theSize.Height));
                yPos += (1 + linesFilled) * printFont.GetHeight(ev.Graphics);
                count += linesFilled + 1;
             }
    
             // If more lines exist, print another page.
             if (count > linesPerPage)
                ev.HasMorePages = true;
             else
                ev.HasMorePages = false;
        }