public static void PrintAll(IEnumerable<IPrintableDocument> documents) { if(Environment.OSVersion.Platform != PlatformID.MacOSX && Environment.OSVersion.Platform != PlatformID.Unix) { PrintAll_Win_Workaround(documents); return; } PrintOperation printOp; printOp = new PrintOperation(); printOp.Unit = Unit.Points; printOp.UseFullPage = true; printOp.ShowProgress = true; var documentsRDL = documents.Where(doc=>doc.PrintType==PrinterType.RDL).ToList(); BatchRDLRenderer renderer = new BatchRDLRenderer(documentsRDL); var result = LongOperationDlg.StartOperation( renderer.PrepareDocuments, "Подготовка к печати...", documentsRDL.Count() ); if (result == LongOperationResult.Canceled) return; printOp.NPages = renderer.PageCount; if (documentsRDL.Any(x => x.Orientation == DocumentOrientation.Landscape)) { printOp.RequestPageSetup += renderer.RequestPageSetup; } printOp.DrawPage += renderer.DrawPage; printOp.Run(PrintOperationAction.PrintDialog, null); }
public void PrintAll(IEnumerable <IPrintableDocument> documents) { PrintSettings = null; if (Environment.OSVersion.Platform != PlatformID.MacOSX && Environment.OSVersion.Platform != PlatformID.Unix) { PrintSettings = PrintAll_Win_Workaround(documents); return; } PrintOperation printOp; printOp = new PrintOperation(); printOp.Unit = Unit.Points; printOp.UseFullPage = true; printOp.ShowProgress = true; var documentsRDL = documents.Where(doc => doc.PrintType == PrinterType.RDL).ToList(); BatchRDLRenderer renderer = new BatchRDLRenderer(documentsRDL); var result = LongOperationDlg.StartOperation( renderer.PrepareDocuments, "Подготовка к печати...", documentsRDL.Count() ); if (result == LongOperationResult.Canceled) { PrintSettings = new PrintSettings(); return; } printOp.NPages = renderer.PageCount; if (documentsRDL.Any(x => x.Orientation == DocumentOrientation.Landscape)) { printOp.RequestPageSetup += renderer.RequestPageSetup; } printOp.DrawPage += renderer.DrawPage; printOp.EndPrint += (o, args) => { args.Args = documentsRDL.ToArray(); DocumentsPrinted?.Invoke(o, args); }; printOp.Run(PrintOperationAction.PrintDialog, null); PrintSettings = printOp.PrintSettings; }
/// <summary> /// Альтернативная релализация печати, специально для обхода бага в кайро при поворачивании(со старой реализацией печати пол Linux) /// https://bugzilla.mozilla.org/show_bug.cgi?id=1205854#c16 /// В новой при установке ориентации для каждой странице на большенстве принтеров обрезается часть выходящая за поворот. Хотя ориентация правильная. /// На некоторых принтерах например в водовозе, табличка рисуется за вертикалью листа а текст нет. /// используется только на винде, в линуксе такой проблемы нет. /// </summary> private PrintSettings PrintAll_Win_Workaround(IEnumerable <IPrintableDocument> documents) { PrintOperation printOp = null; PrintSettings printSettings = null; var documentsRDL_Portrait = documents.Where(doc => doc.PrintType == PrinterType.RDL && doc.Orientation == DocumentOrientation.Portrait).ToList(); var documentsRDL_Landscape = documents.Where(doc => doc.PrintType == PrinterType.RDL && doc.Orientation == DocumentOrientation.Landscape).ToList(); if (!documents.Any()) { printOp = new PrintOperation(); printOp.Run(PrintOperationAction.PrintDialog, null); return(printOp.PrintSettings); } if (documentsRDL_Portrait.Any()) { printOp = new PrintOperation(); printOp.Unit = Unit.Points; printOp.UseFullPage = true; printOp.ShowProgress = true; printOp.DefaultPageSetup = new PageSetup(); printOp.DefaultPageSetup.Orientation = PageOrientation.Portrait; BatchRDLRenderer renderer = new BatchRDLRenderer(documentsRDL_Portrait); var result = LongOperationDlg.StartOperation( renderer.PrepareDocuments, "Подготовка к печати портретных страниц...", documentsRDL_Portrait.Count() ); if (result == LongOperationResult.Canceled) { return(new PrintSettings()); } printOp.NPages = renderer.PageCount; printOp.DrawPage += renderer.DrawPage; printOp.EndPrint += (o, args) => { args.Args = documentsRDL_Portrait.Concat(documentsRDL_Landscape).ToArray(); DocumentsPrinted?.Invoke(o, args); }; printOp.Run(PrintOperationAction.PrintDialog, null); printSettings = printOp.PrintSettings; } if (documentsRDL_Landscape.Any()) { printOp = new PrintOperation(); printOp.Unit = Unit.Points; printOp.UseFullPage = true; printOp.ShowProgress = true; printOp.DefaultPageSetup = new PageSetup(); //если printSettings == null, то значит, до этого не печатались RDL формата //PageOrientation.Portrait и, соответственно, не показывался PrintDialog и //нужно показать его сейчас. PrintOperationAction printOperationAction = PrintOperationAction.PrintDialog; if (printSettings != null) { printOp.PrintSettings = printSettings; printOp.PrintSettings.Orientation = PageOrientation.Landscape; printOperationAction = PrintOperationAction.Print; } printOp.DefaultPageSetup.Orientation = PageOrientation.Landscape; BatchRDLRenderer renderer = new BatchRDLRenderer(documentsRDL_Landscape); var result = LongOperationDlg.StartOperation( renderer.PrepareDocuments, "Подготовка к печати альбомных страниц...", documentsRDL_Landscape.Count() ); if (result == LongOperationResult.Canceled) { return(new PrintSettings()); } printOp.NPages = renderer.PageCount; printOp.DrawPage += renderer.DrawPage; printOp.EndPrint += (o, args) => { args.Args = documentsRDL_Portrait.Concat(documentsRDL_Landscape).ToArray(); DocumentsPrinted?.Invoke(o, args); }; printOp.Run(printOperationAction, null); } return(printOp.PrintSettings); }
/// <summary> /// Альтернативная релализация печати, специально для обхода бага в кайро при поворачивании(со старой реализацией печати пол Linux) /// https://bugzilla.mozilla.org/show_bug.cgi?id=1205854#c16 /// В новой при установке ориентации для каждой странице на большенстве принтеров обрезается часть выходящая за поворот. Хотя ориентация правильная. /// На некоторых принтерах например в водовозе, табличка рисуется за вертикалью листа а текст нет. /// используется только на винде, в линуксе такой проблемы нет. /// </summary> private static void PrintAll_Win_Workaround(IEnumerable<IPrintableDocument> documents) { PrintOperation printOp; var documentsRDL_Portrait = documents.Where(doc => doc.PrintType==PrinterType.RDL && doc.Orientation == DocumentOrientation.Portrait).ToList(); var documentsRDL_Landscape = documents.Where(doc=>doc.PrintType==PrinterType.RDL && doc.Orientation == DocumentOrientation.Landscape).ToList(); if (documentsRDL_Portrait.Count > 0) { printOp = new PrintOperation(); printOp.Unit = Unit.Points; printOp.UseFullPage = true; printOp.ShowProgress = true; printOp.DefaultPageSetup = new PageSetup(); printOp.DefaultPageSetup.Orientation = PageOrientation.Portrait; BatchRDLRenderer renderer = new BatchRDLRenderer(documentsRDL_Portrait); var result = LongOperationDlg.StartOperation( renderer.PrepareDocuments, "Подготовка к печати портретных страниц...", documentsRDL_Portrait.Count() ); if (result == LongOperationResult.Canceled) return; printOp.NPages = renderer.PageCount; printOp.DrawPage += renderer.DrawPage; printOp.Run(PrintOperationAction.PrintDialog, null); } if(documentsRDL_Landscape.Count > 0) { printOp = new PrintOperation(); printOp.Unit = Unit.Points; printOp.UseFullPage = true; printOp.ShowProgress = true; printOp.DefaultPageSetup = new PageSetup(); printOp.DefaultPageSetup.Orientation = PageOrientation.Landscape; BatchRDLRenderer renderer = new BatchRDLRenderer(documentsRDL_Landscape); var result = LongOperationDlg.StartOperation( renderer.PrepareDocuments, "Подготовка к печати альбомных страниц...", documentsRDL_Landscape.Count() ); if (result == LongOperationResult.Canceled) return; printOp.NPages = renderer.PageCount; printOp.DrawPage += renderer.DrawPage; printOp.Run(PrintOperationAction.PrintDialog, null); } }