TestAPI
CoreMVVM
XamlPadX
Xaml Compliance
Recently, Praj blogged about printing content of a RichTextBox. Normally, if you use the documentPaginator or the visual, you might end up with some text clipped. Not a nice thing to happenJ. One thing that bugs me while printing is the print dialog. Often times, I just want to use a printer that’s not busy. Just don’t make me wait. It’s pretty simple to code and its worth it. No more waiting at the printer. ;)
foreach (PrintQueue pq in GetPrintQueues("\\\\servername")) { if (!pq.IsBusy) { Print(pq); return; } } private IEnumerable<PrintQueue> GetPrintQueues(string servername) { PrintServer ps; if (string.IsNullOrEmpty(servername)) { // local printer name ps = new LocalPrintServer(); } else { // network printer share ps = new PrintServer(servername); } return ps.GetPrintQueues(); } void Print(PrintQueue pq) { TextRange sourceDocument = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd); MemoryStream stream = new MemoryStream(); sourceDocument.Save(stream, DataFormats.Xaml); // Clone the source document's content into a new FlowDocument. FlowDocument flowDocumentCopy = new FlowDocument(); TextRange copyDocumentRange = new TextRange(flowDocumentCopy.ContentStart, flowDocumentCopy.ContentEnd); copyDocumentRange.Load(stream, DataFormats.Xaml); // Create a XpsDocumentWriter object, open a Windows common print dialog. // This methods returns a ref parameter that represents information about the dimensions of the printer media. XpsDocumentWriter docWriter = PrintQueue.CreateXpsDocumentWriter(pq); PageImageableArea ia = pq.GetPrintCapabilities().PageImageableArea; PrintTicket pt = pq.UserPrintTicket; if (docWriter != null && ia != null) { DocumentPaginator paginator = ((IDocumentPaginatorSource)flowDocumentCopy).DocumentPaginator; // Change the PageSize and PagePadding for the document to match the CanvasSize for the printer device. paginator.PageSize = new Size((double)pt.PageMediaSize.Width, (double)pt.PageMediaSize.Height); Thickness pagePadding = flowDocumentCopy.PagePadding; flowDocumentCopy.PagePadding = new Thickness( Math.Max(ia.OriginWidth, pagePadding.Left), Math.Max(ia.OriginHeight, pagePadding.Top), Math.Max((double)pt.PageMediaSize.Width - (double)(ia.OriginWidth + ia.ExtentWidth), pagePadding.Right), Math.Max((double)pt.PageMediaSize.Height - (double)(ia.OriginHeight + ia.ExtentHeight), pagePadding.Bottom)); flowDocumentCopy.ColumnWidth = double.PositiveInfinity; // Send DocumentPaginator to the printer. docWriter.Write(paginator); } }
{
if (!pq.IsBusy)
Print(pq);
return;
}
private IEnumerable<PrintQueue> GetPrintQueues(string servername)
PrintServer ps;
if (string.IsNullOrEmpty(servername))
// local printer name
ps = new LocalPrintServer();
else
// network printer share
ps = new PrintServer(servername);
return ps.GetPrintQueues();
void Print(PrintQueue pq)
TextRange sourceDocument = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
MemoryStream stream = new MemoryStream();
sourceDocument.Save(stream, DataFormats.Xaml);
// Clone the source document's content into a new FlowDocument.
FlowDocument flowDocumentCopy = new FlowDocument();
TextRange copyDocumentRange = new TextRange(flowDocumentCopy.ContentStart, flowDocumentCopy.ContentEnd);
copyDocumentRange.Load(stream, DataFormats.Xaml);
// Create a XpsDocumentWriter object, open a Windows common print dialog.
// This methods returns a ref parameter that represents information about the dimensions of the printer media.
XpsDocumentWriter docWriter = PrintQueue.CreateXpsDocumentWriter(pq);
PageImageableArea ia = pq.GetPrintCapabilities().PageImageableArea;
PrintTicket pt = pq.UserPrintTicket;
if (docWriter != null && ia != null)
DocumentPaginator paginator = ((IDocumentPaginatorSource)flowDocumentCopy).DocumentPaginator;
// Change the PageSize and PagePadding for the document to match the CanvasSize for the printer device.
paginator.PageSize = new Size((double)pt.PageMediaSize.Width, (double)pt.PageMediaSize.Height);
Thickness pagePadding = flowDocumentCopy.PagePadding;
flowDocumentCopy.PagePadding = new Thickness(
Math.Max(ia.OriginWidth, pagePadding.Left),
Math.Max(ia.OriginHeight, pagePadding.Top),
Math.Max((double)pt.PageMediaSize.Width - (double)(ia.OriginWidth + ia.ExtentWidth), pagePadding.Right),
Math.Max((double)pt.PageMediaSize.Height - (double)(ia.OriginHeight + ia.ExtentHeight), pagePadding.Bottom));
flowDocumentCopy.ColumnWidth = double.PositiveInfinity;
// Send DocumentPaginator to the printer.
docWriter.Write(paginator);
PingBack from http://einternetmarketingtools.info/story.php?id=19274