PageEditContentViewModel.cs 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554
  1. using Prism.Mvvm;
  2. using Prism.Regions;
  3. using Prism.Services.Dialogs;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Media;
  10. using ComPDFKitViewer.PdfViewer;
  11. using PDF_Office.Model;
  12. using System.Collections.ObjectModel;
  13. using PDF_Office.Model.PageEdit;
  14. using Prism.Commands;
  15. using System.Windows;
  16. using System.Windows.Media.Imaging;
  17. using System.Windows.Controls.Primitives;
  18. using System.Diagnostics;
  19. using System.Windows.Controls;
  20. using System.Windows.Threading;
  21. using Prism.Events;
  22. using PDF_Office.EventAggregators;
  23. using System.Windows.Input;
  24. using PDF_Office.Helper;
  25. using Microsoft.Win32;
  26. using ComPDFKit.PDFDocument;
  27. using PDF_Office.CustomControl;
  28. using PDF_Office.Model.HomePageToolsDialogs;
  29. using System.IO;
  30. namespace PDF_Office.ViewModels.PageEdit
  31. {
  32. public class PageEditContentViewModel : BindableBase, INavigationAware
  33. {
  34. private CPDFViewer PDFViewer;
  35. private ViewContentViewModel viewContentViewModel;
  36. private IDialogService dialogs;
  37. private IEventAggregator eventor;
  38. /// <summary>
  39. /// 用于筛选多窗体时间的唯一识别码
  40. /// </summary>
  41. private string unicode = null;
  42. /// <summary>
  43. /// Undo操作记录栈
  44. /// 只有插入、移位、旋转,倒序需要记录
  45. /// </summary>
  46. private Stack<PageEditItem> UndoStack = new Stack<PageEditItem>();
  47. /// <summary>
  48. /// Redo操作记录栈
  49. /// </summary>
  50. private Stack<PageEditItem> RedoStack = new Stack<PageEditItem>();
  51. /// <summary>
  52. /// 项数据集合
  53. /// </summary>
  54. public ObservableCollection<PageEditItem> PageEditItems { get; set; }
  55. /// <summary>
  56. /// 页面范围的项集合
  57. /// </summary>
  58. public ObservableCollection<string> PageRangeItems { get; set; }
  59. #region 属性
  60. /// <summary>
  61. /// 是否是第一次加载
  62. /// </summary>
  63. private bool isFirstLoad = true;
  64. /// <summary>
  65. /// 记录多选项中最后一项的索引
  66. /// </summary>
  67. private int maxSelectedIndex = 0;
  68. private Visibility showTip = Visibility.Collapsed;
  69. /// <summary>
  70. /// 是否显示渐隐提示
  71. /// </summary>
  72. public Visibility ShowTip
  73. {
  74. get { return showTip; }
  75. set
  76. {
  77. SetProperty(ref showTip, value);
  78. }
  79. }
  80. private Visibility isLoading = Visibility.Collapsed;
  81. /// <summary>
  82. /// 是否正在处理中
  83. /// </summary>
  84. public Visibility IsLoading
  85. {
  86. get { return isLoading; }
  87. set
  88. {
  89. SetProperty(ref isLoading, value);
  90. }
  91. }
  92. private int listSelecedIndex;
  93. /// <summary>
  94. /// 缩略图选中项的索引
  95. /// </summary>
  96. public int ListSelectedIndex
  97. {
  98. get { return listSelecedIndex; }
  99. set
  100. {
  101. SetProperty(ref listSelecedIndex, value);
  102. //显示页面范围选择控件
  103. TbPageRangeVisibility = Visibility.Visible;
  104. TbPageRange = (ListSelectedIndex + 1).ToString();
  105. TxtPageInputVisibility = Visibility.Collapsed;
  106. if(IsBOTAThumb==Visibility.Visible&&PDFViewer!=null)
  107. {
  108. PDFViewer.GoToPage(listSelecedIndex);
  109. }
  110. }
  111. }
  112. private bool isMultiSelected;
  113. /// <summary>
  114. /// 是否有多选 用于判断倒序和替换功能
  115. /// </summary>
  116. public bool IsMultiSelected
  117. {
  118. get { return isMultiSelected; }
  119. set
  120. {
  121. SetProperty(ref isMultiSelected, value);
  122. }
  123. }
  124. private int comboxSelectIndex;
  125. /// <summary>
  126. /// 下拉框选项集合
  127. /// </summary>
  128. public int ComboxSelectIndex
  129. {
  130. get { return comboxSelectIndex; }
  131. set
  132. {
  133. SetProperty(ref comboxSelectIndex, value);
  134. //选中指定的页面范围
  135. SuitPageRange(comboxSelectIndex);
  136. //隐藏tb页面范围显示控件
  137. TbPageRangeVisibility = Visibility.Collapsed;
  138. }
  139. }
  140. private Visibility tbPageRangeVisibility = Visibility.Visible;
  141. /// <summary>
  142. /// 页面范围的文本显示
  143. /// </summary>
  144. public Visibility TbPageRangeVisibility
  145. {
  146. get { return tbPageRangeVisibility; }
  147. set
  148. {
  149. SetProperty(ref tbPageRangeVisibility, value);
  150. if (value == Visibility.Visible)
  151. {
  152. comboxSelectIndex = -1;
  153. }
  154. }
  155. }
  156. private string tbPageRange;
  157. /// <summary>
  158. /// 页面范围显示的内容
  159. /// </summary>
  160. public string TbPageRange
  161. {
  162. get { return tbPageRange; }
  163. set
  164. {
  165. SetProperty(ref tbPageRange, value);
  166. }
  167. }
  168. private Visibility txtPageInputVisibility = Visibility.Collapsed;
  169. /// <summary>
  170. /// 页面自定义输入框的显示
  171. /// </summary>
  172. public Visibility TxtPageInputVisibility
  173. {
  174. get { return txtPageInputVisibility; }
  175. set
  176. {
  177. SetProperty(ref txtPageInputVisibility, value);
  178. }
  179. }
  180. /// <summary>
  181. /// 页面缩放状态,-1 为最小值,1为最大值
  182. /// </summary>
  183. private int zoomIndex = 0;
  184. public int ZoomIndex
  185. {
  186. get { return zoomIndex; }
  187. set
  188. {
  189. SetProperty(ref zoomIndex, value);
  190. }
  191. }
  192. private string toastText;
  193. /// <summary>
  194. /// Toast提示
  195. /// </summary>
  196. public string ToastText
  197. {
  198. get { return toastText; }
  199. set
  200. {
  201. SetProperty(ref toastText, value);
  202. }
  203. }
  204. private Visibility isBOTAThumb = Visibility.Collapsed;
  205. /// <summary>
  206. /// 是否是BOTA侧边栏的缩略图
  207. /// </summary>
  208. public Visibility IsBOTAThumb
  209. {
  210. get { return isBOTAThumb; }
  211. set
  212. {
  213. SetProperty(ref isBOTAThumb, value);
  214. }
  215. }
  216. #endregion
  217. #region 命令
  218. public DelegateCommand<object> SelectionChangedCommand { get; set; }
  219. /// <summary>
  220. /// 拦截键盘输入的事件
  221. /// </summary>
  222. public DelegateCommand<object> PreviewKeyDown { get; set; }
  223. /// <summary>
  224. /// 响应键盘回车事件
  225. /// </summary>
  226. public DelegateCommand<object> KeyDown { get; set; }
  227. /// <summary>
  228. /// 替换文件
  229. /// </summary>
  230. public DelegateCommand ReplaceCommand { get; set; }
  231. /// <summary>
  232. /// 插入文件命令
  233. /// </summary>
  234. public DelegateCommand<object> InsertCommand { get; set; }
  235. /// <summary>
  236. /// 拆分文件
  237. /// </summary>
  238. public DelegateCommand SplitCommand { get; set; }
  239. /// <summary>
  240. /// 提取文件
  241. /// </summary>
  242. public DelegateCommand ExtractCommand { get; set; }
  243. /// <summary>
  244. /// 逆时针旋转
  245. /// </summary>
  246. public DelegateCommand LeftRotateCommand { get; set; }
  247. /// <summary>
  248. /// 顺时针旋转
  249. /// </summary>
  250. public DelegateCommand RightRotateCommand { get; set; }
  251. /// <summary>
  252. /// 删除
  253. /// </summary>
  254. public DelegateCommand DeleteCommand { get; set; }
  255. /// <summary>
  256. /// 倒序
  257. /// </summary>
  258. public DelegateCommand ReverseCommand { get; set; }
  259. /// <summary>
  260. /// 放大
  261. /// </summary>
  262. public DelegateCommand ZoomInCommand { get; set; }
  263. /// <summary>
  264. /// 缩小
  265. /// </summary>
  266. public DelegateCommand ZoomOutCommand { get; set; }
  267. #endregion
  268. public PageEditContentViewModel(IDialogService dialogService, IEventAggregator eventAggregator)
  269. {
  270. //变量初始化
  271. dialogs = dialogService;
  272. eventor = eventAggregator;
  273. unicode = App.mainWindowViewModel.SelectedItem.Unicode;
  274. PageEditItems = new ObservableCollection<PageEditItem>();
  275. PageRangeItems = new ObservableCollection<string>();
  276. //绑定命令
  277. SelectionChangedCommand = new DelegateCommand<object>(SelectionChangedEvent);
  278. PreviewKeyDown = new DelegateCommand<object>(PreviewKeyDownEvent);
  279. KeyDown = new DelegateCommand<object>(KeyDownEvent);
  280. SplitCommand = new DelegateCommand(SplitCommandEvent);
  281. InsertCommand = new DelegateCommand<object>(InsertCommandEvent);
  282. ReplaceCommand = new DelegateCommand(ReplaceCommandEvent, CanReplaceCommandExcute).ObservesProperty(() => IsMultiSelected);
  283. ExtractCommand = new DelegateCommand(ExtractCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
  284. DeleteCommand = new DelegateCommand(DeleteCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
  285. LeftRotateCommand = new DelegateCommand(LeftRotateCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
  286. RightRotateCommand = new DelegateCommand(RightRotateCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
  287. ReverseCommand = new DelegateCommand(ReverseCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
  288. ZoomInCommand = new DelegateCommand(ZoomInCommandEvent, CanZoomIn).ObservesProperty(() => ZoomIndex);
  289. ZoomOutCommand = new DelegateCommand(ZoomOutCommandEvent, CanZoomOut).ObservesProperty(() => ZoomIndex);
  290. //订阅页面刷新事件
  291. eventAggregator.GetEvent<PageEditRefreshEvent>().Subscribe(OnPageEditRefreshEvent, e => e.Unicode == unicode);
  292. RefreshPageRangeItem();
  293. }
  294. #region 事件
  295. /// <summary>
  296. /// 替换功能的逻辑
  297. /// </summary>
  298. private async void ReplaceCommandEvent()
  299. {
  300. OpenFileDialog dialog = new OpenFileDialog();
  301. dialog.Multiselect = false;
  302. dialog.Filter = PDF_Office.Properties.Resources.OpenDialogFilter;
  303. if ((bool)dialog.ShowDialog())
  304. {
  305. IsLoading = Visibility.Visible;
  306. await Task.Delay(200);
  307. int pageCount = PDFViewer.Document.PageCount;
  308. int insertIndex = listSelecedIndex;
  309. //从文件插入到指定位置
  310. var result = await InsertFromFile(listSelecedIndex+1,dialog.FileName);
  311. if(result)
  312. {
  313. //插入成功后再删除原有页面
  314. DoRemoveSelectedPages(new List<int>() { listSelecedIndex });
  315. }
  316. ReloadAfterOption(true, true, Tuple.Create(insertIndex-1, insertIndex + pageCount));
  317. IsLoading = Visibility.Collapsed;
  318. }
  319. }
  320. /// <summary>
  321. /// 拆分功能的逻辑
  322. /// </summary>
  323. private void SplitCommandEvent()
  324. {
  325. DialogParameters valuePairs = new DialogParameters();
  326. valuePairs.Add(ParameterNames.PDFViewer, PDFViewer);
  327. dialogs.ShowDialog(DialogNames.SplitDialog, valuePairs,e=> {
  328. if(e.Result==ButtonResult.OK&&e.Parameters!=null)
  329. {
  330. var model = e.Parameters.GetValue<HomePageSplitDialogModel>(ParameterNames.DataModel);
  331. DoSplitPages(model);
  332. }
  333. });
  334. }
  335. /// <summary>
  336. /// 提取功能的逻辑
  337. /// </summary>
  338. private void ExtractCommandEvent()
  339. {
  340. dialogs.ShowDialog(DialogNames.ExtractDialog,null,e=> {
  341. if(e.Result==ButtonResult.OK&&e.Parameters!=null)
  342. {
  343. var model = e.Parameters.GetValue<ExtractModel>(ParameterNames.DataModel);
  344. DoExtractPages(model.IsEveryPageToFile,model.IsDeleteAfterExtract);
  345. }
  346. });
  347. }
  348. /// <summary>
  349. /// 插入功能的逻辑
  350. /// </summary>
  351. private async void InsertCommandEvent(object type)
  352. {
  353. if((string)type==null)
  354. {
  355. return;
  356. }
  357. //获取插入位置
  358. int insertIndex = 0;
  359. if(listSelecedIndex<0)
  360. {
  361. insertIndex = 0;
  362. }
  363. else
  364. {
  365. insertIndex = listSelecedIndex+1;
  366. if(isMultiSelected)
  367. {
  368. insertIndex = maxSelectedIndex+1;
  369. }
  370. }
  371. IsLoading = Visibility.Visible;
  372. await Task.Delay(3);
  373. if((string)type==ParameterNames.InsertType_Blank)
  374. {
  375. //插入空白页面
  376. bool result;
  377. if (insertIndex == 0)
  378. {
  379. result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex].Size.Width, PageEditItems[insertIndex].Size.Height, null);
  380. }
  381. else
  382. {
  383. result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex-1].Size.Width, PageEditItems[insertIndex-1].Size.Height, null);
  384. }
  385. if(!result)
  386. {
  387. IsLoading = Visibility.Collapsed;
  388. ShowTip = Visibility.Visible;
  389. return;
  390. }
  391. //UI层插入Item
  392. var item = GetNewPageEditItem(insertIndex);
  393. PageEditItems.Insert(insertIndex,item);
  394. ReloadAfterOption(true,true,Tuple.Create(insertIndex,insertIndex+1));
  395. await Task.Delay(10);
  396. ListSelectedIndex = insertIndex == 0 ? insertIndex : insertIndex;
  397. }
  398. else if((string)type == ParameterNames.InsertType_File)
  399. {
  400. OpenFileDialog dialog = new OpenFileDialog();
  401. dialog.Multiselect = false;
  402. dialog.Filter = PDF_Office.Properties.Resources.OpenDialogFilter;
  403. if ((bool)dialog.ShowDialog())
  404. {
  405. //插入文件
  406. var result = await InsertFromFile(insertIndex,dialog.FileName);
  407. if(!result)
  408. {
  409. IsLoading = Visibility.Collapsed;
  410. ShowTip = Visibility.Visible;
  411. return;
  412. }
  413. ReloadAfterOption(true,true,Tuple.Create(0,PDFViewer.Document.PageCount));
  414. }
  415. }
  416. else
  417. {
  418. //插入自定义页面
  419. dialogs.ShowDialog(DialogNames.InsertDialog, null, null);
  420. }
  421. IsLoading = Visibility.Collapsed;
  422. }
  423. /// <summary>
  424. /// 删除选中页面
  425. /// </summary>
  426. private async void DeleteCommandEvent()
  427. {
  428. IsLoading = Visibility.Visible;
  429. await Task.Delay(3);
  430. DoRemoveSelectedPages();
  431. ReloadAfterOption(true, true, Tuple.Create(0,PDFViewer.Document.PageCount));
  432. IsLoading = Visibility.Collapsed;
  433. }
  434. /// <summary>
  435. /// 左旋转页面的逻辑
  436. /// </summary>
  437. private void LeftRotateCommandEvent()
  438. {
  439. RotateSelectedPages(false);
  440. }
  441. /// <summary>
  442. /// 右旋转页面的逻辑
  443. /// </summary>
  444. private void RightRotateCommandEvent()
  445. {
  446. RotateSelectedPages();
  447. }
  448. /// <summary>
  449. /// 页面倒序的逻辑
  450. /// </summary>
  451. private async void ReverseCommandEvent()
  452. {
  453. IsLoading = Visibility.Visible;
  454. await Task.Delay(3);
  455. List<int> pages = new List<int>();
  456. for (int i = 0; i <PageEditItems.Count; i++)
  457. {
  458. if (PageEditItems[i].Selected)
  459. {
  460. pages.Add(i);
  461. }
  462. }
  463. if(pages.Count<=1)
  464. {
  465. ShowToast("请至少选择两个图片进行倒序操作。");
  466. return;
  467. }
  468. pages.Sort();
  469. for (int i = 0; i < pages.Count; i++)
  470. {
  471. int preindex = pages[i];
  472. int laterIndex = pages[pages.Count - i - 1];//尾部的索引
  473. if (laterIndex <= preindex)//交换完成
  474. {
  475. break;
  476. }
  477. var sourceitem = PageEditItems[preindex];
  478. var targetitem = PageEditItems[laterIndex];
  479. var result = PDFViewer.Document.ExchangePage(preindex, laterIndex);
  480. if(!result)
  481. {
  482. ShowTip = Visibility.Visible;
  483. IsLoading = Visibility.Collapsed;
  484. return;
  485. }
  486. PageEditItems.Remove(sourceitem);
  487. PageEditItems.Remove(targetitem);
  488. PageEditItems.Insert(preindex, targetitem);
  489. PageEditItems.Insert(laterIndex, sourceitem);
  490. }
  491. await Task.Delay(20);
  492. for(int i=0;i<pages.Count;i++)
  493. {
  494. PageEditItems[i].Selected = true;
  495. }
  496. ReloadAfterOption(true,true,null);
  497. IsLoading = Visibility.Collapsed;
  498. }
  499. /// <summary>
  500. /// 是否可以执行文件操作命令 除插入、拆分外
  501. /// </summary>
  502. /// <returns></returns>
  503. private bool CanFileCommandExcute()
  504. {
  505. if (ListSelectedIndex < 0)
  506. {
  507. return false;
  508. }
  509. else
  510. {
  511. return true;
  512. }
  513. }
  514. /// <summary>
  515. /// 校验是否可以替换
  516. /// </summary>
  517. /// <returns></returns>
  518. private bool CanReplaceCommandExcute()
  519. {
  520. return !IsMultiSelected;
  521. }
  522. /// <summary>
  523. /// 放大页面
  524. /// </summary>
  525. private void ZoomInCommandEvent()
  526. {
  527. ChangeItemSize(new Size(PageEditItems[0].ItemSize.Width *2, PageEditItems[0].ItemSize.Height *2));
  528. ZoomIndex++;
  529. NotifyUIToRefresh();
  530. }
  531. /// <summary>
  532. /// 缩小页面
  533. /// </summary>
  534. private void ZoomOutCommandEvent()
  535. {
  536. ChangeItemSize(new Size(PageEditItems[0].ItemSize.Width / 2, PageEditItems[0].ItemSize.Height / 2));
  537. ZoomIndex--;
  538. NotifyUIToRefresh();
  539. }
  540. /// <summary>
  541. ///
  542. /// </summary>
  543. /// <param name="newsize"></param>
  544. public void ChangeItemSize(Size newsize)
  545. {
  546. for (int i = 0; i < PageEditItems.Count; i++)
  547. {
  548. PageEditItems[i].ItemSize = newsize;
  549. }
  550. //缩略图模式 调整item大小的时候,更新选中项
  551. NotifyUIToRefresh(new List<int>() { PDFViewer.CurrentIndex + 1 });
  552. }
  553. private bool CanZoomIn()
  554. {
  555. if (ZoomIndex >= 1)
  556. {
  557. return false;
  558. }
  559. else
  560. {
  561. return true;
  562. }
  563. }
  564. private bool CanZoomOut()
  565. {
  566. if (ZoomIndex <= -1)
  567. {
  568. return false;
  569. }
  570. else
  571. {
  572. return true;
  573. }
  574. }
  575. /// <summary>
  576. /// 响应UI发送刷新图片的事件
  577. /// </summary>
  578. /// <param name="e"></param>
  579. private void OnPageEditRefreshEvent(PageEditRefreshEventArgs e)
  580. {
  581. //UI发送事件过来通知刷新图片时
  582. //调整逻辑,前后预加载5页
  583. RefreshItemImage(e.PageRange.Item1 - 2, e.PageRange.Item2 + 2);
  584. }
  585. /// <summary>
  586. /// 选项改变事件
  587. /// 虚拟化的时候不会触发选中事件
  588. /// </summary>
  589. /// <param name="e"></param>
  590. private void SelectionChangedEvent(object e)
  591. {
  592. //var args = e as SelectionChangedEventArgs;
  593. //var listbox = args.OriginalSource as ListBox;
  594. //if (TbPageRangeVisibility == Visibility.Visible && args != null)
  595. //{
  596. // List<int> pagelist = new List<int>();
  597. // for (int i = 0; i < listbox.SelectedItems.Count; i++)
  598. // {
  599. // if (!pagelist.Contains((listbox.SelectedItems[i] as PageEditItem).PageNumber))
  600. // {
  601. // pagelist.Add((listbox.SelectedItems[i] as PageEditItem).PageNumber);
  602. // }
  603. // }
  604. // ////手动取消其他项的选中状态
  605. // //for (int j = 0; j < PageEditItems.Count; j++)
  606. // //{
  607. // // if (!pagelist.Contains(PageEditItems[j].PageNumber))
  608. // // {
  609. // // PageEditItems[j].Selected = false;
  610. // // }
  611. // //}
  612. // ////根据选中的范围 适配全部页面范围、奇数页面范围等
  613. // //if(pagelist.Count==PageEditItems.Count)
  614. // //{
  615. // // ComboxSelectIndex = 0;
  616. // // return;
  617. // //}
  618. // string pageparm = CommonHelper.GetPageParmFromList(pagelist);
  619. // TbPageRange = pageparm;
  620. //}
  621. //if (listbox.SelectedItem != null)
  622. //{
  623. // listbox.ScrollIntoView(listbox.SelectedItem);
  624. //}
  625. ////判断是否有选中多项
  626. //if (listbox.SelectedItems.Count > 1)
  627. //{
  628. // IsMutiSelected = true;
  629. // maxSelectedIndex = listbox.Items.IndexOf(listbox.SelectedItems[listbox.SelectedItems.Count-1]);
  630. //}
  631. //else
  632. //{
  633. // IsMutiSelected = false;
  634. //}
  635. }
  636. /// <summary>
  637. /// 限制文本框输入内容
  638. /// </summary>
  639. /// <param name="e"></param>
  640. private void PreviewKeyDownEvent(object e)
  641. {
  642. var args = e as KeyEventArgs;
  643. if (args == null)
  644. {
  645. return;
  646. }
  647. if (args.Key != Key.Enter && args.Key != Key.Back && args.Key != Key.OemComma && args.Key != Key.Subtract && !((args.Key >= Key.D0 && args.Key <= Key.D9) || (args.Key >= Key.NumPad0 && args.Key <= Key.NumPad9)))
  648. {
  649. args.Handled = true;
  650. }
  651. }
  652. /// <summary>
  653. /// 响应回车确认事件
  654. /// </summary>
  655. /// <param name="e"></param>
  656. private void KeyDownEvent(object e)
  657. {
  658. var args = e as KeyEventArgs;
  659. if (args == null)
  660. {
  661. return;
  662. }
  663. if (args.Key == Key.Enter)
  664. {
  665. List<int> TargetPageIndexs = new List<int>();
  666. var result = CommonHelper.GetPagesInRange(ref TargetPageIndexs, (args.OriginalSource as TextBox).Text, PDFViewer.Document.PageCount, new char[] { ',', ',' }, new char[] { '-' });
  667. if (!result)
  668. {
  669. AlertsMessage alertsMessage = new AlertsMessage();
  670. alertsMessage.ShowDialog("","请输入有效范围","OK");
  671. return;
  672. }
  673. //选中输入的页面范围
  674. for (int i = 0; i < PageEditItems.Count; i++)
  675. {
  676. if (TargetPageIndexs.Contains(PageEditItems[i].PageNumber - 1))
  677. {
  678. PageEditItems[i].Selected = true;
  679. }
  680. else
  681. {
  682. PageEditItems[i].Selected = false;
  683. }
  684. }
  685. }
  686. }
  687. #endregion
  688. #region 方法
  689. /// <summary>
  690. /// 退出页面编辑面试,回到阅读页
  691. /// </summary>
  692. public void BackToPDFViewer(int PageIndex)
  693. {
  694. PDFViewer.GoToPage(PageIndex);
  695. viewContentViewModel.ExitToolMode();
  696. }
  697. /// <summary>
  698. /// 显示Toast提示
  699. /// </summary>
  700. private void ShowToast(string content)
  701. {
  702. if (!string.IsNullOrEmpty(content))
  703. {
  704. ToastText = content;
  705. }
  706. else
  707. {
  708. ToastText = "操作失败";
  709. }
  710. ShowTip = Visibility.Visible;
  711. }
  712. /// <summary>
  713. /// 通知UI刷新页面范围
  714. /// 或通过xaml来设置选中项
  715. /// </summary>vb nmjvcx
  716. private void NotifyUIToRefresh(List<int> pageRange=null)
  717. {
  718. if (pageRange == null || pageRange.Count <= 0)
  719. {
  720. //通知UI刷新页面范围
  721. eventor.GetEvent<PageEditNotifyEvent>().Publish(new PageEditNotifyEventArgs(unicode));
  722. }
  723. else
  724. {
  725. //通知UI刷新页面范围
  726. eventor.GetEvent<PageEditNotifyEvent>().Publish(new PageEditNotifyEventArgs(unicode,NotifyType.SelectItems,pageRange));
  727. }
  728. }
  729. /// <summary>
  730. /// 删除选中项的方法 不带Reload操作
  731. /// 方便其他逻辑中调用
  732. /// </summary>
  733. private void DoRemoveSelectedPages(List<int> pageList = null)
  734. {
  735. List<int> indexList = new List<int>();
  736. if (pageList == null || pageList.Count < 0)
  737. {
  738. for (int i = 0; i < PageEditItems.Count; i++)
  739. {
  740. if (PageEditItems[i].Selected)
  741. {
  742. indexList.Add(i);
  743. }
  744. }
  745. }
  746. else
  747. {
  748. indexList = pageList;
  749. }
  750. if(indexList.Count>0&& indexList.Count==PDFViewer.Document.PageCount)
  751. {
  752. AlertsMessage alertsMessage = new AlertsMessage();
  753. alertsMessage.ShowDialog("","不能删除所有页面","OK");
  754. return;
  755. }
  756. var result = PDFViewer.Document.RemovePages(indexList.ToArray());
  757. if (!result)
  758. {
  759. ShowTip = Visibility.Visible;
  760. return;
  761. }
  762. //文档层操作成功后再删除UI层
  763. for (int i = indexList.Count - 1; i >= 0; i--)
  764. {
  765. PageEditItems.RemoveAt(indexList[i]);
  766. }
  767. }
  768. /// <summary>
  769. /// 提取选中页面的方法
  770. /// </summary>
  771. /// <param name="isEveryPageToFile">是否每页生成一个文件</param>
  772. /// <param name="isDeleteAfterExtract">是否提取后删除页面</param>
  773. private async void DoExtractPages(bool isEveryPageToFile,bool isDeleteAfterExtract)
  774. {
  775. System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog();
  776. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  777. {
  778. if (string.IsNullOrEmpty(dialog.SelectedPath))
  779. {
  780. AlertsMessage alertsMessage = new AlertsMessage();
  781. alertsMessage.ShowDialog("","","OK");//补充提示文案
  782. return;
  783. }
  784. }
  785. else
  786. return;
  787. string selectedfile = "";
  788. IsLoading = Visibility.Visible;
  789. await Task.Delay(3);
  790. List<int> pagenums = new List<int>();
  791. for(int i=0;i<PageEditItems.Count;i++)
  792. {
  793. if(PageEditItems[i].Selected)
  794. {
  795. pagenums.Add(PageEditItems[i].PageNumber);
  796. }
  797. }
  798. if (isEveryPageToFile)
  799. {
  800. //每页生成的单独的文件
  801. for (int i = 0; i < pagenums.Count; i++)
  802. {
  803. string filename = PDFViewer.Document.FileName + " " + pagenums[i] + ".pdf";
  804. string path = System.IO.Path.Combine(dialog.SelectedPath, filename);
  805. path = CommonHelper.CreateFilePath(path);
  806. selectedfile = path;
  807. CPDFDocument savedoc = CPDFDocument.CreateDocument();
  808. bool result = savedoc.ImportPages(PDFViewer.Document, pagenums[i].ToString());
  809. if (!result)
  810. {
  811. savedoc.Release();
  812. continue;
  813. }
  814. result = savedoc.WriteToFilePath(path);
  815. if (!result)
  816. {
  817. savedoc.Release();
  818. continue;
  819. }
  820. savedoc.Release();//释放内存
  821. }
  822. }
  823. else//全部生成一个文件
  824. {
  825. string filename = PDFViewer.Document.FileName + " " + CommonHelper.GetPageParmFromList(pagenums) + ".pdf";
  826. string path = System.IO.Path.Combine(dialog.SelectedPath, filename);
  827. path = CommonHelper.CreateFilePath(path);
  828. selectedfile = path;
  829. CPDFDocument savedoc = CPDFDocument.CreateDocument();
  830. string range = String.Join(",", pagenums);
  831. bool result = savedoc.ImportPages(PDFViewer.Document, range);
  832. if (!result)
  833. {
  834. ShowTip = Visibility.Visible;
  835. IsLoading = Visibility.Collapsed;
  836. return;
  837. }
  838. result = savedoc.WriteToFilePath(path);
  839. if (!result)
  840. {
  841. ShowTip = Visibility.Visible;
  842. }
  843. savedoc.Release();//释放内存
  844. }
  845. if(isDeleteAfterExtract)
  846. {
  847. DoRemoveSelectedPages();
  848. ReloadAfterOption(true,true,Tuple.Create(0,PDFViewer.Document.PageCount));
  849. }
  850. CommonHelper.ShowFileBrowser(selectedfile);
  851. IsLoading = Visibility.Collapsed;
  852. }
  853. private void DoSplitPages(HomePageSplitDialogModel model)
  854. {
  855. try
  856. {
  857. var pdfViewer = PDFViewer;
  858. System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog();
  859. //dialog.Description = App.MainPageLoader.GetString("Main_OpenFolderNoteWarning"); ;
  860. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  861. {
  862. if (string.IsNullOrEmpty(dialog.SelectedPath))
  863. {
  864. return;
  865. }
  866. }
  867. else
  868. return;
  869. var data = model;
  870. int PageCount = pdfViewer.Document.PageCount;
  871. string selectedfile = "";
  872. if (data.Mode == HomePageSplitDialogModel.SplitMode.AveragePages)
  873. {
  874. int perPages = Convert.ToInt32(data.GetModeCount);
  875. int SplitCount = (int)Math.Ceiling((double)PageCount / (double)perPages);
  876. //TODO:命名规则是否要调整
  877. selectedfile = data.FileName + " " + "1.pdf";
  878. for (int i = 0; i < SplitCount; i++)
  879. {
  880. int startNum = i * perPages + 1;
  881. int endNum = Math.Min(PageCount, (i + 1) * perPages);
  882. string range = startNum.ToString() + "-" + endNum.ToString();
  883. CPDFDocument savedoc = CPDFDocument.CreateDocument();
  884. bool result = savedoc.ImportPages(pdfViewer.Document, range);
  885. if (!result)
  886. {
  887. savedoc.Release();
  888. continue;
  889. }
  890. string filename = data.FileName + " " + (i + 1) + ".pdf";
  891. string path = System.IO.Path.Combine(dialog.SelectedPath, filename);
  892. path = CommonHelper.CreateFilePath(path);
  893. result = savedoc.WriteToFilePath(path);
  894. if (!result)
  895. {
  896. savedoc.Release();
  897. continue;
  898. }
  899. savedoc.Release();
  900. selectedfile = path;
  901. }
  902. }
  903. else if (data.Mode == HomePageSplitDialogModel.SplitMode.AverageFiles)
  904. {
  905. int docCount = Convert.ToInt32(data.GetModeCount);
  906. int avePages = (int)Math.Floor((double)PageCount / (double)docCount);
  907. int remain = PageCount % docCount;
  908. int startNum = 1;
  909. //TODO:命名规则是否要调整
  910. selectedfile = data.FileName + " " + "1.pdf";
  911. for (int i = 0; i < docCount; i++)
  912. {
  913. int endNum = startNum + (avePages - 1);
  914. if (i < remain) endNum++;
  915. endNum = Math.Min(endNum, PageCount);
  916. string range = startNum + "-" + endNum;
  917. startNum = endNum + 1;
  918. string fileName = data.FileName + " " + (i + 1) + ".pdf";
  919. string path = System.IO.Path.Combine(dialog.SelectedPath, fileName);
  920. path = CommonHelper.CreateFilePath(path);
  921. CPDFDocument savedoc = CPDFDocument.CreateDocument();
  922. bool result = savedoc.ImportPages(pdfViewer.Document, range);
  923. if (!result)
  924. {
  925. savedoc.Release();
  926. continue;
  927. }
  928. result = savedoc.WriteToFilePath(path);
  929. if (!result)
  930. {
  931. savedoc.Release();
  932. continue;
  933. }
  934. savedoc.Release();
  935. selectedfile = path;
  936. }
  937. }
  938. else//自定义页码范围
  939. {
  940. string pageRange="";
  941. if (data.PageMode == HomePageSplitDialogModel.PageRangeMode.OddPage)
  942. {
  943. int[] page = new int[(PageCount + 1) / 2];
  944. for (int i = 0; i < page.Length; i++)
  945. {
  946. page[i] = i * 2 + 1;
  947. }
  948. pageRange = string.Join(",", page);
  949. }
  950. else if (data.PageMode == HomePageSplitDialogModel.PageRangeMode.EvenPage)
  951. {
  952. int[] page = new int[PageCount / 2];
  953. for (int i = 0; i < page.Length; i++)
  954. {
  955. page[i] = i * 2 + 2;
  956. }
  957. pageRange = string.Join(",", page);
  958. }
  959. List<int> pageList1 = new List<int>();
  960. //如果是自定义输入页面范围的话,直接解析
  961. CommonHelper.GetPagesInRange(ref pageList1, pageRange, PageCount, new char[] { ',' }, new char[] { '-' });
  962. //part1
  963. selectedfile = "";
  964. CPDFDocument saveDoc1 = CPDFDocument.CreateDocument();
  965. string filepath = data.FileName + " " + "1.pdf";
  966. string path1 = Path.Combine(dialog.SelectedPath, filepath);
  967. path1 = CommonHelper.CreateFilePath(path1);
  968. bool result = saveDoc1.ImportPages(pdfViewer.Document, pageRange);
  969. if (!result)
  970. {
  971. saveDoc1.Release();
  972. ShowTip = Visibility.Visible;
  973. return;
  974. }
  975. result = saveDoc1.WriteToFilePath(path1);
  976. if (!result)
  977. {
  978. saveDoc1.Release();
  979. ShowTip = Visibility.Visible;
  980. return;
  981. }
  982. saveDoc1.Release();
  983. //Part2
  984. List<int> pageList2 = new List<int>();
  985. for (int i = 1; i <= pdfViewer.Document.PageCount; i++)
  986. {
  987. if (!pageList1.Contains(i - 1))//pagelist1 存放的是index
  988. pageList2.Add(i);
  989. }
  990. string pageRange2 = string.Join(",", pageList2);
  991. CPDFDocument saveDoc2 = CPDFDocument.CreateDocument();
  992. string filepath2 = data.FileName + " " + "2.pdf";
  993. string path2 = Path.Combine(dialog.SelectedPath, filepath2);
  994. path2 = CommonHelper.CreateFilePath(path2);
  995. result = saveDoc2.ImportPages(pdfViewer.Document, pageRange2);
  996. if (!result)
  997. {
  998. saveDoc2.Release();
  999. ShowTip = Visibility.Visible;
  1000. return;
  1001. }
  1002. result = saveDoc2.WriteToFilePath(path2);
  1003. if (!result)
  1004. {
  1005. saveDoc2.Release();
  1006. ShowTip = Visibility.Visible;
  1007. return;
  1008. }
  1009. selectedfile = path1;
  1010. saveDoc2.Release();
  1011. }
  1012. //显示文件夹,并选中一个文件
  1013. Process.Start("explorer", "/select,\"" + selectedfile + "\"");
  1014. }
  1015. catch (Exception ex)
  1016. {
  1017. }
  1018. }
  1019. /// <summary>
  1020. /// 将文件插入到指定位置
  1021. /// </summary>
  1022. /// <param name="insertIndex"></param>
  1023. private async Task<bool> InsertFromFile(int insertIndex,string filePath)
  1024. {
  1025. CPDFDocument doc = CPDFDocument.InitWithFilePath(filePath);
  1026. if (doc == null)
  1027. {
  1028. showTip = Visibility.Visible;
  1029. return false;
  1030. }
  1031. if (doc.IsLocked)
  1032. {
  1033. DialogParameters value = new DialogParameters();
  1034. value.Add(ParameterNames.PDFDocument, doc);
  1035. bool result = true;
  1036. dialogs.ShowDialog(DialogNames.VerifyPassWordDialog, value,e=>
  1037. {
  1038. if (e.Result != ButtonResult.OK)
  1039. {
  1040. result = false;
  1041. }
  1042. });
  1043. if(!result)
  1044. {
  1045. return false;
  1046. }
  1047. }
  1048. int pageCount = doc.PageCount;
  1049. //插入整个新文档
  1050. //文档层插入
  1051. await Task.Run(() =>
  1052. {
  1053. var result = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
  1054. if (!result)
  1055. {
  1056. ShowTip = Visibility.Visible;
  1057. return false;
  1058. }
  1059. //插入成功后释放临时Document对象
  1060. doc.Release();
  1061. return true;
  1062. });
  1063. //UI层插入
  1064. for (int i = 0; i < pageCount; i++)
  1065. {
  1066. var item = GetNewPageEditItem(i);
  1067. PageEditItems.Insert(insertIndex + i, item);
  1068. }
  1069. //加一点延时才能显示选中效果
  1070. await Task.Delay(400);
  1071. for (int i = 0; i < pageCount; i++)
  1072. {
  1073. PageEditItems[insertIndex + i].Selected = true;
  1074. }
  1075. return true;
  1076. }
  1077. /// <summary>
  1078. /// 根据索引创建新的Item
  1079. /// </summary>
  1080. /// <param name="index"></param>
  1081. /// <returns></returns>
  1082. private PageEditItem GetNewPageEditItem(int index)
  1083. {
  1084. PageEditItem item = new PageEditItem();
  1085. if (PDFViewer.Document.PageAtIndex(index).Rotation % 2 != 0)
  1086. {
  1087. ///标记为横向页面
  1088. item.isVertical = false;
  1089. }
  1090. item.PageNumber = index + 1;
  1091. var pagesize = PDFViewer.Document.GetPageSize(index);
  1092. item.Size = pagesize;
  1093. item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
  1094. return item;
  1095. }
  1096. /// <summary>
  1097. /// 进行文件操作后刷新PDFView
  1098. /// 清除undo 栈
  1099. /// 重加载Document
  1100. /// 设置保存状态
  1101. /// </summary>
  1102. /// <param name="needRefreshPageNum">是否需要刷新页码</param>
  1103. /// <param name="needClearUndoHistory">是否需要清空注释Undo栈</param>
  1104. /// <param name="pageRange">需要刷新的页面范围图片</param>
  1105. private void ReloadAfterOption(bool needRefreshPageNum = false, bool needClearUndoHistory = true, Tuple<int, int> pageRange = null)
  1106. {
  1107. if (needRefreshPageNum)
  1108. {
  1109. RefreshPageNum();
  1110. }
  1111. if (needClearUndoHistory)
  1112. {
  1113. PDFViewer.UndoManager.ClearHistory();
  1114. }
  1115. if (pageRange != null)
  1116. {
  1117. if (pageRange.Item2 - pageRange.Item1 > 30)
  1118. {
  1119. //范围较大时,通知UI获取更准确的刷新范围
  1120. NotifyUIToRefresh();
  1121. }
  1122. else
  1123. {
  1124. RefreshItemImage(pageRange.Item1, pageRange.Item2);
  1125. }
  1126. }
  1127. PDFViewer.UndoManager.CanSave = true;
  1128. PDFViewer.ReloadDocument();
  1129. }
  1130. /// <summary>
  1131. /// 旋转所有选中页面
  1132. /// </summary>
  1133. /// <param name="rightRotate"></param>
  1134. private async void RotateSelectedPages(bool rightRotate = true)
  1135. {
  1136. IsLoading = Visibility.Visible;
  1137. await Task.Delay(2);
  1138. for (int i = 0; i < PageEditItems.Count; i++)
  1139. {
  1140. if (PageEditItems[i].Selected)
  1141. {
  1142. //逆时针旋转传 - 1 顺时针旋转传1
  1143. PDFViewer.Document.RotatePage(i, rightRotate ? 1 : -1);
  1144. PDFViewer.Document.ReleasePages(i);
  1145. //重新拿图
  1146. PageEditItems[i].isVertical = !PageEditItems[i].isVertical;
  1147. PageEditItems[i].IsGetImage = false;
  1148. }
  1149. }
  1150. ReloadAfterOption(false, true, Tuple.Create(0, PageEditItems.Count));
  1151. IsLoading = Visibility.Collapsed;
  1152. }
  1153. /// <summary>
  1154. /// 刷新页码
  1155. /// </summary>
  1156. private void RefreshPageNum()
  1157. {
  1158. for (int i = 0; i < PageEditItems.Count; i++)
  1159. {
  1160. PageEditItems[i].PageNumber = i + 1;
  1161. }
  1162. }
  1163. /// <summary>
  1164. /// 刷新页面范围下拉框
  1165. /// </summary>
  1166. private void RefreshPageRangeItem()
  1167. {
  1168. PageRangeItems.Clear();
  1169. PageRangeItems.Add("所有页面");
  1170. PageRangeItems.Add("奇数页");
  1171. PageRangeItems.Add("偶数页");
  1172. PageRangeItems.Add("横向页面");
  1173. PageRangeItems.Add("纵向页面");
  1174. PageRangeItems.Add("自定义");
  1175. }
  1176. /// <summary>
  1177. /// 选中目标页面范围的页面
  1178. /// </summary>
  1179. /// <param name="index">页面范围选中项索引</param>
  1180. private void SuitPageRange(int index)
  1181. {
  1182. switch (index)
  1183. {
  1184. case 0:
  1185. for (int i = 0; i < PageEditItems.Count; i++)
  1186. {
  1187. PageEditItems[i].Selected = true;
  1188. }
  1189. break;
  1190. case 1:
  1191. //奇数页
  1192. for (int i = 0; i < PageEditItems.Count; i++)
  1193. {
  1194. if (i % 2 == 0)
  1195. {
  1196. PageEditItems[i].Selected = true;
  1197. }
  1198. else
  1199. {
  1200. PageEditItems[i].Selected = false;
  1201. }
  1202. }
  1203. break;
  1204. case 2:
  1205. //偶数页
  1206. for (int i = 0; i < PageEditItems.Count; i++)
  1207. {
  1208. if (i % 2 == 0)
  1209. {
  1210. PageEditItems[i].Selected = false;
  1211. }
  1212. else
  1213. {
  1214. PageEditItems[i].Selected = true;
  1215. }
  1216. }
  1217. break;
  1218. case 3://横向页面
  1219. for (int i = 0; i < PageEditItems.Count; i++)
  1220. {
  1221. if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 == 0)
  1222. {
  1223. PageEditItems[i].Selected = false;
  1224. }
  1225. else
  1226. {
  1227. PageEditItems[i].Selected = true;
  1228. }
  1229. }
  1230. break;
  1231. case 4://纵向页面
  1232. for (int i = 0; i < PageEditItems.Count; i++)
  1233. {
  1234. if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 == 0)
  1235. {
  1236. PageEditItems[i].Selected = true;
  1237. }
  1238. else
  1239. {
  1240. PageEditItems[i].Selected = false;
  1241. }
  1242. }
  1243. break;
  1244. case 5://自定义
  1245. //取消所有选中
  1246. ListSelectedIndex = -1;
  1247. TxtPageInputVisibility = Visibility.Visible;
  1248. break;
  1249. default:
  1250. break;
  1251. }
  1252. }
  1253. /// <summary>
  1254. /// 是否显示页面尺寸
  1255. /// </summary>
  1256. /// <param name="show">是或否</param>
  1257. private void ShowPageSize(bool show = true)
  1258. {
  1259. for (int i = 0; i < PageEditItems.Count; i++)
  1260. {
  1261. PageEditItems[i].ShowPageSize = show;
  1262. }
  1263. }
  1264. /// <summary>
  1265. /// 从PDFView获取所有Items集合
  1266. /// </summary>
  1267. private void GetSourceItems(bool isFirstLoad)
  1268. {
  1269. if (isFirstLoad||IsBOTAThumb==Visibility.Visible)
  1270. {
  1271. PageEditItems.Clear();
  1272. for (int i = 0; i < PDFViewer.Document.PageCount; i++)
  1273. {
  1274. var item = GetNewPageEditItem(i);
  1275. PageEditItems.Add(item);
  1276. }
  1277. }
  1278. else
  1279. {
  1280. //后续进来仅刷新图片即可
  1281. for (int i = 0; i < PageEditItems.Count; i++)
  1282. {
  1283. PageEditItems[i].IsGetImage = false;
  1284. }
  1285. }
  1286. }
  1287. /// <summary>
  1288. /// 刷新书签列表
  1289. /// </summary>
  1290. public void RefreshBookMarkList()
  1291. {
  1292. if (PDFViewer != null)
  1293. {
  1294. var booklist = PDFViewer.Document.GetBookmarkList();
  1295. if (booklist == null)
  1296. {
  1297. return;
  1298. }
  1299. //获取所有书签的Index集合
  1300. List<int> marks = new List<int>();
  1301. for (int i = 0; i < booklist.Count; i++)
  1302. {
  1303. marks.Add(booklist[i].PageIndex);
  1304. }
  1305. //不能只遍历marks集合,考虑书签集合元素删除的情况
  1306. for (int k = 0; k < PageEditItems.Count; k++)
  1307. {
  1308. if (marks.Contains(k))
  1309. PageEditItems[k].HaveBookMark = true;
  1310. else
  1311. PageEditItems[k].HaveBookMark = false;
  1312. }
  1313. }
  1314. }
  1315. /// <summary>
  1316. /// 刷新指定范围的图片
  1317. /// </summary>
  1318. /// <param name="startIndex"></param>
  1319. /// <param name="endIndex"></param>
  1320. private async void RefreshItemImage(int startIndex, int endIndex)
  1321. {
  1322. for (int i = startIndex; i <= endIndex; i++)
  1323. {
  1324. if (i <= PDFViewer.Document.PageCount - 1 && i >= 0 && PageEditItems.Count > 0)
  1325. {
  1326. //宽高为样式中图片控件宽高
  1327. if (PageEditItems[i].isVertical)
  1328. {
  1329. await PDFViewer.GetThumbnail(i, 208, 294);
  1330. }
  1331. else
  1332. {
  1333. //获取横图
  1334. await PDFViewer.GetThumbnail(i, 294, 208);
  1335. }
  1336. }
  1337. }
  1338. }
  1339. /// <summary>
  1340. /// 从底层库获取对应页面的图片
  1341. /// </summary>
  1342. /// <param name="pageIndex"></param>
  1343. /// <param name="thumb"></param>
  1344. /// <param name="w"></param>
  1345. /// <param name="h"></param>
  1346. private void PDFViewer_OnThumbnailGenerated(int pageIndex, byte[] thumb, int w, int h)
  1347. {
  1348. try
  1349. {
  1350. if (PageEditItems.Count >= pageIndex + 1)
  1351. {
  1352. PixelFormat fmt = PixelFormats.Bgra32;
  1353. BitmapSource bps = BitmapSource.Create(w, h, 96.0, 96.0, fmt, null, thumb, (w * fmt.BitsPerPixel + 7) / 8);
  1354. PageEditItems[pageIndex].Image = bps;
  1355. PageEditItems[pageIndex].IsGetImage = true;
  1356. }
  1357. }
  1358. catch
  1359. {
  1360. }
  1361. }
  1362. #endregion
  1363. #region Navigate
  1364. public bool IsNavigationTarget(NavigationContext navigationContext)
  1365. {
  1366. return true;
  1367. }
  1368. public void OnNavigatedFrom(NavigationContext navigationContext)
  1369. {
  1370. }
  1371. /// <summary>
  1372. /// 从其他页面导航过来的时候会触发
  1373. /// 考虑只有在页面编辑的时候会进行页面的删减,可以尝试逻辑优化:仅第一次进入页面编辑时重新刷新页面
  1374. /// </summary>
  1375. /// <param name="navigationContext"></param>
  1376. public void OnNavigatedTo(NavigationContext navigationContext)
  1377. {
  1378. navigationContext.Parameters.TryGetValue<ViewContentViewModel>(ParameterNames.ViewContentViewModel, out viewContentViewModel);
  1379. navigationContext.Parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out PDFViewer);
  1380. bool isBOTA = false;
  1381. navigationContext.Parameters.TryGetValue<bool>(ParameterNames.BOTAThumb, out isBOTA);
  1382. if (PDFViewer != null)
  1383. {
  1384. if (isFirstLoad)
  1385. {
  1386. PDFViewer.OnThumbnailGenerated += PDFViewer_OnThumbnailGenerated;
  1387. PDFViewer.InfoChanged += PDFViewer_InfoChanged;
  1388. ZoomIndex = 0;
  1389. }
  1390. //BOTA缩略图时,显示不同的菜单栏
  1391. if(isBOTA)
  1392. {
  1393. IsBOTAThumb = Visibility.Visible;
  1394. }
  1395. GetSourceItems(isFirstLoad);
  1396. ListSelectedIndex = PDFViewer.CurrentIndex;
  1397. RefreshBookMarkList();
  1398. isFirstLoad = false;
  1399. }
  1400. }
  1401. private void PDFViewer_InfoChanged(object sender, KeyValuePair<string, object> e)
  1402. {
  1403. if(e.Key== "PageNum")
  1404. {
  1405. NotifyUIToRefresh(new List<int> { (int)e.Value});
  1406. }
  1407. }
  1408. #endregion
  1409. }
  1410. }