HomePagePrinterDialogViewModel.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. using PDF_Office.Views.Dialog.HomePageToolsDialogs.HomePagePrinter;
  2. using Prism.Commands;
  3. using Prism.Mvvm;
  4. using Prism.Regions;
  5. using Prism.Services.Dialogs;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Windows.Controls;
  9. using System.Windows;
  10. using System.Diagnostics;
  11. using System.Drawing.Printing;
  12. using PDFSettings;
  13. using ComPDFKit.PDFDocument;
  14. using PDF_Office.Model;
  15. using System.Drawing;
  16. using System.Reflection;
  17. using PDF_Office.Model.Dialog.HomePageToolsDialogs.HomePagePrinter;
  18. using System.Threading.Tasks;
  19. using static PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs.SetPasswordDialogModel;
  20. using ComPDFKit.PDFPage;
  21. using PDF_Office.Helper;
  22. using System.Drawing.Drawing2D;
  23. using static PDF_Office.Model.Dialog.HomePageToolsDialogs.HomePagePrinter.HomePagePrinterDialogModel;
  24. using ComPDFKitViewer.PdfViewer;
  25. namespace PDF_Office.ViewModels.Dialog.HomePageToolsDialogs.HomePagePrinter
  26. {
  27. public class HomePagePrinterDialogViewModel : BindableBase, IDialogAware, INavigationAware
  28. {
  29. public IDialogService Dialogs;
  30. public IRegionManager PrintModRegion;
  31. private Object locker = new Object();
  32. private CPDFViewer currentViewer;
  33. private string currentPrintModName;
  34. public Dictionary<string, string> GetContentByPrintMod;
  35. public Dictionary<int, string> GetPrinterNameByPrinterIndex;
  36. public HomePagePrinterDialogModel homePagePrinterDialogModel;
  37. public PrintSettingsInfo printSettingsInfo;
  38. private Visibility _printModVisible = Visibility.Collapsed;
  39. public Visibility PrintModVisible
  40. {
  41. get { return _printModVisible; }
  42. set { SetProperty(ref _printModVisible, value); }
  43. }
  44. #region 界面和组件初始化
  45. private string _printModRegionName;
  46. public string PrintModRegionName
  47. {
  48. get
  49. {
  50. return _printModRegionName;
  51. }
  52. set
  53. {
  54. SetProperty(ref _printModRegionName, value);
  55. }
  56. }
  57. private List<string> _printerNameList;
  58. public List<string> PrinterNameList
  59. {
  60. get { return _printerNameList; }
  61. set { _printerNameList = value; }
  62. }
  63. private List<string> _printContentList;
  64. public List<string> PrintContentList
  65. {
  66. get { return _printContentList; }
  67. set { _printContentList = value; }
  68. }
  69. private List<string> _printerDirectionList;
  70. private CPDFDocument document;
  71. public List<string> PrintDirectionList
  72. {
  73. get { return _printerDirectionList; }
  74. set { _printerDirectionList = value; }
  75. }
  76. #endregion
  77. #region 属性设置
  78. private int _printerIndex;
  79. public int PrinterIndex
  80. {
  81. get { return _printerIndex; }
  82. set { _printerIndex = value; }
  83. }
  84. #endregion
  85. #region 打印
  86. private PrintDocument printDocument = new PrintDocument();
  87. private PrinterSettings printerSettings = new PrinterSettings();
  88. private PageSettings PageSettings = new PageSettings();
  89. /// <summary>
  90. ///待打印页面集合,存储页面索引值
  91. /// </summary>
  92. private List<int> TargetPages = new List<int>();
  93. private int currentListIndex = 0;
  94. private bool annotation = true;
  95. private bool form = true;
  96. private int currentViewerPageIndex = 0;
  97. System.Drawing.Point location = new System.Drawing.Point(10, 10);
  98. System.Drawing.Size size = new System.Drawing.Size(600, 150);
  99. #endregion
  100. public DelegateCommand<object> DelegateChangePrintModCommand { get; set; }
  101. public HomePagePrinterDialogViewModel(IDialogService dialogService, IRegionManager regionManager)
  102. {
  103. Dialogs = dialogService;
  104. PrintModRegion = regionManager;
  105. PrintModVisible = Visibility.Visible;
  106. PrintModRegionName = Guid.NewGuid().ToString();
  107. DelegateChangePrintModCommand = new DelegateCommand<object>(ChangePrintMod);
  108. homePagePrinterDialogModel = new HomePagePrinterDialogModel();
  109. printSettingsInfo = new PrintSettingsInfo();
  110. GetContentByPrintMod = new Dictionary<string, string>();
  111. InitGetContentByPrintMod(ref GetContentByPrintMod);
  112. GetPrinterNameByPrinterIndex = new Dictionary<int, string>();
  113. InitGetPrinterNameByPrinterIndex(ref GetPrinterNameByPrinterIndex);
  114. InitComponentAsync();
  115. InitPrinterSettings();
  116. }
  117. #region 组件初始化
  118. private void InitComponentAsync()
  119. {
  120. InitPrinterNameList();
  121. InitPrintContentList();
  122. InitPrintContentList();
  123. InitPrintDirectionList();
  124. }
  125. private void PaintPageAtIndex(object currentViewerIndex)
  126. {
  127. try
  128. {
  129. lock (locker)
  130. {
  131. #region 根据不同打印模式 做不同处理
  132. switch (currentPrintModName)
  133. {
  134. case "ModPoster":
  135. break;
  136. case "ModMutiple":
  137. break;
  138. case "ModBooklet":
  139. //打印机要适时设置双面打印
  140. break;
  141. case "ModSize"://普通 大小模式
  142. default:
  143. PreviewModSize(currentViewerPageIndex);
  144. break;
  145. }
  146. #endregion
  147. }
  148. }
  149. catch (Exception ex)
  150. {
  151. }
  152. }
  153. private void InitPrinterNameList()
  154. {
  155. PrinterNameList = new List<string>();
  156. PrintDocument printDocument = new PrintDocument();
  157. string defaultPrinterName = printDocument.PrinterSettings.PrinterName;
  158. foreach (string printerListItem in PrinterSettings.InstalledPrinters)
  159. {
  160. PrinterNameList.Add(printerListItem);
  161. }
  162. }
  163. private void InitPrintContentList()
  164. {
  165. PrintContentList = new List<string>();
  166. PrintContentList.Add("文档");
  167. PrintContentList.Add("文档和标记");
  168. PrintContentList.Add("文档和图章");
  169. }
  170. private void InitPrintDirectionList()
  171. {
  172. PrintDirectionList = new List<string>();
  173. PrintDirectionList.Add("横向");
  174. PrintDirectionList.Add("纵向");
  175. }
  176. private void InitGetContentByPrintMod(ref Dictionary<string, string> dictionary)
  177. {
  178. dictionary.Add("ModSize", "HomePagePrinterModSizeContent");
  179. dictionary.Add("ModPoster", "HomePagePrinterModPosterContent");
  180. dictionary.Add("ModMutiple", "HomePagePrinterModMutipleContent");
  181. dictionary.Add("ModBooklet", "HomePagePrinterModBookletContent");
  182. }
  183. private void InitGetPrinterNameByPrinterIndex(ref Dictionary<int, string> dictionary)
  184. {
  185. int index = 0;
  186. PrinterNameList = new List<string>();
  187. PrintDocument printDocument = new PrintDocument();
  188. string defaultPrinterName = printDocument.PrinterSettings.PrinterName;
  189. foreach (string printerListItem in PrinterSettings.InstalledPrinters)
  190. {
  191. dictionary.Add(index++, printerListItem);
  192. }
  193. if (index == 0)
  194. {
  195. #if DEBUG
  196. MessageBox.Show("No Printer!");
  197. #endif
  198. }
  199. }
  200. #endregion
  201. #region 打印初始化
  202. public double GetDpiByGraphics()
  203. {
  204. BindingFlags bindingAttr = BindingFlags.Static | BindingFlags.NonPublic;
  205. PropertyInfo property = typeof(SystemParameters).GetProperty("Dpi", bindingAttr);
  206. return (int)property.GetValue(null, null);
  207. }
  208. public void InitPrinterSettings()
  209. {
  210. location = new System.Drawing.Point((int)(18 * GetDpiByGraphics() / 120), (int)(66 * GetDpiByGraphics() / 120));
  211. size = new System.Drawing.Size((int)(624 * GetDpiByGraphics() / 120), (int)(130 * GetDpiByGraphics() / 120));
  212. }
  213. public async Task InitPrintParamsAsync()
  214. {
  215. printSettingsInfo.PrinterName = GetPrinterNameByPrinterIndex[PrinterIndex];
  216. printSettingsInfo.Copies = 1;
  217. printSettingsInfo.IsBlackAndWhite = false;
  218. printSettingsInfo.IsReverseOrder = false;
  219. printSettingsInfo.PrintWithAnnot = true;
  220. printSettingsInfo.PrintWithForm = true;
  221. printSettingsInfo.EnumPrintOrientation = EnumPrintOrientation.StatusHorizontal;
  222. SizeSetttingsInfo sizeSetttingsInfo = new SizeSetttingsInfo();
  223. sizeSetttingsInfo.SizeType = EnumSizeType.StatusAdaptive;
  224. sizeSetttingsInfo.DisplayRatio = 100;
  225. printSettingsInfo.SizeSetttingsInfo = sizeSetttingsInfo;
  226. await Task.Run(() => { PaintPageAtIndex(currentViewerPageIndex); });
  227. }
  228. #endregion
  229. #region 四种打印的预览
  230. /// <summary>
  231. /// 重新调整图片大小(比例不变) 缩放图片
  232. /// 可以直接传入目标区域大小,不会丢失原图比例
  233. /// </summary>
  234. /// <param name="image"></param>
  235. /// <param name="size"></param>
  236. /// <returns></returns>
  237. public System.Drawing.Image ResizeImage(System.Drawing.Image image, System.Drawing.Size size)
  238. {
  239. //获取图片宽度
  240. int sourceWidth = image.Width;
  241. //获取图片高度
  242. int sourceHeight = image.Height;
  243. float nPercent = 0;
  244. float nPercentW = 0;
  245. float nPercentH = 0;
  246. //计算宽度的缩放比例
  247. //nPercentW = ((float)size.Width * (float)GetDpiByGraphics()/120/ (float)sourceWidth);
  248. ////计算高度的缩放比例
  249. //nPercentH = ((float)size.Height*(float)GetDpiByGraphics() / 120 / (float)sourceHeight);
  250. nPercentW = ((float)size.Width / (float)sourceWidth);
  251. //计算高度的缩放比例
  252. nPercentH = ((float)size.Height / (float)sourceHeight);
  253. if (nPercentH < nPercentW)
  254. nPercent = nPercentH;
  255. else
  256. nPercent = nPercentW;
  257. //期望的宽度
  258. int destWidth = (int)(sourceWidth * nPercent);
  259. //期望的高度
  260. int destHeight = (int)(sourceHeight * nPercent);
  261. System.Drawing.Bitmap b = new System.Drawing.Bitmap(destWidth, destHeight);
  262. Graphics g = Graphics.FromImage((System.Drawing.Image)b);
  263. //g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  264. g.SmoothingMode = SmoothingMode.None; //抗锯齿
  265. g.InterpolationMode = InterpolationMode.HighQualityBicubic; //高质量的双三次插值
  266. g.CompositingQuality = CompositingQuality.HighQuality; //高质量、低速度复合
  267. //绘制图像
  268. g.DrawImage(image, 0, 0, destWidth, destHeight);
  269. g.Dispose();
  270. return (System.Drawing.Image)b;
  271. }
  272. private async void PreviewModSize(int pageIndex)
  273. {
  274. CPDFPage cPDFPage = document.PageAtIndex(pageIndex);
  275. if (cPDFPage == null)
  276. {
  277. double left = 0;
  278. double top = 0;
  279. double rate = 0;
  280. int dpi = (int)GetDpiByGraphics();
  281. Bitmap bitmap = await ToolMethod.RenderPageBitmap(document, (int)(cPDFPage.PageSize.Width * rate * 1.4), (int)(cPDFPage.PageSize.Height * rate * 1.4), pageIndex, printSettingsInfo.PrintWithAnnot, printSettingsInfo.PrintWithForm);
  282. var pageBound = printDocument.DefaultPageSettings.Bounds;
  283. double ZoomRate = (double)printSettingsInfo.SizeSetttingsInfo.DisplayRatio / 100.0;
  284. if (printSettingsInfo.SizeSetttingsInfo.SizeType == EnumSizeType.StatusAdaptive)
  285. {
  286. float zoompercent = 0;
  287. float percentW = 0;
  288. float percentH = 0;
  289. percentW = ((float)(pageBound.Width * rate) / (float)bitmap.Width);
  290. percentH = ((float)(pageBound.Height * rate) / (float)bitmap.Height);
  291. zoompercent = percentH > percentW ? percentW : percentH;
  292. var newSize = new System.Drawing.Size((int)(bitmap.Width * zoompercent), (int)(bitmap.Height * zoompercent));
  293. bitmap = (Bitmap)ResizeImage(bitmap, newSize);
  294. left = (pageBound.Width * rate - bitmap.Width) / 2;
  295. top = (pageBound.Height * rate - bitmap.Height) / 2;
  296. int pwidth = (int)(pageBound.Width * rate);
  297. int pheight = (int)(pageBound.Height * rate);
  298. Bitmap bmp = new Bitmap(pwidth, pheight);
  299. Graphics g = Graphics.FromImage(bmp);
  300. g.DrawImage(bitmap, (float)left, (float)top, bitmap.Width, bitmap.Height);
  301. }
  302. }
  303. }
  304. #endregion
  305. private void EnterSelectedMod(string currentPrinterModContent)
  306. {
  307. NavigationParameters param = new NavigationParameters();
  308. PrintModVisible = Visibility.Collapsed;
  309. PrintModRegion.RequestNavigate(PrintModRegionName, GetContentByPrintMod[currentPrinterModContent]);
  310. PrintModVisible = Visibility.Visible;
  311. //TODO:
  312. }
  313. private void ChangePrintMod(object e)
  314. {
  315. var args = e as Button;
  316. if (args != null)
  317. {
  318. currentPrintModName = args.Name;
  319. EnterSelectedMod(currentPrintModName);
  320. //TODO:
  321. }
  322. }
  323. public string Title => "";
  324. public event Action<IDialogResult> RequestClose;
  325. public bool CanCloseDialog()
  326. {
  327. return true;
  328. }
  329. public void OnDialogClosed()
  330. {
  331. }
  332. public void OnDialogOpened(IDialogParameters parameters)
  333. {
  334. CPDFViewer viewer = null;
  335. string filepath = "";
  336. parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out viewer);
  337. parameters.TryGetValue<string>(ParameterNames.FilePath, out filepath);
  338. if (viewer != null && viewer.Document != null)
  339. {
  340. currentViewer = viewer;
  341. document = currentViewer.Document;
  342. InitPrintParamsAsync();
  343. }
  344. }
  345. public void OnNavigatedTo(NavigationContext navigationContext)
  346. {
  347. }
  348. public bool IsNavigationTarget(NavigationContext navigationContext)
  349. {
  350. return true;
  351. }
  352. public void OnNavigatedFrom(NavigationContext navigationContext)
  353. {
  354. }
  355. }
  356. }