|
@@ -24,6 +24,7 @@ using System.Windows.Input;
|
|
|
using PDF_Office.Helper;
|
|
|
using Microsoft.Win32;
|
|
|
using ComPDFKit.PDFDocument;
|
|
|
+using PDF_Office.CustomControl;
|
|
|
|
|
|
namespace PDF_Office.ViewModels.PageEdit
|
|
|
{
|
|
@@ -56,6 +57,11 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// </summary>
|
|
|
private bool isFirstLoad = true;
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 记录多选项中最后一项的索引
|
|
|
+ /// </summary>
|
|
|
+ private int maxSelectedIndex = 0;
|
|
|
+
|
|
|
private Visibility showTip = Visibility.Collapsed;
|
|
|
/// <summary>
|
|
|
/// 是否显示渐隐提示
|
|
@@ -213,7 +219,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// <summary>
|
|
|
/// 插入文件命令
|
|
|
/// </summary>
|
|
|
- public DelegateCommand InsertCommand { get; set; }
|
|
|
+ public DelegateCommand<Object> InsertCommand { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 拆分文件
|
|
@@ -271,7 +277,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
KeyDown = new DelegateCommand<object>(KeyDownEvent);
|
|
|
|
|
|
SplitCommand = new DelegateCommand(SplitCommandEvent);
|
|
|
- InsertCommand = new DelegateCommand(InsertCommandEvent);
|
|
|
+ InsertCommand = new DelegateCommand<object>(InsertCommandEvent);
|
|
|
ReplaceCommand = new DelegateCommand(ReplaceCommandEvent, CanReplaceCommandExcute).ObservesProperty(() => IsMutiSelected);
|
|
|
ExtractCommand = new DelegateCommand(ExtractCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
|
|
|
DeleteCommand = new DelegateCommand(DeleteCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
|
|
@@ -301,72 +307,22 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
{
|
|
|
IsLoading = Visibility.Visible;
|
|
|
await Task.Delay(200);
|
|
|
- int pageCount = 0;
|
|
|
- int insertIndex = -1;
|
|
|
- CPDFDocument doc = CPDFDocument.InitWithFilePath(dialog.FileName);
|
|
|
- if (doc == null)
|
|
|
- {
|
|
|
- showTip = Visibility.Visible;
|
|
|
- return;
|
|
|
- }
|
|
|
- if (doc.IsLocked)
|
|
|
- {
|
|
|
- DialogParameters value = new DialogParameters();
|
|
|
- value.Add(ParameterNames.PDFDocument, doc);
|
|
|
- dialogs.ShowDialog(DialogNames.VerifyPassWordDialog, value, e =>
|
|
|
- {
|
|
|
- if (e.Result != ButtonResult.OK)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- pageCount = doc.PageCount;
|
|
|
-
|
|
|
- insertIndex = listSelecedIndex;
|
|
|
- //删除原有页面
|
|
|
- DeleteCommandEvent();
|
|
|
+ int pageCount = PDFViewer.Document.PageCount;
|
|
|
+ int insertIndex = listSelecedIndex;
|
|
|
|
|
|
- //插入整个新文档
|
|
|
- //文档层插入
|
|
|
- await Task.Run(() =>
|
|
|
+ //从文件插入到指定位置
|
|
|
+ var result = await InsertFromFile(listSelecedIndex+1,dialog.FileName);
|
|
|
+ if(result)
|
|
|
{
|
|
|
- var result = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
- return;
|
|
|
- }
|
|
|
- //插入成功后释放临时Document对象
|
|
|
- doc.Release();
|
|
|
- });
|
|
|
- //UI层插入
|
|
|
- for (int i = 0; i < pageCount; i++)
|
|
|
- {
|
|
|
- PageEditItem item = new PageEditItem();
|
|
|
- if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 != 0)
|
|
|
- {
|
|
|
- ///标记为横向页面
|
|
|
- item.isVertical = false;
|
|
|
- }
|
|
|
- var pagesize = PDFViewer.Document.GetPageSize(i);
|
|
|
- item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
|
|
|
- PageEditItems.Insert(insertIndex + i, item);
|
|
|
+ //插入成功后再删除原有页面
|
|
|
+ DoRemoveSelectedPages(new List<int>() { listSelecedIndex });
|
|
|
}
|
|
|
|
|
|
- ReloadAfterOption(true, true, Tuple.Create(insertIndex, insertIndex + pageCount));
|
|
|
+ ReloadAfterOption(true, true, Tuple.Create(insertIndex-1, insertIndex + pageCount));
|
|
|
|
|
|
- //加一点延时才能显示选中效果
|
|
|
- await Task.Delay(400);
|
|
|
|
|
|
- for (int i = 0; i < pageCount; i++)
|
|
|
- {
|
|
|
- PageEditItems[insertIndex + i].Selected = true;
|
|
|
- }
|
|
|
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -389,9 +345,80 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// <summary>
|
|
|
/// 插入功能的逻辑
|
|
|
/// </summary>
|
|
|
- private void InsertCommandEvent()
|
|
|
+ private async void InsertCommandEvent(object type)
|
|
|
{
|
|
|
+ if((string)type==null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //获取插入位置
|
|
|
+ int insertIndex = 0;
|
|
|
+ if(listSelecedIndex<0)
|
|
|
+ {
|
|
|
+ insertIndex = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ insertIndex = listSelecedIndex+1;
|
|
|
+ if(isMutiSelected)
|
|
|
+ {
|
|
|
+ insertIndex = maxSelectedIndex+1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ IsLoading = Visibility.Visible;
|
|
|
+ await Task.Delay(3);
|
|
|
+ if((string)type==ParameterNames.InsertType_Blank)
|
|
|
+ {
|
|
|
+ //插入空白页面
|
|
|
+ bool result;
|
|
|
+ if (insertIndex == 0)
|
|
|
+ {
|
|
|
+ result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex].Size.Width, PageEditItems[insertIndex].Size.Height, null);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex-1].Size.Width, PageEditItems[insertIndex-1].Size.Height, null);
|
|
|
+ }
|
|
|
+ if(!result)
|
|
|
+ {
|
|
|
+ IsLoading = Visibility.Collapsed;
|
|
|
+ ShowTip = Visibility.Visible;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //UI层插入Item
|
|
|
+ var item = GetNewPageEditItem(insertIndex);
|
|
|
+ PageEditItems.Insert(insertIndex,item);
|
|
|
+
|
|
|
+
|
|
|
+ ReloadAfterOption(true,true,Tuple.Create(insertIndex,insertIndex+1));
|
|
|
+ await Task.Delay(10);
|
|
|
+ ListSelectedIndex = insertIndex == 0 ? insertIndex : insertIndex;
|
|
|
+ }
|
|
|
+ else if((string)type == ParameterNames.InsertType_File)
|
|
|
+ {
|
|
|
+ OpenFileDialog dialog = new OpenFileDialog();
|
|
|
+ dialog.Multiselect = false;
|
|
|
+ dialog.Filter = PDF_Office.Properties.Resources.OpenDialogFilter;
|
|
|
+ if ((bool)dialog.ShowDialog())
|
|
|
+ {
|
|
|
+ //插入文件
|
|
|
+ var result = await InsertFromFile(insertIndex,dialog.FileName);
|
|
|
+ if(!result)
|
|
|
+ {
|
|
|
+ IsLoading = Visibility.Collapsed;
|
|
|
+ ShowTip = Visibility.Visible;
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
+ ReloadAfterOption(true,true,Tuple.Create(0,PDFViewer.Document.PageCount));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //插入自定义页面
|
|
|
+ }
|
|
|
+ IsLoading = Visibility.Collapsed;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -422,9 +449,53 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// <summary>
|
|
|
/// 页面倒序的逻辑
|
|
|
/// </summary>
|
|
|
- private void ReverseCommandEvent()
|
|
|
+ private async void ReverseCommandEvent()
|
|
|
{
|
|
|
+ IsLoading = Visibility.Visible;
|
|
|
+ await Task.Delay(3);
|
|
|
+ List<int> pages = new List<int>();
|
|
|
+ for (int i = 0; i <PageEditItems.Count; i++)
|
|
|
+ {
|
|
|
+ if (PageEditItems[i].Selected)
|
|
|
+ {
|
|
|
+ pages.Add(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pages.Sort();
|
|
|
|
|
|
+ for (int i = 0; i < pages.Count; i++)
|
|
|
+ {
|
|
|
+ int preindex = pages[i];
|
|
|
+ int laterIndex = pages[pages.Count - i - 1];//尾部的索引
|
|
|
+ if (laterIndex <= preindex)//交换完成
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ var sourceitem = PageEditItems[preindex];
|
|
|
+ var targetitem = PageEditItems[laterIndex];
|
|
|
+
|
|
|
+ var result = PDFViewer.Document.ExchangePage(preindex, laterIndex);
|
|
|
+ if(!result)
|
|
|
+ {
|
|
|
+ ShowTip = Visibility.Visible;
|
|
|
+ IsLoading = Visibility.Collapsed;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ PageEditItems.Remove(sourceitem);
|
|
|
+ PageEditItems.Remove(targetitem);
|
|
|
+ PageEditItems.Insert(preindex, targetitem);
|
|
|
+ PageEditItems.Insert(laterIndex, sourceitem);
|
|
|
+ }
|
|
|
+
|
|
|
+ await Task.Delay(20);
|
|
|
+ for(int i=0;i<pages.Count;i++)
|
|
|
+ {
|
|
|
+ PageEditItems[i].Selected = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ ReloadAfterOption(true,true,null);
|
|
|
+ IsLoading = Visibility.Collapsed;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -529,7 +600,10 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
List<int> pagelist = new List<int>();
|
|
|
for (int i = 0; i < listbox.SelectedItems.Count; i++)
|
|
|
{
|
|
|
- pagelist.Add((listbox.SelectedItems[i] as PageEditItem).PageNumber);
|
|
|
+ if (!pagelist.Contains((listbox.SelectedItems[i] as PageEditItem).PageNumber))
|
|
|
+ {
|
|
|
+ pagelist.Add((listbox.SelectedItems[i] as PageEditItem).PageNumber);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//手动取消其他项的选中状态
|
|
@@ -562,6 +636,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
if (listbox.SelectedItems.Count > 1)
|
|
|
{
|
|
|
IsMutiSelected = true;
|
|
|
+ maxSelectedIndex = listbox.Items.IndexOf(listbox.SelectedItems[listbox.SelectedItems.Count-1]);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -604,7 +679,9 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
var result = CommonHelper.GetPagesInRange(ref TargetPageIndexs, (args.OriginalSource as TextBox).Text, PDFViewer.Document.PageCount, new char[] { ',', ',' }, new char[] { '-' });
|
|
|
if (!result)
|
|
|
{
|
|
|
- MessageBox.Show("请输入有效范围");
|
|
|
+ AlertsMessage alertsMessage = new AlertsMessage();
|
|
|
+ alertsMessage.ShowDialog("","请输入有效范围","OK");
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
//选中输入的页面范围
|
|
@@ -628,7 +705,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
|
|
|
/// <summary>
|
|
|
/// 通知UI刷新页面范围
|
|
|
- /// </summary>
|
|
|
+ /// </summary>vb nmjvcx
|
|
|
private void NotifyUIToRefresh()
|
|
|
{
|
|
|
//通知UI刷新页面范围
|
|
@@ -639,23 +716,39 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// 删除选中项的方法 不带Reload操作
|
|
|
/// 方便其他逻辑中调用
|
|
|
/// </summary>
|
|
|
- private async void DoRemoveSelectedPages()
|
|
|
+ private async void DoRemoveSelectedPages(List<int> pageList = null)
|
|
|
{
|
|
|
IsLoading = Visibility.Visible;
|
|
|
await Task.Delay(3);
|
|
|
List<int> indexList = new List<int>();
|
|
|
- for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
+ if (pageList == null || pageList.Count < 0)
|
|
|
{
|
|
|
- if (PageEditItems[i].Selected)
|
|
|
+ for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
{
|
|
|
- indexList.Add(i);
|
|
|
+ if (PageEditItems[i].Selected)
|
|
|
+ {
|
|
|
+ indexList.Add(i);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ indexList = pageList;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(indexList.Count>0&& indexList.Count==PDFViewer.Document.PageCount)
|
|
|
+ {
|
|
|
+ IsLoading = Visibility.Collapsed;
|
|
|
+ AlertsMessage alertsMessage = new AlertsMessage();
|
|
|
+ alertsMessage.ShowDialog("","不能删除所有页面","OK");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
var result = PDFViewer.Document.RemovePages(indexList.ToArray());
|
|
|
if (!result)
|
|
|
{
|
|
|
ShowTip = Visibility.Visible;
|
|
|
+ IsLoading = Visibility.Collapsed;
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -667,6 +760,90 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 将文件插入到指定位置
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="insertIndex"></param>
|
|
|
+ private async Task<bool> InsertFromFile(int insertIndex,string filePath)
|
|
|
+ {
|
|
|
+ CPDFDocument doc = CPDFDocument.InitWithFilePath(filePath);
|
|
|
+ if (doc == null)
|
|
|
+ {
|
|
|
+ showTip = Visibility.Visible;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (doc.IsLocked)
|
|
|
+ {
|
|
|
+ DialogParameters value = new DialogParameters();
|
|
|
+ value.Add(ParameterNames.PDFDocument, doc);
|
|
|
+ bool result = true;
|
|
|
+ dialogs.ShowDialog(DialogNames.VerifyPassWordDialog, value,e=>
|
|
|
+ {
|
|
|
+ if (e.Result != ButtonResult.OK)
|
|
|
+ {
|
|
|
+ result = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if(!result)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ int pageCount = doc.PageCount;
|
|
|
+
|
|
|
+ //插入整个新文档
|
|
|
+ //文档层插入
|
|
|
+ await Task.Run(() =>
|
|
|
+ {
|
|
|
+ var result = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
|
|
|
+ if (!result)
|
|
|
+ {
|
|
|
+ ShowTip = Visibility.Visible;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //插入成功后释放临时Document对象
|
|
|
+ doc.Release();
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+
|
|
|
+ //UI层插入
|
|
|
+ for (int i = 0; i < pageCount; i++)
|
|
|
+ {
|
|
|
+ var item = GetNewPageEditItem(i);
|
|
|
+ PageEditItems.Insert(insertIndex + i, item);
|
|
|
+ }
|
|
|
+
|
|
|
+ //加一点延时才能显示选中效果
|
|
|
+ await Task.Delay(400);
|
|
|
+
|
|
|
+ for (int i = 0; i < pageCount; i++)
|
|
|
+ {
|
|
|
+ PageEditItems[insertIndex + i].Selected = true;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 根据索引创建新的Item
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="index"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private PageEditItem GetNewPageEditItem(int index)
|
|
|
+ {
|
|
|
+ PageEditItem item = new PageEditItem();
|
|
|
+ if (PDFViewer.Document.PageAtIndex(index).Rotation % 2 != 0)
|
|
|
+ {
|
|
|
+ ///标记为横向页面
|
|
|
+ item.isVertical = false;
|
|
|
+ }
|
|
|
+ item.PageNumber = index + 1;
|
|
|
+ var pagesize = PDFViewer.Document.GetPageSize(index);
|
|
|
+ item.Size = pagesize;
|
|
|
+ item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 进行文件操作后刷新PDFView
|
|
|
/// 清除undo 栈
|
|
@@ -722,7 +899,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
PageEditItems[i].IsGetImage = false;
|
|
|
}
|
|
|
}
|
|
|
- ReloadAfterOption(false, true, Tuple.Create(0,PageEditItems.Count));
|
|
|
+ ReloadAfterOption(false, true, Tuple.Create(0, PageEditItems.Count));
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
}
|
|
|
|
|
@@ -855,16 +1032,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
PageEditItems.Clear();
|
|
|
for (int i = 0; i < PDFViewer.Document.PageCount; i++)
|
|
|
{
|
|
|
- PageEditItem item = new PageEditItem();
|
|
|
- item.PageNumber = i + 1;
|
|
|
-
|
|
|
- if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 != 0)
|
|
|
- {
|
|
|
- ///标记为横向页面
|
|
|
- item.isVertical = false;
|
|
|
- }
|
|
|
- var pagesize = PDFViewer.Document.GetPageSize(i);
|
|
|
- item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
|
|
|
+ var item = GetNewPageEditItem(i);
|
|
|
PageEditItems.Add(item);
|
|
|
}
|
|
|
}
|