소스 검색

Merge branch 'dev' of http://git.kdan.cc:8865/Windows/PDFOffice_Windows_exe into dev

lvle 1 년 전
부모
커밋
5ca741277a
27개의 변경된 파일3425개의 추가작업 그리고 111개의 파일을 삭제
  1. 73 8
      PDF Office/App.xaml.cs
  2. BIN
      PDF Office/ComPDFKit.Viewer.dll
  3. 60 3
      PDF Office/Model/AnnotPanel/FontBoard.cs
  4. 40 31
      PDF Office/Model/Dialog/ToolsDialogs/CompressDialogModel/CompressDialogModel.cs
  5. 14 0
      PDF Office/PDF Master.csproj
  6. BIN
      PDF Office/Updater/NetSparkle.dll
  7. 2911 0
      PDF Office/Updater/NetSparkle.xml
  8. BIN
      PDF Office/Updater/NetSparkleUpdater.UI.WinForms.dll
  9. BIN
      PDF Office/Updater/en-US/NetSparkleUpdater.UI.WinForms.resources.dll
  10. BIN
      PDF Office/Updater/zh-CN/NetSparkleUpdater.UI.WinForms.resources.dll
  11. BIN
      PDF Office/Updater/zh-TW/NetSparkleUpdater.UI.WinForms.resources.dll
  12. 1 1
      PDF Office/ViewModels/BOTA/BOTAContentViewModel.cs
  13. 13 1
      PDF Office/ViewModels/MainWindowViewModel.cs
  14. 30 7
      PDF Office/ViewModels/PropertyPanel/AnnotPanel/SnapshotEditMenuViewModel.cs
  15. 3 4
      PDF Office/ViewModels/Tools/AnnotToolContentViewModel.Command.cs
  16. 5 6
      PDF Office/ViewModels/Tools/AnnotToolContentViewModel.Layout.cs
  17. 148 32
      PDF Office/ViewModels/Tools/AnnotToolContentViewModel.cs
  18. 4 1
      PDF Office/ViewModels/Tools/ConverterBarContentViewModel.cs
  19. 19 14
      PDF Office/ViewModels/Tools/ToolsBarContentViewModel.cs
  20. 5 3
      PDF Office/ViewModels/ViewContentViewModel.cs
  21. 1 0
      PDF Office/Views/BOTA/BOTAContent.xaml.cs
  22. 1 0
      PDF Office/Views/PropertyPanel/AnnotPanel/FreetextAnnotProperty.xaml
  23. 3 0
      PDF Office/Views/ViewContent.xaml
  24. 16 0
      PDF Office/Views/ViewContent.xaml.cs
  25. 26 0
      UpdateXML/pdfmaster_win_en_Us.xml
  26. 26 0
      UpdateXML/pdfmaster_win_zh_Hans.xml
  27. 26 0
      UpdateXML/pdfmaster_win_zh_Hant.xml

+ 73 - 8
PDF Office/App.xaml.cs

@@ -69,6 +69,8 @@ using System.Runtime.InteropServices;
 using System.Security.Cryptography;
 using System.Text;
 using Prism.Services.Dialogs;
+using NetSparkleUpdater;
+using NetSparkleUpdater.SignatureVerifiers;
 
 namespace PDF_Master
 {
@@ -114,6 +116,8 @@ namespace PDF_Master
         /// </summary>
         public static string modelFolderPath = null;
 
+        public static SparkleUpdater SparkleUpdateDetector;
+
         /// <summary>
         /// 是否是软件的第一个主窗体
         /// </summary>
@@ -282,8 +286,15 @@ namespace PDF_Master
             }
 
 
+            //增加全局异常捕获
+            //UI线程异常
+            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
+            //非UI线程异常
+            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
+            //Task线程内
+            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
 
-            if(!LicenseVerify())
+            if (!LicenseVerify())
             {
 #if !DEBUG
                 //部分人员没有转档库密钥,为避免弹窗影响正常的功能开发、调试。本弹窗仅在Release模式下弹出,用于正式包
@@ -340,13 +351,7 @@ namespace PDF_Master
             {
             }
 
-            //增加全局异常捕获
-            //UI线程异常
-            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
-            //非UI线程异常
-            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
-            //Task线程内
-            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
+            CheckUpdate();
 
             base.OnStartup(e);
         }
@@ -700,6 +705,66 @@ namespace PDF_Master
             return true;
         }
 
