MainWindow.xaml.cs 43 KB

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