MainWindow.xaml.cs 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126
  1. using ComPDFKit.PDFDocument;
  2. using ComPDFKit.PDFPage;
  3. using Compdfkit_Tools.Edit;
  4. using Compdfkit_Tools.Helper;
  5. using Compdfkit_Tools.PDFControl;
  6. using ComPDFKitViewer;
  7. using ComPDFKitViewer.AnnotEvent;
  8. using ComPDFKitViewer.PdfViewer;
  9. using Microsoft.Win32;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.ComponentModel;
  13. using System.Diagnostics;
  14. using System.Drawing;
  15. using System.IO;
  16. using System.Runtime.CompilerServices;
  17. using System.Windows;
  18. using System.Windows.Controls;
  19. using System.Windows.Controls.Primitives;
  20. using System.Windows.Input;
  21. using System.Windows.Media.Imaging;
  22. namespace ContentEditor
  23. {
  24. /// <summary>
  25. /// MainWindow.xaml 的交互逻辑
  26. /// </summary>
  27. public partial class MainWindow : Window, INotifyPropertyChanged
  28. {
  29. /// <summary>
  30. /// 是否能够撤销
  31. /// </summary>
  32. public bool CanUndo
  33. {
  34. get
  35. {
  36. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  37. {
  38. return pdfViewControl.PDFView.UndoManager.CanUndo;
  39. }
  40. return false;
  41. }
  42. }
  43. /// <summary>
  44. /// 是否能够重做
  45. /// </summary>
  46. public bool CanRedo
  47. {
  48. get
  49. {
  50. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  51. {
  52. return pdfViewControl.PDFView.UndoManager.CanRedo;
  53. }
  54. return false;
  55. }
  56. }
  57. public bool CanSave
  58. {
  59. get
  60. {
  61. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  62. {
  63. return pdfViewControl.PDFView.UndoManager.CanSave;
  64. }
  65. return false;
  66. }
  67. }
  68. /// <summary>
  69. /// 上一次的PDF编辑对象
  70. /// </summary>
  71. private PDFEditEvent lastPDFEditEvent = null;
  72. /// <summary>
  73. /// 缩放比例
  74. /// </summary>
  75. private PDFViewControl passwordViewer;
  76. private PDFViewControl pdfViewControl;
  77. private PDFImageEditControl imageEditControl = new PDFImageEditControl();
  78. private PDFTextEditControl textEditControl = new PDFTextEditControl();
  79. private Border empytPanel = new Border();
  80. private UIElement prevPanel=null;
  81. private double[] zoomLevelList = { 1f, 8f, 12f, 25, 33f, 50, 66f, 75, 100, 125, 150, 200, 300, 400, 600, 800, 1000 };
  82. public MainWindow()
  83. {
  84. InitializeComponent();
  85. Loaded += MainWindow_Loaded;
  86. DataContext = this;
  87. }
  88. /// <summary>
  89. /// 属性更改事件
  90. /// </summary>
  91. public event PropertyChangedEventHandler PropertyChanged;
  92. /// <summary>
  93. ///触发属性更改事件通知
  94. /// </summary>
  95. protected void OnPropertyChanged([CallerMemberName] string name = null)
  96. {
  97. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
  98. }
  99. private void MainWindow_Loaded(object sender, RoutedEventArgs e)
  100. {
  101. TextBlock emptyBlock=new TextBlock();
  102. emptyBlock.HorizontalAlignment = HorizontalAlignment.Center;
  103. emptyBlock.VerticalAlignment = VerticalAlignment.Center;
  104. empytPanel.Child = emptyBlock;
  105. empytPanel.Width = 260;
  106. BotaSideTool.AddBOTAContent(BOTATools.Thumbnail | BOTATools.Outline | BOTATools.Bookmark | BOTATools.Search);
  107. LoadDefaultDocument();
  108. }
  109. private void LoadDocument()
  110. {
  111. pdfViewControl.PDFView?.Load();
  112. PDFGrid.Child = pdfViewControl;
  113. pdfViewControl.PDFView.InfoChanged -= PdfViewer_InfoChanged;
  114. pdfViewControl.PDFView.InfoChanged += PdfViewer_InfoChanged;
  115. PasswordUI.Closed -= PasswordUI_Closed;
  116. PasswordUI.Canceled -= PasswordUI_Canceled;
  117. PasswordUI.Confirmed -= PasswordUI_Confirmed;
  118. PasswordUI.Closed += PasswordUI_Closed;
  119. PasswordUI.Canceled += PasswordUI_Canceled;
  120. PasswordUI.Confirmed += PasswordUI_Confirmed;
  121. pdfViewControl.PDFView.PDFEditActiveHandler -= PDFView_PDFEditActiveHandler;
  122. pdfViewControl.PDFView.PDFEditActiveHandler += PDFView_PDFEditActiveHandler;
  123. pdfViewControl.PDFView.UndoManager.PropertyChanged -= UndoManager_PropertyChanged;
  124. pdfViewControl.PDFView.UndoManager.PropertyChanged += UndoManager_PropertyChanged;
  125. pdfViewControl.PDFView.PDFEditCommandHandler -= PDFView_PDFEditCommandHandler;
  126. pdfViewControl.PDFView.PDFEditCommandHandler += PDFView_PDFEditCommandHandler;
  127. pdfViewControl.PDFView.AnnotCommandHandler -= PDFView_AnnotCommandHandler;
  128. pdfViewControl.PDFView.AnnotCommandHandler += PDFView_AnnotCommandHandler;
  129. pdfViewControl.PDFView.SetFormFieldHighlight(true);
  130. pdfViewControl.PDFView.ChangeFitMode(FitMode.FitWidth);
  131. CPDFSaclingControl.InitWithPDFViewer(pdfViewControl.PDFView);
  132. CPDFSaclingControl.SetZoomTextBoxText(string.Format("{0}", (int)(pdfViewControl.PDFView.ZoomFactor * 100)));
  133. FloatPageTool.InitWithPDFViewer(pdfViewControl.PDFView);
  134. BotaSideTool.InitWithPDFViewer(pdfViewControl.PDFView);
  135. BotaSideTool.SelectBotaTool(BOTATools.Thumbnail);
  136. ViewSettingBtn.IsChecked = false;
  137. PropertyContainer.Child = null;
  138. PropertyContainer.Visibility = Visibility.Collapsed;
  139. SetEditMode();
  140. }
  141. private void PDFView_AnnotCommandHandler(object sender, AnnotCommandArgs e)
  142. {
  143. if (e != null && e.CommandType == CommandType.Context)
  144. {
  145. if (e.PressOnSelectedText)
  146. {
  147. e.Handle = true;
  148. e.PopupMenu = new ContextMenu();
  149. e.PopupMenu.Items.Add(new MenuItem() { Header = "Copy", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
  150. }
  151. else if (e.CommandTarget == TargetType.ImageSelection)
  152. {
  153. if (pdfViewControl != null && pdfViewControl.PDFView != null && pdfViewControl.PDFView.GetSelectImageCount() > 0)
  154. {
  155. e.Handle = true;
  156. e.PopupMenu = new ContextMenu();
  157. MenuItem imageCopyMenu = new MenuItem();
  158. imageCopyMenu = new MenuItem();
  159. imageCopyMenu.Header = "Copy Images";
  160. WeakEventManager<MenuItem, RoutedEventArgs>.AddHandler(imageCopyMenu, "Click", CopyImage_Click);
  161. imageCopyMenu.CommandParameter = e;
  162. e.PopupMenu.Items.Add(imageCopyMenu);
  163. MenuItem imageExtraMenu = new MenuItem();
  164. imageExtraMenu = new MenuItem();
  165. imageExtraMenu.Header = "Extract Images";
  166. WeakEventManager<MenuItem, RoutedEventArgs>.AddHandler(imageExtraMenu, "Click", ExtraImage_Click);
  167. imageExtraMenu.CommandParameter = e;
  168. e.PopupMenu.Items.Add(imageExtraMenu);
  169. }
  170. }
  171. else
  172. {
  173. e.Handle = true;
  174. e.PopupMenu = new ContextMenu();
  175. MenuItem fitWidthMenu = new MenuItem();
  176. fitWidthMenu.Header = "Automatically Resize";
  177. fitWidthMenu.Click += (o, p) =>
  178. {
  179. if (pdfViewControl != null)
  180. {
  181. pdfViewControl.PDFView?.ChangeFitMode(FitMode.FitWidth);
  182. }
  183. };
  184. e.PopupMenu.Items.Add(fitWidthMenu);
  185. MenuItem fitSizeMenu = new MenuItem();
  186. fitSizeMenu.Header = "Actual Size";
  187. fitSizeMenu.Click += (o, p) =>
  188. {
  189. if (pdfViewControl != null)
  190. {
  191. pdfViewControl.PDFView?.ChangeFitMode(FitMode.FitSize);
  192. }
  193. };
  194. e.PopupMenu.Items.Add(fitSizeMenu);
  195. MenuItem zoomInMenu = new MenuItem();
  196. zoomInMenu.Header = "Zoom In";
  197. zoomInMenu.Click += (o, p) =>
  198. {
  199. if (pdfViewControl != null)
  200. {
  201. double newZoom = CheckZoomLevel(pdfViewControl.PDFView.ZoomFactor + 0.01, true);
  202. pdfViewControl.PDFView?.Zoom(newZoom);
  203. }
  204. };
  205. e.PopupMenu.Items.Add(zoomInMenu);
  206. MenuItem zoomOutMenu = new MenuItem();
  207. zoomOutMenu.Header = "Zoom Out";
  208. zoomOutMenu.Click += (o, p) =>
  209. {
  210. if (pdfViewControl != null)
  211. {
  212. double newZoom = CheckZoomLevel(pdfViewControl.PDFView.ZoomFactor - 0.01, false);
  213. pdfViewControl.PDFView?.Zoom(newZoom);
  214. }
  215. };
  216. e.PopupMenu.Items.Add(zoomOutMenu);
  217. e.PopupMenu.Items.Add(new Separator());
  218. MenuItem singleView = new MenuItem();
  219. singleView.Header = "Single Page";
  220. singleView.Click += (o, p) =>
  221. {
  222. if (pdfViewControl != null)
  223. {
  224. pdfViewControl.PDFView?.ChangeViewMode(ViewMode.Single);
  225. }
  226. };
  227. e.PopupMenu.Items.Add(singleView);
  228. MenuItem singleContinuousView = new MenuItem();
  229. singleContinuousView.Header = "Single Page Continuous";
  230. singleContinuousView.Click += (o, p) =>
  231. {
  232. if (pdfViewControl != null)
  233. {
  234. pdfViewControl.PDFView?.ChangeViewMode(ViewMode.SingleContinuous);
  235. }
  236. };
  237. e.PopupMenu.Items.Add(singleContinuousView);
  238. MenuItem doubleView = new MenuItem();
  239. doubleView.Header = "Two Pages";
  240. doubleView.Click += (o, p) =>
  241. {
  242. if (pdfViewControl != null)
  243. {
  244. pdfViewControl.PDFView?.ChangeViewMode(ViewMode.Double);
  245. }
  246. };
  247. e.PopupMenu.Items.Add(doubleView);
  248. MenuItem doubleContinuousView = new MenuItem();
  249. doubleContinuousView.Header = "Two Pages Continuous";
  250. doubleContinuousView.Click += (o, p) =>
  251. {
  252. if (pdfViewControl != null)
  253. {
  254. pdfViewControl.PDFView?.ChangeViewMode(ViewMode.DoubleContinuous);
  255. }
  256. };
  257. e.PopupMenu.Items.Add(doubleContinuousView);
  258. }
  259. }
  260. if (e != null && e.CommandType == CommandType.Copy)
  261. {
  262. e.DoCommand();
  263. }
  264. }
  265. private void PasswordUI_Confirmed(object sender, string e)
  266. {
  267. if (passwordViewer != null && passwordViewer.PDFView != null && passwordViewer.PDFView.Document != null)
  268. {
  269. passwordViewer.PDFView.Document.UnlockWithPassword(e);
  270. if (passwordViewer.PDFView.Document.IsLocked == false)
  271. {
  272. PasswordUI.SetShowError("", Visibility.Collapsed);
  273. PasswordUI.ClearPassword();
  274. PasswordUI.Visibility = Visibility.Collapsed;
  275. PopupBorder.Visibility = Visibility.Collapsed;
  276. pdfViewControl = passwordViewer;
  277. LoadDocument();
  278. }
  279. else
  280. {
  281. PasswordUI.SetShowError("Wrong Password", Visibility.Visible);
  282. }
  283. }
  284. }
  285. private void PasswordUI_Canceled(object sender, EventArgs e)
  286. {
  287. PopupBorder.Visibility = Visibility.Collapsed;
  288. PasswordUI.Visibility = Visibility.Collapsed;
  289. }
  290. private void PasswordUI_Closed(object sender, EventArgs e)
  291. {
  292. PopupBorder.Visibility = Visibility.Collapsed;
  293. PasswordUI.Visibility = Visibility.Collapsed;
  294. }
  295. private void PdfViewer_InfoChanged(object sender, KeyValuePair<string, object> e)
  296. {
  297. if (e.Key == "Zoom")
  298. {
  299. CPDFSaclingControl.SetZoomTextBoxText(string.Format("{0}", (int)((double)e.Value * 100)));
  300. }
  301. }
  302. /// <summary>
  303. /// 检查缩放比例
  304. /// </summary>
  305. private double CheckZoomLevel(double zoom, bool IsGrowth)
  306. {
  307. double standardZoom = 100;
  308. if (zoom <= 0.01)
  309. {
  310. return 0.01;
  311. }
  312. if (zoom >= 10)
  313. {
  314. return 10;
  315. }
  316. zoom *= 100;
  317. for (int i = 0; i < zoomLevelList.Length - 1; i++)
  318. {
  319. if (zoom > zoomLevelList[i] && zoom <= zoomLevelList[i + 1] && IsGrowth)
  320. {
  321. standardZoom = zoomLevelList[i + 1];
  322. break;
  323. }
  324. if (zoom >= zoomLevelList[i] && zoom < zoomLevelList[i + 1] && !IsGrowth)
  325. {
  326. standardZoom = zoomLevelList[i];
  327. break;
  328. }
  329. }
  330. return standardZoom / 100;
  331. }
  332. /// <summary>
  333. /// 文字编辑和图片编辑右键点击处理
  334. /// </summary>
  335. private void PDFView_PDFEditCommandHandler(object sender, PDFEditCommand e)
  336. {
  337. if (e == null)
  338. {
  339. return;
  340. }
  341. if (e.EditType == CPDFEditType.EditText)
  342. {
  343. e.Handle = true;
  344. PDFEditTextContextMenu(sender, e);
  345. }
  346. if (e.EditType == CPDFEditType.EditImage)
  347. {
  348. e.Handle = true;
  349. PDFEditImageContextMenu(sender, e);
  350. }
  351. }
  352. /// <summary>
  353. /// 撤销重做状态更新事件通知
  354. /// </summary>
  355. private void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e)
  356. {
  357. OnPropertyChanged(e.PropertyName);
  358. }
  359. /// <summary>
  360. /// 文字或图片块选中事件
  361. /// </summary>
  362. private void PDFView_PDFEditActiveHandler(object sender, PDFEditEvent e)
  363. {
  364. PDFEditEvent tempEvent = lastPDFEditEvent;
  365. lastPDFEditEvent = e;
  366. ViewSettingBtn.IsChecked = false;
  367. if (e == null)
  368. {
  369. PropertyContainer.Child = null;
  370. RightPanelBtn.IsChecked = false;
  371. PropertyContainer.Visibility = Visibility.Collapsed;
  372. return;
  373. }
  374. if (Mouse.RightButton == MouseButtonState.Pressed && PropertyContainer.Visibility!=Visibility.Visible)
  375. {
  376. return;
  377. }
  378. if (e.EditType == CPDFEditType.EditText)
  379. {
  380. if (textEditControl == null)
  381. {
  382. textEditControl = new PDFTextEditControl();
  383. }
  384. textEditControl.SetPDFTextEditData(e);
  385. PropertyContainer.Child = textEditControl;
  386. PropertyContainer.Visibility = Visibility.Visible;
  387. RightPanelBtn.IsChecked = true;
  388. return;
  389. }
  390. if (e.EditType == CPDFEditType.EditImage && pdfViewControl != null)
  391. {
  392. UIElement pageView = sender as UIElement;
  393. if (pageView != null)
  394. {
  395. pageView.MouseLeftButtonUp -= PageView_MouseLeftButtonUp;
  396. pageView.MouseLeftButtonUp += PageView_MouseLeftButtonUp;
  397. }
  398. if(Mouse.RightButton == MouseButtonState.Pressed)
  399. {
  400. SetImageEditProperty();
  401. }
  402. return;
  403. }
  404. }
  405. private void PageView_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  406. {
  407. UIElement pageView = sender as UIElement;
  408. if (pageView != null)
  409. {
  410. pageView.MouseLeftButtonUp -= PageView_MouseLeftButtonUp;
  411. }
  412. SetImageEditProperty();
  413. }
  414. private void SetImageEditProperty()
  415. {
  416. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  417. {
  418. if (imageEditControl == null)
  419. {
  420. imageEditControl = new PDFImageEditControl();
  421. }
  422. imageEditControl.InitWithPDFViewer(pdfViewControl.PDFView);
  423. imageEditControl.SetPDFImageEditData(lastPDFEditEvent);
  424. PropertyContainer.Child = imageEditControl;
  425. PropertyContainer.Visibility = Visibility.Visible;
  426. RightPanelBtn.IsChecked = true;
  427. }
  428. }
  429. /// <summary>
  430. /// 加载显示默认文档
  431. /// </summary>
  432. private void LoadDefaultDocument()
  433. {
  434. string defaultFilePath = "developer_guide_windows.pdf";
  435. pdfViewControl = new PDFViewControl();
  436. pdfViewControl.PDFView.InitDocument(defaultFilePath);
  437. LoadDocument();
  438. }
  439. private void ToolExpand_Click(object sender, RoutedEventArgs e)
  440. {
  441. ToggleButton expandBtn = sender as ToggleButton;
  442. if (expandBtn != null)
  443. {
  444. bool isExpand = expandBtn.IsChecked == true;
  445. ExpandLeftPanel(isExpand);
  446. }
  447. }
  448. private void ExpandSearchBtn_Click(object sender, RoutedEventArgs e)
  449. {
  450. ToolExpandBtn.IsChecked = true;
  451. ExpandLeftPanel(true);
  452. BotaSideTool.SelectBotaTool(BOTATools.Search);
  453. }
  454. private void ExpandLeftPanel(bool isExpand)
  455. {
  456. BotaSideTool.Visibility = isExpand ? Visibility.Visible : Visibility.Collapsed;
  457. Splitter.Visibility = isExpand ? Visibility.Visible : Visibility.Collapsed;
  458. if (isExpand)
  459. {
  460. BodyGrid.ColumnDefinitions[0].Width = new GridLength(260);
  461. BodyGrid.ColumnDefinitions[1].Width = new GridLength(15);
  462. }
  463. else
  464. {
  465. BodyGrid.ColumnDefinitions[0].Width = new GridLength(0);
  466. BodyGrid.ColumnDefinitions[1].Width = new GridLength(0);
  467. }
  468. }
  469. private void ViewSettingBtn_Click(object sender, RoutedEventArgs e)
  470. {
  471. RightPanelBtn.IsChecked = false;
  472. ToggleButton toggleButton = sender as ToggleButton;
  473. if (toggleButton != null)
  474. {
  475. if (toggleButton.IsChecked == true)
  476. {
  477. CPDFDisplaySettingsControl displayPanel = new CPDFDisplaySettingsControl();
  478. displayPanel.SetSplitContainerVisibility(Visibility.Collapsed);
  479. displayPanel.InitWithPDFViewer(pdfViewControl.PDFView);
  480. prevPanel = PropertyContainer.Child;
  481. PropertyContainer.Child = displayPanel;
  482. PropertyContainer.Visibility = Visibility.Visible;
  483. }
  484. else
  485. {
  486. PropertyContainer.Child = null;
  487. PropertyContainer.Visibility = Visibility.Collapsed;
  488. }
  489. }
  490. }
  491. private void NextPageBorder_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  492. {
  493. pdfViewControl.PDFView?.GoToPage(pdfViewControl.PDFView.CurrentIndex + 1);
  494. }
  495. private void PrevPageBorder_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  496. {
  497. pdfViewControl.PDFView?.GoToPage(pdfViewControl.PDFView.CurrentIndex - 1);
  498. }
  499. private void PageInfoBtn_Click(object sender, RoutedEventArgs e)
  500. {
  501. PasswordUI.Visibility = Visibility.Collapsed;
  502. FileInfoUI.Visibility = Visibility.Visible;
  503. FileInfoControl.InitWithPDFViewer(pdfViewControl.PDFView);
  504. PopupBorder.Visibility = Visibility.Visible;
  505. }
  506. private void FileInfoCloseBtn_Click(object sender, RoutedEventArgs e)
  507. {
  508. PopupBorder.Visibility = Visibility.Collapsed;
  509. }
  510. private void OpenFile_Click(object sender, RoutedEventArgs e)
  511. {
  512. try
  513. {
  514. string filePath = CommonHelper.GetFilePathOrEmpty();
  515. if (!string.IsNullOrEmpty(filePath) && pdfViewControl != null)
  516. {
  517. if (pdfViewControl.PDFView != null && pdfViewControl.PDFView.Document != null)
  518. {
  519. string oldFilePath = pdfViewControl.PDFView.Document.FilePath;
  520. if (oldFilePath.ToLower() == filePath.ToLower())
  521. {
  522. return;
  523. }
  524. }
  525. passwordViewer = new PDFViewControl();
  526. passwordViewer.PDFView.InitDocument(filePath);
  527. if (passwordViewer.PDFView.Document == null)
  528. {
  529. MessageBox.Show("Open File Failed");
  530. return;
  531. }
  532. if (passwordViewer.PDFView.Document.IsLocked)
  533. {
  534. PasswordUI.SetShowText(System.IO.Path.GetFileName(filePath) + " password encrypted.");
  535. PasswordUI.ClearPassword();
  536. PopupBorder.Visibility = Visibility.Visible;
  537. PasswordUI.Visibility = Visibility.Visible;
  538. }
  539. else
  540. {
  541. pdfViewControl = passwordViewer;
  542. LoadDocument();
  543. }
  544. }
  545. }
  546. catch (Exception ex)
  547. {
  548. }
  549. }
  550. private void SaveFileBtn_Click(object sender, RoutedEventArgs e)
  551. {
  552. SaveFile();
  553. }
  554. /// <summary>
  555. /// 文字编辑模式
  556. /// </summary>
  557. private void PDFTextEditButton_Click(object sender, RoutedEventArgs e)
  558. {
  559. ToggleButton senderBtn = sender as ToggleButton;
  560. if (senderBtn != null && pdfViewControl != null)
  561. {
  562. ClearPDFEditState(senderBtn);
  563. RightPanelBtn.IsChecked = false;
  564. if (PropertyContainer.Child != null)
  565. {
  566. PropertyContainer.Child = empytPanel;
  567. }
  568. if (senderBtn.IsChecked == true)
  569. {
  570. pdfViewControl.PDFView?.SetMouseMode(MouseModes.Viewer);
  571. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditText);
  572. pdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.EditText);
  573. pdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
  574. pdfViewControl.PDFView?.ReloadDocument();
  575. }
  576. else
  577. {
  578. pdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.None);
  579. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditImage | CPDFEditType.EditText);
  580. pdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
  581. pdfViewControl.PDFView?.ReloadDocument();
  582. }
  583. }
  584. }
  585. /// <summary>
  586. /// 图片编辑模式
  587. /// </summary>
  588. private void PDFImageEditButton_Click(object sender, RoutedEventArgs e)
  589. {
  590. ToggleButton senderBtn = sender as ToggleButton;
  591. if (senderBtn != null && pdfViewControl != null)
  592. {
  593. ClearPDFEditState(senderBtn);
  594. senderBtn.IsChecked = false;
  595. OpenFileDialog openFileDialog = new OpenFileDialog();
  596. openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
  597. if (openFileDialog.ShowDialog() == true)
  598. {
  599. pdfViewControl.PDFView?.ClearSelectPDFEdit();
  600. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditImage | CPDFEditType.EditText);
  601. pdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
  602. pdfViewControl.PDFView?.ReloadDocument();
  603. RightPanelBtn.IsChecked = false;
  604. if (PropertyContainer.Child != null)
  605. {
  606. PropertyContainer.Child = empytPanel;
  607. }
  608. PropertyContainer.Visibility = Visibility.Collapsed;
  609. pdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.EditImage);
  610. pdfViewControl.PDFView?.AddPDFEditImage(openFileDialog.FileName);
  611. }
  612. }
  613. }
  614. /// <summary>
  615. /// 清除编辑相关按钮选中状态
  616. /// </summary>
  617. private void ClearPDFEditState(ToggleButton ignoreBtn = null)
  618. {
  619. List<ToggleButton> clearBtnList = new List<ToggleButton>()
  620. {
  621. PDFTextEditButton,
  622. PDFImageEditButton
  623. };
  624. foreach (ToggleButton item in clearBtnList)
  625. {
  626. if (ignoreBtn == item)
  627. {
  628. continue;
  629. }
  630. item.IsChecked = false;
  631. }
  632. }
  633. /// <summary>
  634. /// 撤销操作
  635. /// </summary>
  636. private void UndoBtn_Click(object sender, RoutedEventArgs e)
  637. {
  638. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  639. {
  640. pdfViewControl.PDFView.UndoManager?.Undo();
  641. }
  642. }
  643. /// <summary>
  644. /// 重做操作
  645. /// </summary>
  646. private void RedoBtn_Click(object sender, RoutedEventArgs e)
  647. {
  648. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  649. {
  650. pdfViewControl.PDFView.UndoManager?.Redo();
  651. }
  652. }
  653. /// <summary>
  654. /// 文字编辑右键菜单
  655. /// </summary>
  656. private void PDFEditTextContextMenu(object sender, PDFEditCommand editCommand)
  657. {
  658. editCommand.PopupMenu = new ContextMenu();
  659. if (lastPDFEditEvent != null)
  660. {
  661. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Copy", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
  662. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Cut", Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
  663. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Delete", Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
  664. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Paste", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
  665. //MenuItem propertyMenu = new MenuItem();
  666. //propertyMenu.Header = "Property";
  667. //propertyMenu.Click += (o, p) =>
  668. //{
  669. // if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditText)
  670. // {
  671. // PDFTextEditControl textEditControl = new PDFTextEditControl();
  672. // textEditControl.SetPDFTextEditData(lastPDFEditEvent);
  673. // PropertyContainer.Child = textEditControl;
  674. // PropertyContainer.Visibility = Visibility.Visible;
  675. // }
  676. //};
  677. //editCommand.PopupMenu.Items.Add(propertyMenu);
  678. }
  679. else
  680. {
  681. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Paste", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
  682. if (editCommand.TextAreaCopied)
  683. {
  684. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Paste And Match Style", Command = CustomCommands.PasteMatchStyle, CommandTarget = (UIElement)sender });
  685. }
  686. }
  687. }
  688. /// <summary>
  689. /// 图片编辑右键菜单
  690. /// </summary>
  691. private void PDFEditImageContextMenu(object sender, PDFEditCommand editCommand)
  692. {
  693. editCommand.PopupMenu = new ContextMenu();
  694. if(ApplicationCommands.Copy.CanExecute(null,(UIElement)sender) && lastPDFEditEvent!=null )
  695. {
  696. MenuItem rotateLeftMenu = new MenuItem();
  697. rotateLeftMenu.Header = "Rotate Left";
  698. rotateLeftMenu.Click += (o, p) =>
  699. {
  700. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  701. {
  702. lastPDFEditEvent.Rotate = -90;
  703. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  704. imageEditControl?.SetImageThumb();
  705. }
  706. };
  707. editCommand.PopupMenu.Items.Add(rotateLeftMenu);
  708. MenuItem rotateRightMenu = new MenuItem();
  709. rotateRightMenu.Header = "Rotate Right";
  710. rotateRightMenu.Click += (o, p) =>
  711. {
  712. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  713. {
  714. lastPDFEditEvent.Rotate = 90;
  715. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  716. imageEditControl?.SetImageThumb();
  717. }
  718. };
  719. editCommand.PopupMenu.Items.Add(rotateRightMenu);
  720. MenuItem replaceMenu = new MenuItem();
  721. replaceMenu.Header = "Replace";
  722. replaceMenu.Click += (o, p) =>
  723. {
  724. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  725. {
  726. OpenFileDialog openFileDialog = new OpenFileDialog();
  727. openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
  728. if (openFileDialog.ShowDialog() == true)
  729. {
  730. lastPDFEditEvent.ReplaceImagePath = openFileDialog.FileName;
  731. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  732. pdfViewControl.PDFView?.ClearSelectPDFEdit();
  733. }
  734. }
  735. };
  736. editCommand.PopupMenu.Items.Add(replaceMenu);
  737. MenuItem exportMenu = new MenuItem();
  738. exportMenu.Header = "Export";
  739. exportMenu.Click += (o, p) =>
  740. {
  741. if (pdfViewControl != null && pdfViewControl.PDFView != null)
  742. {
  743. Dictionary<int, List<Bitmap>> imageDict = pdfViewControl.PDFView.GetSelectedImages();
  744. if (imageDict != null && imageDict.Count > 0)
  745. {
  746. System.Windows.Forms.FolderBrowserDialog folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
  747. if (folderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  748. {
  749. string choosePath = folderBrowser.SelectedPath;
  750. string openPath = choosePath;
  751. try
  752. {
  753. foreach (int pageIndex in imageDict.Keys)
  754. {
  755. List<Bitmap> imageList = imageDict[pageIndex];
  756. foreach (Bitmap image in imageList)
  757. {
  758. string savePath = System.IO.Path.Combine(choosePath, Guid.NewGuid() + ".jpg");
  759. image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  760. openPath = savePath;
  761. }
  762. }
  763. Process.Start("explorer", "/select,\"" + openPath + "\"");
  764. }
  765. catch (Exception ex)
  766. {
  767. }
  768. }
  769. }
  770. }
  771. };
  772. editCommand.PopupMenu.Items.Add(exportMenu);
  773. MenuItem opacityMenu = new MenuItem();
  774. opacityMenu.Header = "Opacity";
  775. editCommand.PopupMenu.Items.Add(opacityMenu);
  776. AppendOpacityMenu(opacityMenu);
  777. MenuItem horizonMirror = new MenuItem();
  778. horizonMirror.Header = "Flip horizontal";
  779. horizonMirror.Click += (o, p) =>
  780. {
  781. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  782. {
  783. lastPDFEditEvent.HorizontalMirror = true;
  784. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  785. imageEditControl?.SetImageThumb();
  786. }
  787. };
  788. editCommand.PopupMenu.Items.Add(horizonMirror);
  789. MenuItem verticalMirror = new MenuItem();
  790. verticalMirror.Header = "Flip vertical";
  791. verticalMirror.Click += (o, p) =>
  792. {
  793. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  794. {
  795. lastPDFEditEvent.VerticalMirror = true;
  796. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  797. imageEditControl?.SetImageThumb();
  798. }
  799. };
  800. editCommand.PopupMenu.Items.Add(verticalMirror);
  801. MenuItem cropMenu = new MenuItem();
  802. cropMenu.Header = "Crop";
  803. cropMenu.Click += (o, p) =>
  804. {
  805. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  806. {
  807. lastPDFEditEvent.ClipImage = true;
  808. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  809. }
  810. };
  811. editCommand.PopupMenu.Items.Add(cropMenu);
  812. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Copy", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
  813. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Cut", Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
  814. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Delete", Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
  815. }
  816. else
  817. {
  818. editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "Paste", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
  819. }
  820. }
  821. /// <summary>
  822. /// 图片编辑透明度二级菜单
  823. /// </summary>
  824. private void AppendOpacityMenu(MenuItem parentMenu)
  825. {
  826. List<int> opacityList = new List<int>()
  827. {
  828. 25,50,75,100
  829. };
  830. foreach (int opacity in opacityList)
  831. {
  832. MenuItem opacityMenu = new MenuItem();
  833. opacityMenu.Header = string.Format("{0}%", opacity);
  834. opacityMenu.Click += (o, p) =>
  835. {
  836. if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
  837. {
  838. lastPDFEditEvent.Transparency = (int)(opacity * 255 / 100D);
  839. lastPDFEditEvent.UpdatePDFEditByEventArgs();
  840. imageEditControl?.SetImageTransparency(lastPDFEditEvent.Transparency);
  841. imageEditControl?.SetImageThumb();
  842. }
  843. };
  844. parentMenu.Items.Add(opacityMenu);
  845. }
  846. }
  847. /// <summary>
  848. /// 进入文字和图片编辑
  849. /// </summary>
  850. private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  851. {
  852. SetEditMode();
  853. }
  854. private void SetEditMode()
  855. {
  856. ClearPDFEditState(null);
  857. if (pdfViewControl != null && ViewComboBox != null)
  858. {
  859. if (ViewComboBox.SelectedIndex == 0)
  860. {
  861. PDFEditTool.Visibility = Visibility.Collapsed;
  862. pdfViewControl.PDFView?.SetShowLink(true);
  863. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.None);
  864. pdfViewControl.PDFView?.SetMouseMode(MouseModes.Viewer);
  865. pdfViewControl.PDFView?.ReloadDocument();
  866. if (PropertyContainer != null)
  867. {
  868. PropertyContainer.Child = null;
  869. }
  870. return;
  871. }
  872. if (ViewComboBox.SelectedIndex == 1)
  873. {
  874. PDFEditTool.Visibility = Visibility.Visible;
  875. pdfViewControl.PDFView?.SetShowLink(false);
  876. pdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditText | CPDFEditType.EditImage);
  877. pdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.None);
  878. pdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
  879. pdfViewControl.PDFView?.ReloadDocument();
  880. }
  881. }
  882. }
  883. private void CopyImage_Click(object sender, RoutedEventArgs e)
  884. {
  885. try
  886. {
  887. Dictionary<int, List<Bitmap>> imageDict = pdfViewControl.PDFView?.GetSelectedImages();
  888. if (imageDict != null && imageDict.Count > 0)
  889. {
  890. foreach (int pageIndex in imageDict.Keys)
  891. {
  892. List<Bitmap> imageList = imageDict[pageIndex];
  893. foreach (Bitmap image in imageList)
  894. {
  895. MemoryStream ms = new MemoryStream();
  896. image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  897. BitmapImage imageData = new BitmapImage();
  898. imageData.BeginInit();
  899. imageData.StreamSource = ms;
  900. imageData.CacheOption = BitmapCacheOption.OnLoad;
  901. imageData.EndInit();
  902. imageData.Freeze();
  903. Clipboard.SetImage(imageData);
  904. break;
  905. }
  906. }
  907. }
  908. }
  909. catch (Exception ex)
  910. {
  911. }
  912. }
  913. private void ExtraImage_Click(object sender, RoutedEventArgs e)
  914. {
  915. System.Windows.Forms.FolderBrowserDialog folderDialog = new System.Windows.Forms.FolderBrowserDialog();
  916. if (folderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  917. {
  918. string choosePath = folderDialog.SelectedPath;
  919. string openPath = choosePath;
  920. try
  921. {
  922. Dictionary<int, List<Bitmap>> imageDict = pdfViewControl.PDFView?.GetSelectedImages();
  923. if (imageDict != null && imageDict.Count > 0)
  924. {
  925. foreach (int pageIndex in imageDict.Keys)
  926. {
  927. List<Bitmap> imageList = imageDict[pageIndex];
  928. foreach (Bitmap image in imageList)
  929. {
  930. string savePath = Path.Combine(choosePath, Guid.NewGuid() + ".jpg");
  931. image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  932. openPath = savePath;
  933. }
  934. }
  935. }
  936. Process.Start("explorer", "/select,\"" + openPath + "\"");
  937. }
  938. catch (Exception ex)
  939. {
  940. }
  941. }
  942. }
  943. private void SaveFile()
  944. {
  945. if (pdfViewControl != null && pdfViewControl.PDFView != null && pdfViewControl.PDFView.Document != null)
  946. {
  947. try
  948. {
  949. CPDFDocument pdfDoc = pdfViewControl.PDFView.Document;
  950. if (pdfDoc.WriteToLoadedPath())
  951. {
  952. return;
  953. }
  954. SaveFileDialog saveDialog = new SaveFileDialog();
  955. saveDialog.Filter = "(*.pdf)|*.pdf";
  956. saveDialog.DefaultExt = ".pdf";
  957. saveDialog.OverwritePrompt = true;
  958. if (saveDialog.ShowDialog() == true)
  959. {
  960. pdfDoc.WriteToFilePath(saveDialog.FileName);
  961. }
  962. }
  963. catch (Exception ex)
  964. {
  965. }
  966. }
  967. }
  968. protected override void OnClosing(CancelEventArgs e)
  969. {
  970. if (pdfViewControl.PDFView.UndoManager.CanSave)
  971. {
  972. MessageBoxResult result = MessageBox.Show("Do you want to save your changes before closing the application?", "Message", MessageBoxButton.YesNoCancel);
  973. if (result == MessageBoxResult.Yes)
  974. {
  975. SaveFile();
  976. }
  977. else if (result == MessageBoxResult.No)
  978. {
  979. }
  980. else
  981. {
  982. e.Cancel = true;
  983. }
  984. }
  985. }
  986. private void RightPanelBtn_Click(object sender, RoutedEventArgs e)
  987. {
  988. ViewSettingBtn.IsChecked=false;
  989. ToggleButton toggleButton = sender as ToggleButton;
  990. if (toggleButton != null)
  991. {
  992. if (toggleButton.IsChecked == true)
  993. {
  994. if(PropertyContainer.Child is CPDFDisplaySettingsControl)
  995. {
  996. PropertyContainer.Child = prevPanel;
  997. }
  998. if(PropertyContainer.Child==null)
  999. {
  1000. PropertyContainer.Child = empytPanel;
  1001. }
  1002. PropertyContainer.Visibility = Visibility.Visible;
  1003. }
  1004. else
  1005. {
  1006. PropertyContainer.Visibility = Visibility.Collapsed;
  1007. }
  1008. }
  1009. }
  1010. }
  1011. }