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;
}
}
///
/// 上一次的PDF编辑对象
///
private PDFEditEvent lastPDFEditEvent = null;
///
/// 缩放比例
///
private double[] zoomLevel = { 1.00f, 8f, 12f, 25, 33f, 50, 66f, 75, 100, 125, 150, 200, 300, 400, 600, 800, 1000 };
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;
PDFView.MouseWheelZoomHandler += PDFView_MouseWheelZoomHandler;
}
///
/// 鼠标滚轮缩放事件
///
private void PDFView_MouseWheelZoomHandler(object sender, bool e)
{
double newZoom = CheckZoomLevel(PDFView.ZoomFactor + (e ? 0.01 : -0.01), e);
PDFView?.Zoom(newZoom);
}
///
/// 检查缩放比例
///
private double CheckZoomLevel(double zoom, bool IsGrowth)
{
double standardZoom = 100;
if (zoom <= 0.01)
{
return 0.01;
}
if (zoom >= 10)
{
return 10;
}
zoom *= 100;
for (int i = 0; i < zoomLevel.Length - 1; i++)
{
if (zoom > zoomLevel[i] && zoom <= zoomLevel[i + 1] && IsGrowth)
{
standardZoom = zoomLevel[i + 1];
break;
}
if (zoom >= zoomLevel[i] && zoom < zoomLevel[i + 1] && !IsGrowth)
{
standardZoom = zoomLevel[i];
break;
}
}
return standardZoom / 100;
}
///
/// 文字编辑和图片编辑右键点击处理
///
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 = e;
if (e == null)
{
PDFEditContainer.Child= null;
return;
}
if (Mouse.RightButton==MouseButtonState.Pressed)
{
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 = false;
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);
}
}
}
///
/// 清除编辑相关按钮选中状态
///
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
{
if(Clipboard.ContainsImage())
{
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) Math.Ceiling(opacity * 255 / 100D);
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();
}
}
}
}
}