//-------------------------------------------------------- public static void PrintText(TextBox textIn, IntPtr hdc) { // Split input data into separate lines of text. char [] achNewLine = new char[] { '\n' }; String [] astrSplit; astrSplit = textIn.Text.Split(achNewLine); // Calculate longest string in the document int cchMax = 0; int cstr = astrSplit.Length; for (int i = 0; i < cstr; i++) { if (astrSplit[i].Length > cchMax) { cchMax = astrSplit[i].Length; } } // Allocate conversion buffers. byte[] byteData = new Byte[cchMax]; char[] chData = new Char[cchMax]; System.Text.Encoder d; d = System.Text.Encoding.UTF8.GetEncoder(); // Get device resolution int cxyInch = GdiGraphics.GetDeviceCaps(hdc, CAPS.LOGPIXELSY); // In draft mode, the PCL driver returns wrong value. if (cxyInch == 0) { cxyInch = 150; } // Calculate page size. int cxPhysPage = GdiGraphics.GetDeviceCaps(hdc, CAPS.PHYSICALWIDTH); int cyPhysPage = GdiGraphics.GetDeviceCaps(hdc, CAPS.PHYSICALHEIGHT); int cxOff = GdiGraphics.GetDeviceCaps(hdc, CAPS.PHYSICALOFFSETX); int cyOff = GdiGraphics.GetDeviceCaps(hdc, CAPS.PHYSICALOFFSETY); // Calculate line height. TEXTMETRIC tm = new TEXTMETRIC(); GdiFont.GetTextMetrics(hdc, ref tm); int cyLineHeight = tm.tmHeight + tm.tmExternalLeading; // Init text drawing coordinates; int xText = cxyInch - cxOff; int yText = cxyInch - cyOff; // Calculate page boundaries int yFirst = yText; int yLast = cyPhysPage - cxyInch; // Notify GDI of document and page start. DOCINFO di = new DOCINFO(); di.cbSize = Marshal.SizeOf(di); Printing.StartDoc(hdc, ref di); Printing.StartPage(hdc); try { // Set iEnd -- trim extra carriage-return from text int iEnd = 0; int cchString = astrSplit[0].Length; char ch = astrSplit[0][cchString - 1]; if (ch == '\r') { iEnd = -1; } // Loop through list of strings. for (int i = 0; i < cstr; i++) { cchString = astrSplit[i].Length; if (cchString > 0) { // Draw line of text. GdiGraphics.ExtTextOut(hdc, xText, yText, 0, IntPtr.Zero, astrSplit[i], cchString + iEnd, IntPtr.Zero); } // Advance to next line. yText += cyLineHeight; // Skip to next page (if not at document end) if (yText >= yLast && (i + 1) < cstr) { Printing.EndPage(hdc); Printing.StartPage(hdc); yText = yFirst; } } } finally { // End of page & end of document. Printing.EndPage(hdc); Printing.EndDoc(hdc); } } // PrintText()