Reputation: 379
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
Upvotes: 0
Views: 1147
Reputation: 379
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;
}
Upvotes: 2