+        private static void CheckUpdate()
+        {
+            try
+            {
+                string lang = "en_Us";
+                lang = Settings.Default.AppProperties.culture;
+                switch (lang)
+                {
+                    case "zh-CN":
+                        lang = "zh_Hans";
+                        break;
+                    case "zh-TW":
+                        lang = "zh_Hant";
+                        break;
+                    default:
+                        lang = "en_Us";
+                        break;
+                }
+#if DEBUG
+                var appcastUrl = string.Format("http://test-pdf-pro.kdan.cn:3021/downloads/pdfmaster_win_{0}.xml", lang);
+#else
+                //var appcastUrl = string.Format("http://test-pdf-pro.kdan.cn:3021/downloads/pdfmaster_win_{0}.xml", lang);
+                var appcastUrl = string.Format("https://www.pdfreaderpro.com/downloads/pdfmaster_win_{0}.xml",lang);
+#endif
+                // set icon in project properties!
+                string manifestModuleName = System.Reflection.Assembly.GetEntryAssembly().ManifestModule.FullyQualifiedName;
+                var icon = System.Drawing.Icon.ExtractAssociatedIcon(manifestModuleName);
+                //设为false 则显示立即购买按钮,设为true则不显示立即购买按钮
+                bool ispurchased = true;
+                SparkleUpdateDetector = new SparkleUpdater(appcastUrl, new DSAChecker(NetSparkleUpdater.Enums.SecurityMode.Unsafe), ispurchased)
+                {
+                    UIFactory = new NetSparkleUpdater.UI.WinForms.UIFactory(icon, "PDF Master"),
+                    //RelaunchAfterUpdate = true,
+                    //ShowsUIOnMainThread = true,
+                    //UseNotificationToast = true
+                };
+
+                SparkleUpdateDetector.SecurityProtocolType = System.Net.SecurityProtocolType.Tls12;
+                SparkleUpdateDetector.CloseApplication += SparkleUpdateDetector_CloseApplication;
+                SparkleUpdateDetector.StartLoop(true);
+            }
+            catch { }
+        }
+
+        private static void SparkleUpdateDetector_CloseApplication()
+        {
+            try
+            {
+                SparkleUpdateDetector.Dispose();
+                Current.Dispatcher.Invoke(() =>
+                {
+                    Current.Shutdown();
+                });
+            }
+            catch
+            {
+
+            }
+        }
+
         protected override void OnExit(ExitEventArgs e)
         {
             Environment.Exit(1);

BIN
PDF Office/ComPDFKit.Viewer.dll


+ 60 - 3
PDF Office/Model/AnnotPanel/FontBoard.cs

@@ -373,12 +373,63 @@ namespace PDF_Master.Model.AnnotPanel
 
         #region 属性
 
+        /// <summary>
+        /// 预设样式
+        /// </summary>
         private ComboDataItem _currentPresetFont = new ComboDataItem("Custom", "Custom");
 
         public ComboDataItem CurrentPresetFont
         {
             get { return _currentPresetFont; }
-            set => SetProperty(ref _currentPresetFont, value);
+            set
+            {
+                SetProperty(ref _currentPresetFont, value);
+                switch (value.ValueStr.ToString())
+                {
+                    case "Custom":
+                        PresetFontSelectedIndex = 0;
+                        break;
+
+                    case "H1":
+                        PresetFontSelectedIndex = 1;
+                        break;
+
+                    case "H2":
+                        PresetFontSelectedIndex = 2;
+                        break;
+
+                    case "H3":
+                        PresetFontSelectedIndex = 3;
+                        break;
+
+                    case "B1":
+                        PresetFontSelectedIndex = 4;
+                        break;
+
+                    case "B2":
+                        PresetFontSelectedIndex = 5;
+                        break;
+
+                    case "B3":
+                        PresetFontSelectedIndex = 6;
+                        break;
+
+                    default:
+                        PresetFontSelectedIndex = 0;
+                        break;
+                }
+            }
+        }
+
+        private int presetFontSelectedIndex;
+
+        public int PresetFontSelectedIndex
+        {
+            get { return presetFontSelectedIndex; }
+            set
+            {
+                SetProperty(ref presetFontSelectedIndex, value);
+            }
         }
 
         #region 字体样式
@@ -397,10 +448,12 @@ namespace PDF_Master.Model.AnnotPanel
                     case "Courier New":
                         FontFamilySelectedIndex = 0;
                         break;
+
                     case "Helvetica":
                     case "Arial":
                         FontFamilySelectedIndex = 1;
                         break;
+
                     case "Times New Roman":
                         FontFamilySelectedIndex = 2;
                         break;
@@ -468,19 +521,23 @@ namespace PDF_Master.Model.AnnotPanel
         public ComboDataItem CurrrentFontWeightStyle
         {
             get { return _currrentFontWeightStyle; }
-            set {
+            set
+            {
                 SetProperty(ref _currrentFontWeightStyle, value);
                 switch (value.Content.ToString())
                 {
                     case "Regular":
                         FontStyleSelectedIndex = 0;
                         break;
+
                     case "Bold":
                         FontStyleSelectedIndex = 1;
                         break;
+
                     case "Italic":
                         FontStyleSelectedIndex = 2;
                         break;
+
                     case "Bold Italic":
                         FontStyleSelectedIndex = 3;
                         break;
@@ -594,7 +651,7 @@ namespace PDF_Master.Model.AnnotPanel
 
         public void GetCurrentFontFamily(string fontFamily, string uiStr)
         {
-            if(fontFamily == "Arial")
+            if (fontFamily == "Arial")
             {
                 fontFamily = "Helvetica";
                 uiStr = "Helvetica";

+ 40 - 31
PDF Office/Model/Dialog/ToolsDialogs/CompressDialogModel/CompressDialogModel.cs

@@ -15,12 +15,13 @@ namespace PDF_Master.Model.Dialog.ToolsDialogs
     {
         CPDFDocument tempDocument = null;
         IntPtr compressingIntpr = IntPtr.Zero;
-        public enum EnumQualityLevel {  
-        StatusLarge=100,
-        StatusStandard=80,
-        StatusDefault=40,
-        StatusLittle =40,
-        StatusMicro=10
+        public enum EnumQualityLevel
+        {
+            StatusLarge = 100,
+            StatusStandard = 80,
+            StatusDefault = 40,
+            StatusLittle = 40,
+            StatusMicro = 10
         }
 
         public EnumQualityLevel CompressQuality { get; set; }
@@ -35,42 +36,50 @@ namespace PDF_Master.Model.Dialog.ToolsDialogs
         private int GetIndex(int pageindex)
         {
             App.mainWindowViewModel.Value = (pageindex + 1);
-           
+
             if (App.mainWindowViewModel.Value == App.mainWindowViewModel.MaxValue) { App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Collapsed; }
             return 0;
         }
 
         public async void OnOpened(Prism.Services.Dialogs.DialogResult e)
         {
-            if (e.Result == Prism.Services.Dialogs.ButtonResult.Cancel||e.Result==Prism.Services.Dialogs.ButtonResult.None) { return; }
-            CPDFDocument doc = null;
-            CPDFDocument.GetPageIndexDelegate indexDelegate = null;
             string filepath = "";
             string password = "";
-            int compressquality = 45;
-            doc = e.Parameters.GetValue<CPDFDocument>(ParameterNames.PDFDocument);
-            filepath = e.Parameters.GetValue<string>(ParameterNames.FilePath);
-            password = e.Parameters.GetValue<string>(ParameterNames.PassWord);
-            compressquality = e.Parameters.GetValue<int>("compressDialogModel.CompressQuality");
-            if (doc != null)
+            try
             {
-                App.mainWindowViewModel.Value = 0;
-                App.mainWindowViewModel.ProgressTitle = "Compressing";
-                App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Visible;
-                App.mainWindowViewModel.MaxValue = doc.PageCount;
-                CPDFDocument document = CPDFDocument.InitWithFilePath(doc.FilePath);
-                document.UnlockWithPassword(password);
-                indexDelegate += GetIndex;
-                compressingIntpr = document.CompressFile_Init(compressquality, indexDelegate);
-                //GC.KeepAlive(indexDelegate);
-                tempDocument = document;
-                Trace.WriteLine("compressDialogModel.CompressQuality" + compressquality);
-                App.mainWindowViewModel.ProcessCloseAction = CompressClear;
-                if (await Task.Run<bool>(() => { return document.CompressFile_Start(compressingIntpr, filepath); })) { CommonHelper.ShowFileBrowser(filepath); }
+                if (e.Result == Prism.Services.Dialogs.ButtonResult.Cancel || e.Result == Prism.Services.Dialogs.ButtonResult.None) { return; }
+                CPDFDocument doc = null;
+                CPDFDocument.GetPageIndexDelegate indexDelegate = null;
                 
-                document.Release();
+                int compressquality = 45;
+                doc = e.Parameters.GetValue<CPDFDocument>(ParameterNames.PDFDocument);
+                filepath = e.Parameters.GetValue<string>(ParameterNames.FilePath);
+                password = e.Parameters.GetValue<string>(ParameterNames.PassWord);
+                compressquality = e.Parameters.GetValue<int>("compressDialogModel.CompressQuality");
+                if (doc != null)
+                {
+                    App.mainWindowViewModel.Value = 0;
+                    App.mainWindowViewModel.ProgressTitle = "Compressing";
+                    App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Visible;
+                    App.mainWindowViewModel.MaxValue = doc.PageCount;
+                    CPDFDocument document = CPDFDocument.InitWithFilePath(doc.FilePath);
+                    document.UnlockWithPassword(password);
+                    indexDelegate += GetIndex;
+                    compressingIntpr = document.CompressFile_Init(compressquality, indexDelegate);
+                    //GC.KeepAlive(indexDelegate);
+                    tempDocument = document;
+                    Trace.WriteLine("compressDialogModel.CompressQuality" + compressquality);
+                    App.mainWindowViewModel.ProcessCloseAction = CompressClear;
+                    if (await Task.Run<bool>(() => { return document.CompressFile_Start(compressingIntpr, filepath); })) { CommonHelper.ShowFileBrowser(filepath); }
+
+                    document.Release();
+                }
+            }
+            catch {
+                tempDocument.CompressFile_Cancel(compressingIntpr);
+                App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Collapsed;
             }
         }
     }
-    
+
 }

+ 14 - 0
PDF Office/PDF Master.csproj

@@ -193,6 +193,14 @@
     <Reference Include="Microsoft.Xaml.Behaviors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
       <HintPath>packages\Microsoft.Xaml.Behaviors.Wpf.1.1.31\lib\net45\Microsoft.Xaml.Behaviors.dll</HintPath>
     </Reference>
+    <Reference Include="NetSparkle, Version=2.0.8.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>Updater\NetSparkle.dll</HintPath>
+    </Reference>
+    <Reference Include="NetSparkleUpdater.UI.WinForms, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>Updater\NetSparkleUpdater.UI.WinForms.dll</HintPath>
+    </Reference>
     <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
@@ -2529,6 +2537,12 @@
     <Content Include="SystemService\ThumbnailProviderx86.dll">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <Content Include="Updater\en-US\NetSparkleUpdater.UI.WinForms.resources.dll" />
+    <Content Include="Updater\NetSparkle.dll" />
+    <Resource Include="Updater\NetSparkle.xml" />
+    <Content Include="Updater\NetSparkleUpdater.UI.WinForms.dll" />
+    <Content Include="Updater\zh-CN\NetSparkleUpdater.UI.WinForms.resources.dll" />
+    <Content Include="Updater\zh-TW\NetSparkleUpdater.UI.WinForms.resources.dll" />
     <Content Include="x64\ComPDFKit.dll">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>

BIN
PDF Office/Updater/NetSparkle.dll


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2911 - 0
PDF Office/Updater/NetSparkle.xml


BIN
PDF Office/Updater/NetSparkleUpdater.UI.WinForms.dll


BIN
PDF Office/Updater/en-US/NetSparkleUpdater.UI.WinForms.resources.dll


BIN
PDF Office/Updater/zh-CN/NetSparkleUpdater.UI.WinForms.resources.dll


BIN
PDF Office/Updater/zh-TW/NetSparkleUpdater.UI.WinForms.resources.dll


+ 1 - 1
PDF Office/ViewModels/BOTA/BOTAContentViewModel.cs

@@ -19,7 +19,7 @@ namespace PDF_Master.ViewModels.BOTA
 {
     public class BOTAContentViewModel : BindableBase, INavigationAware
     {
-        private CPDFViewer pdfViewer { get; set; }
+        public CPDFViewer pdfViewer { get; set; }
 
         private IRegionManager regions { get; set; }
         private IDialogService dialogs { get; set; }

+ 13 - 1
PDF Office/ViewModels/MainWindowViewModel.cs

@@ -464,7 +464,19 @@ namespace PDF_Master.ViewModels
                 {
                     ContentResult result = ShowSaveDialog((SelectedItem.DataContext as MainContentViewModel).viewContentViewModel);
                     if (result == ContentResult.Cancel)
-                        return false;
+                    {
+                        //如果是设置了,保存前不显示弹窗提示的功能,则点击取消时也可以关闭
+                        //否则,会变成:用户必须要点击保存按钮才能关闭窗体,不合理
+                        if (Settings.Default.AppProperties.Description.NotShowSaveWhenClose)
+                        {
+                            return true;
+                        }
+                        else
+                        {
+                            //普通模式下,点击了取消按钮,则不进行后续的关闭等操作
+                            return false;
+                        }
+                    }
                 }
                 if (selectedItem != null)
                 {

+ 30 - 7
PDF Office/ViewModels/PropertyPanel/AnnotPanel/SnapshotEditMenuViewModel.cs

@@ -33,6 +33,7 @@ using System.Windows.Input;
 using Microsoft.Office.Interop.Excel;
 using static PDF_Master.Model.Dialog.ToolsDialogs.SaftyDialogs.DeleteSafetySettintgsModel;
 using Prism.Services.Dialogs;
+using ComPDFKit.PDFDocument;
 
 namespace PDF_Master.ViewModels.PropertyPanel.AnnotPanel
 {
@@ -196,11 +197,33 @@ namespace PDF_Master.ViewModels.PropertyPanel.AnnotPanel
                         else if (dlg.SafeFileName.ToLower().EndsWith(".pdf"))
                         {
                             //Stream saveStream = dlg.OpenFile();
-
-                            string imagePath = SaveImage(saveBitmap);
-                            if (CreateFile(imagePath))
+                            //方法一
+                            //string imagePath = SaveImage(saveBitmap);
+                            //if (CreateFile(imagePath))
+                            //{
+                            //    bool result = saveToPDFViewer.Document.WriteToFilePath(dlg.FileName);
+                            //}
+                            try
+                            {
+                                saveToPDFViewer = new CPDFViewer();
+                                saveToPDFViewer.CreateDocument();
+                                if (saveToPDFViewer.Document == null)
+                                {
+                                    AlertsMessage alertsMessage = new AlertsMessage();
+                                    alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok"));
+                                    return;
+                                }
+                                byte[] buffer = new byte[saveBitmap.PixelWidth * saveBitmap.PixelHeight * 4];
+                                saveBitmap.CopyPixels(buffer, saveBitmap.PixelWidth * 4, 0);
+
+                                saveToPDFViewer.Document.InsertPage(0, saveBitmap.PixelWidth, saveBitmap.PixelHeight, buffer, CPDFDocumentImageMode.CPDFDocumentImageModeScaleAspectFit);
+                                var result = saveToPDFViewer.Document.WriteToFilePath(dlg.FileName);
+                                if (result)
+                                {
+                                }
+                            }
+                            catch (Exception ex)
                             {
-                                bool result = saveToPDFViewer.Document.WriteToFilePath(dlg.FileName);
                             }
 
                             //saveStream.Dispose();
@@ -301,7 +324,7 @@ namespace PDF_Master.ViewModels.PropertyPanel.AnnotPanel
             try
             {
                 DirectoryInfo tempfolder = new DirectoryInfo(Path.Combine(App.CurrentPath, "Temp"));
-                string strpath = tempfolder + DateTime.Now.ToString("yyyyMMddfff") + ".jpg";
+                string strpath = Path.Combine(tempfolder.FullName, DateTime.Now.ToString("yyyyMMddfff") + ".jpg");
                 if (!File.Exists(tempfolder.FullName))
                 {
                     Directory.CreateDirectory(tempfolder.FullName);
@@ -327,7 +350,7 @@ namespace PDF_Master.ViewModels.PropertyPanel.AnnotPanel
         /// 复制
         /// </summary>
         private void CopyEvent()
-        { 
+        {
             if (SnapToolArgs != null)
             {
                 WriteableBitmap saveBitmap = SnapToolArgs.GetSnapshotImage();
@@ -343,7 +366,7 @@ namespace PDF_Master.ViewModels.PropertyPanel.AnnotPanel
                         SnapToolEvent.Invoke(this, param);
                     }
                 }
-            } 
+            }
         }
 
         private System.Drawing.Bitmap BitmapFromWriteableBitmap(WriteableBitmap writeBmp)

+ 3 - 4
PDF Office/ViewModels/Tools/AnnotToolContentViewModel.Command.cs

@@ -331,7 +331,7 @@ namespace PDF_Master.ViewModels.Tools
                     if (e.IsAnnotCreateReset)
                     {
                         PropertyPanel.annot = e.AnnotItemsList[0];
-                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                         PropertyPanel.AnnotEvents = null;
                         PropertyPanel.AnnotEvent = AnnotEvent;
                         PropertyPanel.annotlists = e.AnnotItemsList;
@@ -692,7 +692,6 @@ namespace PDF_Master.ViewModels.Tools
                         PropertyPanel.annotlists = e.AnnotItemsList;
                         viewContentViewModel.IsMultiSelected = true;
                         //viewContentViewModel.SelectedPrpoertyPanel("PropertyPanelContent", null);
-                       
 
                         #region MVP 在对多选注释做处理
                         bool isDifferentAnnotTyle = AnnotTransfer.IsDifferentTypeAnnots(e.AnnotItemsList);
@@ -885,7 +884,7 @@ namespace PDF_Master.ViewModels.Tools
 
         private void PreviewExcute(object sender, ExecutedRoutedEventArgs e)
         {
-            if (e.Command == ApplicationCommands.Copy||e.Command == ApplicationCommands.Cut)
+            if (e.Command == ApplicationCommands.Copy || e.Command == ApplicationCommands.Cut)
             {
                 VerifyPasswordResult result = SecurityHelper.VerifyPasswordForSelectedPermissions(PDFViewer.Document, Model.Dialog.ToolsDialogs.SaftyDialogs.EnumPermissionsSet.StatusAllowsCopying, dialogs);
                 if (result.IsDiscryptied)
@@ -1729,7 +1728,7 @@ namespace PDF_Master.ViewModels.Tools
                                     if (PropertyPanel != null)
                                     {
                                         //属性面板,切换橡皮擦后,再回到画笔时,需要恢复最近画笔的属性值
-                                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                                         PropertyPanel.AnnotEvent = AnnotEvent;
                                         var AnnotEvents = new List<AnnotAttribEvent>();
                                         AnnotEvents.Add(AnnotEvent);

+ 5 - 6
PDF Office/ViewModels/Tools/AnnotToolContentViewModel.Layout.cs

@@ -66,13 +66,13 @@ namespace PDF_Master.ViewModels.Tools
 
                     foreach (var itemAnnot in annots)
                     {
-                        var eventitem = AnnotAttribEvent.GetAnnotAttribEvent(itemAnnot, itemAnnot.GetAnnotAttrib());
+                        var eventitem = AnnotAttribEvent.GetAnnotAttribEvent(itemAnnot, itemAnnot.GetAnnotAttrib(), PDFViewer);
                         //eventitem.ClearChangeAttribute();
                         PropertyPanel.AnnotEvents.Add(eventitem);
                     }
                 }
 
-                PropertyPanel.AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annots[0], annots[0].GetAnnotAttrib());
+                PropertyPanel.AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annots[0], annots[0].GetAnnotAttrib(), PDFViewer);
                 //propertyPanel.AnnotEvent.ClearChangeAttribute();
                 if (annots[0] is LinkAnnotArgs && annotAttribEvent != null)
                 {
@@ -479,8 +479,7 @@ namespace PDF_Master.ViewModels.Tools
 
             if (tag == "OutLine" || tag == "Link")
             {
-                InBookModeSetIsHidden(menuItem);
-                
+                InBookModeSetIsHidden(menuItem);
             }
 
             menuItem.Click -= AnnotToolMenu_Click;
@@ -665,13 +664,13 @@ namespace PDF_Master.ViewModels.Tools
                 {
                     if (cusMenuItem.Parameter is TextHighlightAnnotArgs textHighlightAnnotArgs)
                     {
-                        var anvent = AnnotAttribEvent.GetAnnotAttribEvent(textHighlightAnnotArgs, textHighlightAnnotArgs.GetAnnotAttrib());
+                        var anvent = AnnotAttribEvent.GetAnnotAttribEvent(textHighlightAnnotArgs, textHighlightAnnotArgs.GetAnnotAttrib(), PDFViewer);
                         anvent.UpdateAttrib(AnnotAttrib.Color, e);
                         anvent.UpdateAnnot();
                     }
                     if (cusMenuItem.Parameter is TextUnderlineAnnotArgs textUnderlineAnnotArgs)
                     {
-                        var anvent = AnnotAttribEvent.GetAnnotAttribEvent(textUnderlineAnnotArgs, textUnderlineAnnotArgs.GetAnnotAttrib());
+                        var anvent = AnnotAttribEvent.GetAnnotAttribEvent(textUnderlineAnnotArgs, textUnderlineAnnotArgs.GetAnnotAttrib(), PDFViewer);
                         anvent.UpdateAttrib(AnnotAttrib.Color, e);
                         anvent.UpdateAnnot();
                     }

+ 148 - 32
PDF Office/ViewModels/Tools/AnnotToolContentViewModel.cs

@@ -3,6 +3,7 @@ using ComPDFKit.PDFDocument;
 using ComPDFKitViewer;
 using ComPDFKitViewer.AnnotEvent;
 using ComPDFKitViewer.PdfViewer;
+using DotNetSpeech;
 using ImTools;
 using Microsoft.Win32;
 using PDF_Master.CustomControl;
@@ -28,6 +29,7 @@ using Prism.Services.Dialogs;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
+using System.Drawing.Imaging;
 using System.IO;
 using System.Linq;
 using System.Reflection;
@@ -1382,13 +1384,13 @@ namespace PDF_Master.ViewModels.Tools
                 {
                     if (annot is FreehandAnnotArgs || annot is StickyAnnotArgs || annot is LineAnnotArgs)
                     {
-                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                         AnnotEvent?.UpdateAttrib(AnnotAttrib.Color, e);
                         AnnotEvent?.UpdateAnnot();
                     }
                     else if (annot is FreeTextAnnotArgs)
                     {
-                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                         if (menu.tag.ToString() == "FontColor")
                             AnnotEvent?.UpdateAttrib(AnnotAttrib.FontColor, e);
                         else
@@ -1398,7 +1400,7 @@ namespace PDF_Master.ViewModels.Tools
                     }
                     else if (annot is SquareAnnotArgs || annot is CircleAnnotArgs)
                     {
-                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                         if (menu.tag.ToString() == "FillColor")
                             AnnotEvent?.UpdateAttrib(AnnotAttrib.FillColor, e);
                         else
@@ -1408,7 +1410,7 @@ namespace PDF_Master.ViewModels.Tools
                     }
                     else if (annot is TextHighlightAnnotArgs || annot is TextUnderlineAnnotArgs || annot is TextStrikeoutAnnotArgs)
                     {
-                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                        var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                         AnnotEvent?.UpdateAttrib(AnnotAttrib.Color, e);
                         AnnotEvent?.UpdateAnnot();
                     }
@@ -1475,7 +1477,7 @@ namespace PDF_Master.ViewModels.Tools
                 var annot = menu.Parameter as FreehandAnnotArgs;
                 if (annot != null)
                 {
-                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                     if (menu.tag.ToString() == "Solid")
                     {
                         AnnotEvent?.UpdateAttrib(AnnotAttrib.LineStyle, AnnotTransfer.GetLineDashStyle(true));
@@ -1500,7 +1502,7 @@ namespace PDF_Master.ViewModels.Tools
                 var annot = menu.Parameter as AnnotHandlerEventArgs;
                 if (annot != null)
                 {
-                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                     AnnotEvent?.UpdateAttrib(AnnotAttrib.FontFamily, new FontFamily(menu.tag.ToString()));
                     AnnotEvent?.UpdateAnnot();
                 }
@@ -1518,7 +1520,7 @@ namespace PDF_Master.ViewModels.Tools
                 {
                     var strTag = tag.ToString();
 
-                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                     if (strTag == "Left")
                     {
                         AnnotEvent?.UpdateAttrib(AnnotAttrib.TextAlign, TextAlignment.Left);
@@ -1575,7 +1577,7 @@ namespace PDF_Master.ViewModels.Tools
                 if (annot != null && tag != null)
                 {
                     var strTag = tag.ToString();
-                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                     if (strTag == "Solid")
                     {
                         var dashStyle = AnnotTransfer.GetLineDashStyle(true);
@@ -1601,7 +1603,7 @@ namespace PDF_Master.ViewModels.Tools
                 if (annot != null && tag != null)
                 {
                     var strTag = tag.ToString();
-                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib());
+                    var AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annot, annot.GetAnnotAttrib(), PDFViewer);
                     if (strTag == "Ver")
                     {
                         annot.SetLineVertical();
@@ -1661,29 +1663,52 @@ namespace PDF_Master.ViewModels.Tools
                         var stampPicture = dlg.FileName;
                         if (menu.tag.ToString() == "PDF")
                         {
-                            var writeStamp = annot.GetStampDrawing();
-                            var tempDoc = new CPDFViewer();
-                            tempDoc.CreateDocument();
-                            if (tempDoc.Document == null)
-                            {
-                                AlertsMessage alertsMessage = new AlertsMessage();
-                                alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok"));
-                                return;
-                            }
-                            byte[] buffer;
-                            var encoder = new PngBitmapEncoder();
-                            encoder.Frames.Add(BitmapFrame.Create(writeStamp));
-                            using (var memoryStream = new MemoryStream())
-                            {
-                                encoder.Save(memoryStream);
-                                buffer = memoryStream.ToArray();
-                            }
-
-                            tempDoc.Document.InsertPage(0, writeStamp.PixelWidth, writeStamp.PixelHeight, buffer, CPDFDocumentImageMode.CPDFDocumentImageModeScaleAspectFit);
-                            var result = tempDoc.Document.WriteToFilePath(dlg.FileName);
-                            if (result)
-                            {
-                            }
+                            try
+                            {
+                                var writeStamp = annot.GetStampDrawing();
+                                var tempDoc = new CPDFViewer();
+                                tempDoc.CreateDocument();
+                                if (tempDoc.Document == null)
+                                {
+                                    AlertsMessage alertsMessage = new AlertsMessage();
+                                    alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok"));
+                                    return;
+                                }
+                                byte[] buffer = new byte[writeStamp.PixelWidth * writeStamp.PixelHeight * 4];
+                                writeStamp.CopyPixels(buffer, writeStamp.PixelWidth * 4, 0);
+
+                                tempDoc.Document.InsertPage(0, writeStamp.PixelWidth, writeStamp.PixelHeight, buffer, CPDFDocumentImageMode.CPDFDocumentImageModeScaleAspectFit);
+                                var result = tempDoc.Document.WriteToFilePath(dlg.FileName);
+                                if (result)
+                                {
+                                }
+                            }
+                            catch (Exception ex)
+                            {
+                            }
+
+                            #region
+                            //之前的方法1
+                            //var encoder = new PngBitmapEncoder();
+                            //encoder.Frames.Add(BitmapFrame.Create(writeStamp));
+                            //using (var memoryStream = new MemoryStream())
+                            //{
+                            //    encoder.Save(memoryStream);
+                            //    buffer = memoryStream.ToArray();
+                            //}
+
+                            //tempDoc.Document.InsertPage(0, writeStamp.PixelWidth, writeStamp.PixelHeight, buffer, CPDFDocumentImageMode.CPDFDocumentImageModeScaleAspectFit);
+                            //var result = tempDoc.Document.WriteToFilePath(dlg.FileName);
+                            //if (result)
+                            //{
+                            //}
+                            //之前的方法2
+                            //string imagePath = SaveImage(writeStamp);
+                            //if (CreateFile(imagePath, tempDoc))
+                            //{
+                            //    bool result = tempDoc.Document.WriteToFilePath(dlg.FileName);
+                            //}
+                            #endregion 注释右键菜单事件
                         }
                         else
                         {
@@ -1695,11 +1720,102 @@ namespace PDF_Master.ViewModels.Tools
                                 encoder5.Save(stream5);
                             }
                         }
+                        CommonHelper.ExplorerFile(dlg.FileName);
                     }
                 }
             }
+        }
+
+        private string SaveImage(WriteableBitmap wtbBmp)
+        {
+            string isSave = null;
+            if (wtbBmp == null)
+            {
+                return isSave;
+            }
+            try
+            {
+                DirectoryInfo tempfolder = new DirectoryInfo(Path.Combine(App.CurrentPath, "Temp"));
+                string strpath = Path.Combine(tempfolder.FullName, DateTime.Now.ToString("yyyyMMddfff") + ".jpg");
+                if (!File.Exists(tempfolder.FullName))
+                {
+                    Directory.CreateDirectory(tempfolder.FullName);
+                }
+
+                using (FileStream stream = new FileStream(strpath, FileMode.Create))
+                {
+                    JpegBitmapEncoder bitmapEncoder = new JpegBitmapEncoder();
+                    bitmapEncoder.Frames.Add(BitmapFrame.Create(wtbBmp));
+                    bitmapEncoder.Save(stream);
+                    isSave = strpath;
+                }
+            }
+            catch (Exception ex)
+            {
+                System.Diagnostics.Debug.WriteLine(ex.ToString());
+                isSave = null;
+            }
+            return isSave;
         }
 
+        public bool CreateFile(string imagePath = null, CPDFViewer saveToPDFViewer = null)
+        {
+            string fileName = null;
+
+            //saveToPDFViewer.CreateDocument();
+            //if (saveToPDFViewer.Document == null)
+            //{
+            //    AlertsMessage alertsMessage = new AlertsMessage();
+            //    alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok"));
+            //    return false;
+            //}
+
+            if (string.IsNullOrEmpty(imagePath))
+            {
+                fileName = "Blank Page.pdf";
+                //默认插入595*842 大小的页面
+                saveToPDFViewer.Document.InsertPage(0, 595, 842, null);
+            }
+            else
+            {
+                fileName = imagePath.Substring(imagePath.LastIndexOf("\\") + 1, imagePath.LastIndexOf(".") - imagePath.LastIndexOf("\\") - 1) + ".pdf";
+                System.Drawing.Bitmap pic = new System.Drawing.Bitmap(imagePath);
+                int width = pic.Size.Width;
+                int height = pic.Size.Height;
+
+                string ex = System.IO.Path.GetExtension(imagePath);
+                //其他格式或者名称中含空格的图片 在本地先转存一下
+                if ((ex != ".jpg" && ex != ".jpeg") || !Uri.IsWellFormedUriString(imagePath, UriKind.Absolute))
+                {
+                    //将其他格式图片转换成jpg
+                    string folderPath = Path.GetTempPath();
+                    if (File.Exists(folderPath))
+                    {
+                        File.Delete(folderPath);
+                    }
+                    DirectoryInfo tempfolder = new DirectoryInfo(folderPath);
+                    if (!tempfolder.Exists)
+                    {
+                        tempfolder.Create();
+                    }
+                    string targetPath = System.IO.Path.Combine(folderPath, Guid.NewGuid().ToString());
+                    imagePath = targetPath;
+                    pic.Save(targetPath, ImageFormat.Jpeg);
+                }
+                pic.Dispose();
+
+                var result = saveToPDFViewer.Document.InsertPage(0, width, height, imagePath);
+                if (!result)
+                {
+                    AlertsMessage alertsMessage = new AlertsMessage();
+                    alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok"));
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
         #endregion 注释右键菜单事件
 
         #region 快捷键

+ 4 - 1
PDF Office/ViewModels/Tools/ConverterBarContentViewModel.cs

@@ -72,7 +72,10 @@ namespace PDF_Master.ViewModels.Tools
             }
 
             //转档前 如果需要 自动保存
-            await viewContentViewModel.SaveBeforeOption();
+            if(!await viewContentViewModel.SaveBeforeOption())
+            {
+                return;
+            }
 
             var args = sender as Button;
             if (args != null)

+ 19 - 14
PDF Office/ViewModels/Tools/ToolsBarContentViewModel.cs

@@ -194,15 +194,17 @@ namespace PDF_Master.ViewModels.Tools
             {
                 return;
             }
-            await  viewContentViewModel.SaveBeforeOption();
-            DialogParameters value = new DialogParameters();
-            value.Add(ParameterNames.PDFViewer, PDFViewer);
-            dialogs.ShowDialog(DialogNames.CompressDialog, value, e =>
+            if (await viewContentViewModel.SaveBeforeOption())
             {
-                CompressDialogModel compressDialogModel = new CompressDialogModel();
-                compressDialogModel.OnOpened((Prism.Services.Dialogs.DialogResult)e);
-                // OnOpened((Prism.Services.Dialogs.DialogResult)e);
-            });
+                DialogParameters value = new DialogParameters();
+                value.Add(ParameterNames.PDFViewer, PDFViewer);
+                dialogs.ShowDialog(DialogNames.CompressDialog, value, e =>
+                {
+                    CompressDialogModel compressDialogModel = new CompressDialogModel();
+                    compressDialogModel.OnOpened((Prism.Services.Dialogs.DialogResult)e);
+                    // OnOpened((Prism.Services.Dialogs.DialogResult)e);
+                });
+            }
         }
 
         //private int GetIndex(int pageindex)
@@ -250,12 +252,15 @@ namespace PDF_Master.ViewModels.Tools
             {
                 return;
             }
-            await viewContentViewModel.SaveBeforeOption();
-            DialogParameters value = new DialogParameters();
-            value.Add(ParameterNames.PDFViewer, PDFViewer);
-            value.Add(ParameterNames.FilePath, PDFViewer.Document.FilePath);
-            value.Add(ParameterNames.Unicode, unicode);
-            dialogs.ShowDialog(DialogNames.MergeDialog, value, e => { });
+            if (await viewContentViewModel.SaveBeforeOption())
+            {
+                DialogParameters value = new DialogParameters();
+                value.Add(ParameterNames.PDFViewer, PDFViewer);
+                value.Add(ParameterNames.FilePath, PDFViewer.Document.FilePath);
+                value.Add(ParameterNames.Unicode, unicode);
+                dialogs.ShowDialog(DialogNames.MergeDialog, value, e => { });
+
+            }
         }
 
         private void OpenSetPasswordDialog()

+ 5 - 3
PDF Office/ViewModels/ViewContentViewModel.cs

@@ -948,7 +948,6 @@ namespace PDF_Master.ViewModels
 
         private void nextview()
         {
-
             bottom?.NextViewCommnad.Execute();
         }
 
@@ -2385,8 +2384,10 @@ namespace PDF_Master.ViewModels
             }
             PDFViewer.SnapsToDevicePixels = true;
             PDFViewer.UseLayoutRounding = true;
+            RenderOptions.SetBitmapScalingMode(PDFViewer,BitmapScalingMode.Fant);
             region.AddToRegion(ViwerRegionName, PDFViewer);
 
+
             if (App.mainWindowViewModel != null)
             {
                 //更新CurrentPDFViewer对象
@@ -2798,6 +2799,7 @@ namespace PDF_Master.ViewModels
         /// </summary>
         public async Task<bool> SaveBeforeOption()
         {
+            bool result = true;
             if (PDFViewer.UndoManager.CanSave)
             {
                 string title = "Saving File";
@@ -2805,11 +2807,11 @@ namespace PDF_Master.ViewModels
                 //让保存的效果更明显
                 await Task.Delay(200);
                 //合并前自动保存一次
-                saveFile(true);
+                result =  saveFile(true);
                 App.mainWindowViewModel.SetProcessValue(title, 100, 100, false);
             }
             //方便其他调用的地方可以异步 await调用,增加显示保存过程的效果
-            return true;
+            return result;
         }
 
         /// <summary>

+ 1 - 0
PDF Office/Views/BOTA/BOTAContent.xaml.cs

@@ -36,6 +36,7 @@ namespace PDF_Master.Views.BOTA
                 if (item.IsSelected)
                 {
                     (this.DataContext as BOTAContentViewModel).viewContentViewModel.OpenBOTA = false;
+                    (this.DataContext as BOTAContentViewModel).pdfViewer?.UpdateLayout();
                     item.IsSelected = false;
                 }
                 else

+ 1 - 0
PDF Office/Views/PropertyPanel/AnnotPanel/FreetextAnnotProperty.xaml

@@ -143,6 +143,7 @@
                         HorizontalAlignment="Left"
                         IsValueContent="True"
                         ItemSource="{Binding FontVm.PresetFontItems, Mode=OneWay}"
+                        SelectedIndex="{Binding FontVm.PresetFontSelectedIndex, Mode=TwoWay}"
                         SelectedItems="{Binding FontVm.CurrentPresetFont, Mode=TwoWay}">
                         <i:Interaction.Triggers>
                             <i:EventTrigger EventName="ValueChanged">

+ 3 - 0
PDF Office/Views/ViewContent.xaml

@@ -299,6 +299,7 @@
                                 InputGestureText="Ctrl+P" />
                             <Separator Margin="8,0" Style="{StaticResource HorizontalSeparatorStyle}" />
                             <MenuItem Command="{Binding SettingsCommand}" Header="Settings" />
+                            <MenuItem Header="Check Update" Click="MenuItem_Click"/>
                             <MenuItem Header="Help">
                                 <MenuItem
                                     Command="{Binding HelpCommand}"
@@ -457,6 +458,8 @@
                     HorizontalAlignment="Center"
                     VerticalAlignment="Top"
                     BorderThickness="0"
+                    FocusVisualStyle="{x:Null}"
+                    Keyboard.PreviewKeyDown="ToolTabControl_PreviewKeyDown"
                     PreviewMouseLeftButtonDown="ToolTabControl_PreviewMouseLeftButtonDown"
                     SelectedIndex="{Binding TabSelectedIndex, Mode=TwoWay}"
                     Style="{StaticResource TabControlWithUnderLineStyle}"

+ 16 - 0
PDF Office/Views/ViewContent.xaml.cs

@@ -547,5 +547,21 @@ namespace PDF_Master.Views
             this.Focusable = true;
             this.Focus();
         }
+
+        private void ToolTabControl_PreviewKeyDown(object sender, KeyEventArgs e)
+        {
+            //禁用控件的左右按键,避免和左右翻页快捷键冲突
+            if(e.Key== Key.Left||e.Key==Key.Right||e.Key==Key.Tab)
+            {
+                e.Handled = true;
+            }
+        }
+
+        private void MenuItem_Click(object sender, RoutedEventArgs e)
+        {
+            //检查更新
+            if (App.SparkleUpdateDetector != null)
+                App.SparkleUpdateDetector?.CheckForUpdatesAtUserRequest();
+        }
     }
 }

+ 26 - 0
UpdateXML/pdfmaster_win_en_Us.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"  xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <channel>
+    <title>PDF Reader Pro's Changelog</title>
+    <link> https://www.pdfreaderpro.com/downloads/pdfreaderprocast_win.xml</link>
+    <description>Most recent changes with links to updates.</description>
+    <language>en</language>
+      <item>
+        <title>Version 1.1.0</title>
+        <description>
+            <![CDATA[
+          <ul>
+            <head>PDF Reader Pro gets a new update! Discover a fast and easy way to convert PDF to Office!</head>
+            <br></br>
+              <li>Upgrade PDF Converter: Convert PDFs to Microsoft Word (.docx), PowerPoint (.pptx), Excel (.xlsx), Text, Image and more Offline;</li>
+                <li>Tiny bug fixed and performance optimization for user experience.</li>
+            <br></br>
+            <head>Have any questions or feedback? Please feel free to contact us at support@pdfreaderpro.com.</head>
+            </ul>
+            ]]>
+        </description>
+       <pubDate>Thur, 20 Dec 2022 00:00:00 +0000</pubDate>
+        <enclosure url="http://test-pdf-pro.kdan.cn:3021/downloads/PDFMaster.exe" sparkle:version="1.1.0.0" />
+      </item>
+  </channel>
+</rss>

+ 26 - 0
UpdateXML/pdfmaster_win_zh_Hans.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"  xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <channel>
+    <title>PDF Reader Pro's Changelog</title>
+    <link> https://www.pdfreaderpro.com/downloads/pdfreaderprocast_win.xml</link>
+    <description>Most recent changes with links to updates.</description>
+    <language>en</language>
+           <item>
+        <title>Version 1.1.0.0</title>
+        <description>
+            <![CDATA[
+           <ul>
+            <head>PDF Reader Pro 新版本发布!利用升级的转档工具快速将PDF转换成Office文档!</head>
+            <br></br>
+              <li>优化PDF转档器:快速将您的PDF文件转换为Microsoft Word (.docx)、Excel (.xlsx)、PowerPoint (.pptx)、图片和文本等;</li>
+                <li>已知问题修复,性能优化,提高用户体验。</li>
+            <br></br>
+            <head>有任何反馈,意见或是建议,请随时与我们联系:support@pdfreaderpro.com</head>
+            </ul>
+            ]]>
+        </description>
+       <pubDate>Thur, 20 Dec 2022 00:00:00 +0000</pubDate>
+     <enclosure url="http://test-pdf-pro.kdan.cn:3021/downloads/PDFMaster.exe" sparkle:version="1.1.0.0" />
+      </item>
+  </channel>
+</rss>

+ 26 - 0
UpdateXML/pdfmaster_win_zh_Hant.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"  xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <channel>
+    <title>PDF Reader Pro's Changelog</title>
+    <link> https://www.pdfreaderpro.com/downloads/pdfreaderprocast_win.xml</link>
+    <description>Most recent changes with links to updates.</description>
+    <language>en</language>
+          <item>
+        <title>Version 1.1.0.0</title>
+        <description>
+            <![CDATA[
+           <ul>
+            <head>PDF Reader Pro新版發佈!利用升級的轉檔工具快速將PDF轉換成Office文檔!</head>
+            <br></br>
+                <li>優化PDF轉檔器:快速將您的PDF文檔轉換為Microsoft Word (.docx)、Excel (.xlsx)、PowerPoint (.pptx)、圖片和文本等;</li>
+                <li>已知問題修復,優化性能,提高用戶體驗感。</li>
+            <br></br>
+            <head>有任何反饋,意見或是建議,請隨時與我們聯繫:support@pdfreaderpro.com</head>
+            </ul>
+            ]]>
+        </description>
+       <pubDate>Thur, 20 Dec 2022 00:00:00 +0000</pubDate>
+     <enclosure url="http://test-pdf-pro.kdan.cn:3021/downloads/PDFMaster.exe" sparkle:version="1.1.0.0" />
+      </item>
+  </channel>
+</rss>