using ComPDFKit.Controls.Helper; using ComPDFKit.Controls.Printer; using ComPDFKit.PDFDocument; using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing.Printing; using System.Linq; using System.Printing; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Controls; namespace ComPDFKit.Controls.PDFControl { /// /// Interaction logic for PrinterDialog.xaml /// public partial class PrinterDialog : Window, INotifyPropertyChanged { private bool isInited = false; private PrintServer PrintServer = new PrintServer(); private PrintQueue printQueue; private PrinterSettings printerSettings; private PrintSettingsInfo printSettingsInfo = new PrintSettingsInfo(); private SizeModeInfo sizeModeInfo = new SizeModeInfo(); private PosterModeInfo posterModeInfo = new PosterModeInfo(); private MultipleModeInfo multipleModeInfo = new MultipleModeInfo(); private BookletModeInfo bookletModeInfo = new BookletModeInfo(); private PrintDocument printDoc = new PrintDocument(); private int _sizeScale = 100; public int SizeScale { get { return _sizeScale; } set { if (UpdateProper(ref _sizeScale, value)) { sizeModeInfo.Scale = value; ctlPreview.Init(printSettingsInfo); } } } private string _pageRangeText; public string PageRangeText { get => _pageRangeText; set { _pageRangeText = value; if (!CommonHelper.GetPagesInRange(ref printSettingsInfo.PageRangeList, PageRangeText, Document.PageCount, new char[] { ',' }, new char[] { '-' })) { printSettingsInfo.PageRangeList = Enumerable.Range(0, Document.PageCount).ToList(); } ctlPreview.Init(printSettingsInfo, true); } } private bool _isSheetEnabled = false; public bool IsSheetEnabled { get => _isSheetEnabled; set => UpdateProper(ref _isSheetEnabled, value); } private bool _isEvenEnabled = false; public bool IsEvenEnabled { get => _isEvenEnabled; set => UpdateProper(ref _isEvenEnabled, value); } private string _sheetColumn = 2.ToString(); public string SheetColumn { get => _sheetColumn; set { if (UpdateProper(ref _sheetColumn, value)) { if (SheetColumn != string.Empty && SheetRow != string.Empty) { multipleModeInfo.Sheet = new MultipleModeInfo.SheetPair(int.Parse(SheetColumn), int.Parse(SheetRow)); } } } } private string _sheetRow = 2.ToString(); public string SheetRow { get => _sheetRow; set { if (UpdateProper(ref _sheetRow, value)) { if (SheetColumn != string.Empty && SheetRow != string.Empty) { multipleModeInfo.Sheet = new MultipleModeInfo.SheetPair(int.Parse(SheetColumn), int.Parse(SheetRow)); } } } } public CPDFDocument Document { set { printSettingsInfo.Document = value; IsEvenEnabled = value.PageCount > 1; } private get => printSettingsInfo.Document; } public PrinterDialog() { InitializeComponent(); InitPaperList(); DataContext = this; } #region printer settings private void InitPrinterNameList() { List printerList = Enumerable.Reverse(PrinterSettings.InstalledPrinters.Cast()).ToList(); cmbPrinterName.ItemsSource = printerList; cmbPrinterName.SelectedIndex = printerList.Contains("Microsoft Print to PDF") ? printerList.IndexOf("Microsoft Print to PDF") : 0; } #endregion private void PrinterDialog_Loaded(object sender, RoutedEventArgs e) { InitPrinterNameList(); InitPrinterSettingsMode(); ctlPreview.Init(printSettingsInfo); } private void InitPrinterSettingsMode() { printSettingsInfo.Copies = 1; printSettingsInfo.PrinterName = cmbPrinterName.SelectedItem.ToString(); printSettingsInfo.PrintMode = sizeModeInfo; printSettingsInfo.PrintOrientation = PageOrientation.Portrait; printSettingsInfo.PaperSize = printerSettings.PaperSizes[cmbPaper.SelectedIndex]; printSettingsInfo.IsPrintAnnot = true; printSettingsInfo.IsPrintForm = true; printSettingsInfo.IsReverseOrder = false; printSettingsInfo.IsGrayscale = false; printSettingsInfo.DuplexPrintMod = DuplexPrintMod.None; printSettingsInfo.PageRangeList = Enumerable.Range(0, Document.PageCount).ToList(); printSettingsInfo.PrintDocument = printDoc; printSettingsInfo.NeedRerendering = true; printSettingsInfo.IsPaperSizeChanged = false; printSettingsInfo.NeedReversePage = false; printSettingsInfo.PrintMode = sizeModeInfo; isInited = true; } private void InitPaperList() { printerSettings = printDoc.PrinterSettings; foreach (PaperSize paperSize in printerSettings.PaperSizes) { cmbPaper.Items.Add(new ComboBoxItem { Content = $"{paperSize.PaperName} - {paperSize.Width} x {paperSize.Height}" }); } int IndexOfA4 = printerSettings.PaperSizes.Cast().ToList().FindIndex(x => x.PaperName == "A4"); cmbPaper.SelectedIndex = IndexOfA4 != -1 ? IndexOfA4 : 0; printSettingsInfo.PaperSize = printerSettings.PaperSizes[cmbPaper.SelectedIndex]; } private void cmbPrinterName_SelectionChanged(object sender, SelectionChangedEventArgs e) { printSettingsInfo.PrinterName = e.AddedItems[0].ToString(); if (printSettingsInfo.PrinterName != string.Empty) { try { printQueue = PrintHelper.GetPrintQueue(PrintServer, printSettingsInfo.PrinterName); PrintHelper.printQueue = printQueue; } catch (Exception ex) { Console.WriteLine(ex.Message); return; } PrintTicket printTicket = printQueue.DefaultPrintTicket; PrintCapabilities printCapabilities = printQueue.GetPrintCapabilities(); double printableWidth = printCapabilities.PageImageableArea.ExtentWidth / 0.96; double printableHeight = printCapabilities.PageImageableArea.ExtentHeight / 0.96; double originWidth = printCapabilities.PageImageableArea.OriginWidth / 0.96; double originHeight = printCapabilities.PageImageableArea.OriginHeight / 0.96; double marginRight = printSettingsInfo.PaperSize.Width - originWidth - printableWidth; double marginBottom = printSettingsInfo.PaperSize.Height - originHeight - printableHeight; printSettingsInfo.Margins = new Thickness() { Left = originWidth, Top = originHeight, Right = (marginRight >= 0) ? marginRight : 0, Bottom = (marginBottom >= 0) ? marginBottom : 0 }; if (isInited) { ctlPreview.Init(printSettingsInfo); } } } private void cmbOrientation_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (!IsLoaded) { return; } string tag = (e.AddedItems[0] as ComboBoxItem).Tag.ToString(); switch (tag) { case "Portrait": printSettingsInfo.PrintOrientation = PageOrientation.Portrait; break; case "Landscape": printSettingsInfo.PrintOrientation = PageOrientation.Landscape; break; } ctlPreview.Init(printSettingsInfo); } private void cmbContent_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (!IsLoaded) { return; } string tag = (e.AddedItems[0] as ComboBoxItem).Tag.ToString(); switch (tag) { case "Document": printSettingsInfo.IsPrintAnnot = false; printSettingsInfo.IsPrintForm = false; break; case "Document and Markups": printSettingsInfo.IsPrintAnnot = true; printSettingsInfo.IsPrintForm = true; break; case "Document and Stamps": printSettingsInfo.IsPrintAnnot = true; printSettingsInfo.IsPrintForm = false; break; } ctlPreview.Init(printSettingsInfo, true); } private void chkReversePage_Click(object sender, RoutedEventArgs e) { var chk = sender as CheckBox; printSettingsInfo.IsReverseOrder = chk.IsChecked.Value; ctlPreview.Init(printSettingsInfo, true); } private void chkPrintBorder_Click(object sender, RoutedEventArgs e) { var chk = sender as CheckBox; } private void chkGrayScale_Click(object sender, RoutedEventArgs e) { var chk = sender as CheckBox; printSettingsInfo.IsGrayscale = chk.IsChecked.Value; ctlPreview.Init(printSettingsInfo); } private void chkDuplex_Click(object sender, RoutedEventArgs e) { var chk = sender as CheckBox; if (chk.IsChecked.GetValueOrDefault()) { if (rdoLongEdge.IsChecked.GetValueOrDefault()) { printSettingsInfo.DuplexPrintMod = DuplexPrintMod.FlipLongEdge; } else { printSettingsInfo.DuplexPrintMod = DuplexPrintMod.FlipShortEdge; } } else { printSettingsInfo.DuplexPrintMod = DuplexPrintMod.None; } } private void rdoDuplex_Click(object sender, RoutedEventArgs e) { var chk = sender as RadioButton; if (chkDuplex.IsChecked.GetValueOrDefault()) { if (chk.IsChecked.GetValueOrDefault()) { printSettingsInfo.DuplexPrintMod = chk.Tag.ToString() == "LongEdge" ? DuplexPrintMod.FlipLongEdge : DuplexPrintMod.FlipShortEdge; } } else { printSettingsInfo.DuplexPrintMod = DuplexPrintMod.None; } } private void cmbPaper_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (!IsLoaded) { return; } sbyte index = (sbyte)cmbPaper.SelectedIndex; printSettingsInfo.PaperSize = printerSettings.PaperSizes[index]; ctlPreview.Init(printSettingsInfo); } private void rdoPageRange_Click(object sender, RoutedEventArgs e) { var rdo = sender as RadioButton; string rdoTag = rdo.Tag.ToString(); switch (rdoTag) { case "All": printSettingsInfo.PageRangeList = Enumerable.Range(0, Document.PageCount).ToList(); break; case "Odd": printSettingsInfo.PageRangeList = Enumerable.Range(0, Document.PageCount).Where(x => x % 2 == 0).ToList(); break; case "Even": printSettingsInfo.PageRangeList = Enumerable.Range(0, Document.PageCount).Where(x => x % 2 != 0).ToList(); break; case "Custom": if (!CommonHelper.GetPagesInRange(ref printSettingsInfo.PageRangeList, PageRangeText, Document.PageCount, new char[] { ',' }, new char[] { '-' })) { printSettingsInfo.PageRangeList = Enumerable.Range(0, Document.PageCount).ToList(); } break; } ctlPreview.Init(printSettingsInfo, true); } private void SizeMode_Click(object sender, RoutedEventArgs e) { var rdo = sender as RadioButton; string rdoTag = rdo.Tag.ToString(); switch (rdoTag) { case "AutoAdapt": sizeModeInfo.SizeType = SizeType.Adaptive; break; case "ActualSize": sizeModeInfo.SizeType = SizeType.Actural; break; case "CustomScale": sizeModeInfo.SizeType = SizeType.Customized; sizeModeInfo.Scale = SizeScale; break; } ctlPreview.Init(printSettingsInfo); } private void cmbPageOrder_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (!IsLoaded) { return; } string tag = (e.AddedItems[0] as ComboBoxItem).Tag.ToString(); switch (tag) { case "Horizontal": multipleModeInfo.PageOrder = PageOrder.Horizontal; break; case "Horizontal Reverse": multipleModeInfo.PageOrder = PageOrder.HorizontalReverse; break; case "TopToBottom": multipleModeInfo.PageOrder = PageOrder.Vertical; break; case "BottomToTop": multipleModeInfo.PageOrder = PageOrder.VerticalReverse; break; } } public event PropertyChangedEventHandler PropertyChanged; protected bool UpdateProper(ref T properValue, T newValue, [CallerMemberName] string properName = "") { if (object.Equals(properValue, newValue)) return false; properValue = newValue; OnPropertyChanged(properName); return true; } protected void OnPropertyChanged([CallerMemberName] string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); private void btnConfirm_Click(object sender, RoutedEventArgs e) { PrintHelper.InitPrint(); PrintHelper.PrintDocument(printSettingsInfo); Close(); } private void btnCancel_Click(object sender, RoutedEventArgs e) { Close(); } private void cmbOrientation_Loaded(object sender, RoutedEventArgs e) { bool isHeightWidthRatioGreaterThanOne = (printSettingsInfo.ActualHeight / printSettingsInfo.ActualWidth > 1) && (Document.GetPageSize(0).height / Document.GetPageSize(0).width > 1); bool isHeightWidthRatioLessThanOne = (printSettingsInfo.ActualHeight / printSettingsInfo.ActualWidth < 1) && (Document.GetPageSize(0).height / Document.GetPageSize(0).width < 1); cmbOrientation.SelectedIndex = (isHeightWidthRatioGreaterThanOne || isHeightWidthRatioLessThanOne) ? 0 : 1; } private void cmbContent_Loaded(object sender, RoutedEventArgs e) { cmbContent.SelectedIndex = 1; } private void chkBorderless_Click(object sender, RoutedEventArgs e) { var chk = sender as CheckBox; printSettingsInfo.IsBorderless = chk.IsChecked.Value; ctlPreview.Init(printSettingsInfo); } private void rdoFitPrintable_Checked(object sender, RoutedEventArgs e) { printSettingsInfo.IsBorderless = false; if (isInited) { ctlPreview.Init(printSettingsInfo); } } private void rdoFitPage_Checked(object sender, RoutedEventArgs e) { printSettingsInfo.IsBorderless = true; if (isInited) { ctlPreview.Init(printSettingsInfo); } } } }