using ComPDFKit.PDFPage;
using compdfkit_tools.Edit;
using compdfkit_tools.PDFControl;
using ComPDFKitViewer;
using ComPDFKitViewer.PdfViewer;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml.Linq;
namespace edit_ctrl_demo
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window,INotifyPropertyChanged
{
public bool CanUndo
{
get
{
if (PDFView != null)
{
return PDFView.UndoManager.CanUndo;
}
return false;
}
}
public bool CanRedo
{
get
{
if (PDFView != null)
{
return PDFView.UndoManager.CanRedo;
}
return false;
}
}
private PDFEditEvent lastPDFEditEvent = null;
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
DataContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
LoadDefaultDocument();
TitleBarTool.OpenFileEvent += TitleBarTool_OpenFileEvent;
PDFView.PDFEditActiveHandler += PDFView_PDFEditActiveHandler;
PDFView.UndoManager.PropertyChanged += UndoManager_PropertyChanged;
PDFView.PDFEditCommandHandler += PDFView_PDFEditCommandHandler;
}
private void PDFView_PDFEditCommandHandler(object sender, PDFEditCommand e)
{
if (e == null)
{
return;
}
if(e.EditType==CPDFEditType.EditText)
{
e.Handle = true;
PDFEditTextContextMenu(sender,e);
}
if(e.EditType==CPDFEditType.EditImage)
{
e.Handle = true;
PDFEditImageContextMenu(sender, e);
}
}
private void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged(e.PropertyName);
}
///
/// 文字或图片块选中事件
///
private void PDFView_PDFEditActiveHandler(object sender, PDFEditEvent e)
{
PDFEditEvent tempEvent = lastPDFEditEvent;
lastPDFEditEvent = null;
if (e == null)
{
PDFEditContainer.Child= null;
return;
}
if(Mouse.RightButton==MouseButtonState.Pressed)
{
lastPDFEditEvent = e;
return;
}
if (e.EditType == CPDFEditType.EditText)
{
PDFTextEditControl textEditControl = new PDFTextEditControl();
textEditControl.SetPDFTextEditData(e);
PDFEditContainer.Child = textEditControl;
return;
}
if (e.EditType == CPDFEditType.EditImage)
{
PDFImageEditControl imageEditControl = new PDFImageEditControl();
imageEditControl.InitWithPDFViewer(PDFView);
imageEditControl.SetPDFImageEditData(e);
PDFEditContainer.Child = imageEditControl;
return;
}
}
private void TitleBarTool_OpenFileEvent(object sender, string filePath)
{
ClearPDFEditState();
PDFView?.CloseDocument();
PDFView?.InitDocument(filePath);
PDFView?.Load();
PDFView?.SetMouseMode(MouseModes.PanTool);
}
private void LoadDefaultDocument()
{
string defaultFilePath = "..\\..\\..\\..\\developer_guide_windows.pdf";
PDFView?.InitDocument(defaultFilePath);
PDFView?.Load();
}
///
/// 文字编辑模式
///
private void PDFTextEditButton_Click(object sender, RoutedEventArgs e)
{
ToggleButton senderBtn=sender as ToggleButton;
if(senderBtn != null)
{
ClearPDFEditState(senderBtn);
if (senderBtn.IsChecked == true)
{
PDFView?.SetPDFEditType(CPDFEditType.EditText);
PDFView?.SetPDFEditCreateType(CPDFEditType.EditText);
PDFView?.SetMouseMode(MouseModes.PDFEdit);
PDFView?.ReloadDocument();
}
else
{
PDFView?.SetPDFEditType(CPDFEditType.None);
PDFView?.SetMouseMode(MouseModes.PanTool);
PDFView?.ReloadDocument();
}
}
}
///
/// 图片编辑模式
///
private void PDFImageEditButton_Click(object sender, RoutedEventArgs e)
{
ToggleButton senderBtn = sender as ToggleButton;
if (senderBtn != null)
{
ClearPDFEditState(senderBtn);
senderBtn.IsChecked = true;
//if (senderBtn.IsChecked == true)
{
PDFView?.SetPDFEditType(CPDFEditType.EditImage);
PDFView?.SetMouseMode(MouseModes.PDFEdit);
PDFView?.ReloadDocument();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
if (openFileDialog.ShowDialog() == true)
{
PDFView?.SetPDFEditCreateType(CPDFEditType.EditImage);
PDFView?.AddPDFEditImage(openFileDialog.FileName);
}
}
//else
//{
// PDFView?.SetPDFEditType(CPDFEditType.None);
// PDFView?.SetMouseMode(MouseModes.PanTool);
// PDFView?.ReloadDocument();
//}
}
}
private void ClearPDFEditState(ToggleButton ignoreBtn=null)
{
List clearBtnList = new List()
{
PDFTextEditButton,
PDFImageEditButton,
PDFEditBtn,
};
foreach (ToggleButton item in clearBtnList)
{
if(ignoreBtn==item)
{
continue;
}
item.IsChecked = false;
}
PDFEditContainer.Child = null;
}
private void UndoBtn_Click(object sender, RoutedEventArgs e)
{
PDFView?.UndoManager?.Undo();
}
private void RedoBtn_Click(object sender, RoutedEventArgs e)
{
PDFView?.UndoManager?.Redo();
}
private void PDFEditTextContextMenu(object sender,PDFEditCommand editCommand)
{
editCommand.PopupMenu = new ContextMenu();
if (lastPDFEditEvent != null)
{
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "复制", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "剪切", Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "删除", Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "粘贴", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
MenuItem propertyMenu = new MenuItem();
propertyMenu.Header = "属性";
propertyMenu.Click += (o, p) =>
{
if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditText)
{
PDFTextEditControl textEditControl = new PDFTextEditControl();
textEditControl.SetPDFTextEditData(lastPDFEditEvent);
PDFEditContainer.Child = textEditControl;
}
};
editCommand.PopupMenu.Items.Add(propertyMenu);
}
else
{
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "粘贴", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
if(editCommand.TextAreaCopied)
{
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "粘贴样式", Command = CustomCommands.PasteMatchStyle, CommandTarget = (UIElement)sender });
}
}
}
private void PDFEditImageContextMenu(object sender, PDFEditCommand editCommand)
{
editCommand.PopupMenu = new ContextMenu();
if(lastPDFEditEvent!=null)
{
MenuItem rotateLeftMenu = new MenuItem();
rotateLeftMenu.Header = "左旋转";
rotateLeftMenu.Click += (o, p) =>
{
if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
{
lastPDFEditEvent.Rotate = -90;
lastPDFEditEvent.UpdatePDFEditByEventArgs();
}
};
editCommand.PopupMenu.Items.Add(rotateLeftMenu);
MenuItem rotateRightMenu = new MenuItem();
rotateRightMenu.Header = "右旋转";
rotateRightMenu.Click += (o, p) =>
{
if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
{
lastPDFEditEvent.Rotate = 90;
lastPDFEditEvent.UpdatePDFEditByEventArgs();
}
};
editCommand.PopupMenu.Items.Add(rotateRightMenu);
MenuItem replaceMenu = new MenuItem();
replaceMenu.Header = "替换";
replaceMenu.Click += (o, p) =>
{
if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
if (openFileDialog.ShowDialog() == true)
{
lastPDFEditEvent.ReplaceImagePath = openFileDialog.FileName;
lastPDFEditEvent.UpdatePDFEditByEventArgs();
PDFView?.ClearSelectPDFEdit();
}
}
};
editCommand.PopupMenu.Items.Add(replaceMenu);
MenuItem exportMenu = new MenuItem();
exportMenu.Header = "导出";
exportMenu.Click += (o, p) =>
{
if (PDFView != null)
{
Dictionary> imageDict = PDFView.GetSelectedImages();
if (imageDict != null && imageDict.Count > 0)
{
System.Windows.Forms.FolderBrowserDialog folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
if (folderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string choosePath = folderBrowser.SelectedPath;
string openPath = choosePath;
try
{
foreach (int pageIndex in imageDict.Keys)
{
List imageList = imageDict[pageIndex];
foreach (Bitmap image in imageList)
{
string savePath = System.IO.Path.Combine(choosePath, Guid.NewGuid() + ".jpg");
image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
openPath = savePath;
}
}
Process.Start("explorer", "/select,\"" + openPath + "\"");
}
catch (Exception ex)
{
}
}
}
}
};
editCommand.PopupMenu.Items.Add(exportMenu);
MenuItem opacityMenu = new MenuItem();
opacityMenu.Header = "透明度";
editCommand.PopupMenu.Items.Add(opacityMenu);
AppendOpacityMenu(opacityMenu);
MenuItem horizonMirror = new MenuItem();
horizonMirror.Header = "水平镜像";
horizonMirror.Click += (o, p) =>
{
if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
{
lastPDFEditEvent.HorizontalMirror = true;
lastPDFEditEvent.UpdatePDFEditByEventArgs();
}
};
editCommand.PopupMenu.Items.Add(horizonMirror);
MenuItem verticalMirror = new MenuItem();
verticalMirror.Header = "垂直镜像";
verticalMirror.Click += (o, p) =>
{
if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
{
lastPDFEditEvent.VerticalMirror = true;
lastPDFEditEvent.UpdatePDFEditByEventArgs();
}
};
editCommand.PopupMenu.Items.Add(verticalMirror);
MenuItem cropMenu = new MenuItem();
cropMenu.Header = "裁剪";
cropMenu.Click += (o, p) =>
{
if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
{
lastPDFEditEvent.ClipImage = true;
lastPDFEditEvent.UpdatePDFEditByEventArgs();
}
};
editCommand.PopupMenu.Items.Add(cropMenu);
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "复制", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "剪切", Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "删除", Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
}
else
{
editCommand.PopupMenu.Items.Add(new MenuItem() { Header = "粘贴", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
}
}
private void AppendOpacityMenu(MenuItem parentMenu)
{
List opacityList = new List()
{
25,50,75,100
};
foreach(int opacity in opacityList)
{
MenuItem opacityMenu = new MenuItem();
opacityMenu.Header = string.Format("{0}%", opacity);
opacityMenu.Click += (o, p) =>
{
if(lastPDFEditEvent != null && lastPDFEditEvent.EditType==CPDFEditType.EditImage)
{
lastPDFEditEvent.Transparency = (int)(opacity * 255 / 100);
lastPDFEditEvent.UpdatePDFEditByEventArgs();
}
};
parentMenu.Items.Add(opacityMenu);
}
}
private void PDFEditBtn_Click(object sender, RoutedEventArgs e)
{
ToggleButton senderBtn = sender as ToggleButton;
if (senderBtn != null)
{
ClearPDFEditState(senderBtn);
if (senderBtn.IsChecked == true)
{
PDFView?.SetPDFEditType(CPDFEditType.EditText|CPDFEditType.EditImage);
PDFView?.SetPDFEditCreateType(CPDFEditType.None);
PDFView?.SetMouseMode(MouseModes.PDFEdit);
PDFView?.ReloadDocument();
}
else
{
PDFView?.SetPDFEditType(CPDFEditType.None);
PDFView?.SetMouseMode(MouseModes.PanTool);
PDFView?.ReloadDocument();
}
}
}
}
}