From 342e32f49fbba36c8f489d2a73fc2667877fcd37 Mon Sep 17 00:00:00 2001 From: callmeyan Date: Thu, 13 Mar 2025 20:33:25 +0800 Subject: [PATCH] =?UTF-8?q?fixed:=20=E5=8F=A6=E5=AD=98=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E9=9D=A2=E6=9D=BF=E8=A2=AB=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/AIProofread/v17/.suo | Bin 2129408 -> 3049984 bytes AIProofread/AIProofread.csproj | 1 + AIProofread/Bridge.cs | 27 +++- AIProofread/Config.cs | 2 +- AIProofread/Controls/FormContact.Designer.cs | 4 +- AIProofread/Controls/FormLogger.cs | 2 +- AIProofread/Logger.cs | 3 +- AIProofread/Model/DocumentInfo.cs | 27 +++- AIProofread/Model/ExportDataItem.cs | 2 +- AIProofread/Ribbon1.Designer.cs | 134 +++++++++---------- AIProofread/Ribbon1.cs | 6 +- AIProofread/ThisAddIn.cs | 35 +++-- AIProofread/core/DocumentReader.cs | 76 +++++++++++ AIProofread/core/DocumentUtil.cs | 2 +- AIProofread/core/Tools.cs | 129 +++++++++++------- updater/Form1.cs | 91 +++++++++---- updater/OfficeStarter.cs | 74 +++++----- util-lib/CorrectItem.cs | 2 +- 18 files changed, 401 insertions(+), 216 deletions(-) create mode 100644 AIProofread/core/DocumentReader.cs diff --git a/.vs/AIProofread/v17/.suo b/.vs/AIProofread/v17/.suo index 835cfbdb40b59d2c097b8d45e51eecec2d7ae294..d4d7a0370302e8df8b6ad7f9a54289f0855268cb 100644 GIT binary patch delta 68189 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 A9{>OV delta 24698 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 diff --git a/AIProofread/AIProofread.csproj b/AIProofread/AIProofread.csproj index e08abca..ae7b7c0 100644 --- a/AIProofread/AIProofread.csproj +++ b/AIProofread/AIProofread.csproj @@ -373,6 +373,7 @@ + diff --git a/AIProofread/Bridge.cs b/AIProofread/Bridge.cs index 0449052..ae17d92 100644 --- a/AIProofread/Bridge.cs +++ b/AIProofread/Bridge.cs @@ -7,6 +7,7 @@ using Microsoft.Office.Tools.Word; using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.WinForms; using Newtonsoft.Json; +using NPOI; using NPOI.SS.Formula; using NPOI.XSSF.UserModel; using NPOI.XWPF.UserModel; @@ -46,7 +47,7 @@ namespace AIProofread public static Dictionary marks; - private static int selectProofreadId = -1; + //private static int selectProofreadId = -1; private static object missing = System.Reflection.Missing.Value; @@ -246,6 +247,8 @@ namespace AIProofread ProcessStartInfo processStartInfo = new ProcessStartInfo(Path.Combine(applicationBase, Path.GetFileName(path))) { WorkingDirectory = applicationBase, + UseShellExecute = true, + Verb="runas" }; Process.Start(processStartInfo); } @@ -336,12 +339,12 @@ namespace AIProofread if (ShouldUpgradeForced()) { data.Add("code", 2); - data.Add("message", "请升级插件后再进行校对"); + data.Add("message", "请先升级插件后再进行校对"); } else if (doc.ProtectionType != WdProtectionType.wdNoProtection) { data.Add("code", 3); - data.Add("message", "文档受保护,无法编辑"); + data.Add("message", "文档受保护,请另存文档后再进行校对"); } else if (doc.ReadOnly) { @@ -369,7 +372,22 @@ namespace AIProofread data.Add("documentId", GeIdBytDocument(doc)); data.Add("wordsCount", doc.Words.Count); data.Add("charactersCount", doc.Characters.Count); - data.Add("content", Tools.GetAllText(doc)); + try + { + + data.Add("content", Tools.GetAllText(doc)); + } + catch (POIXMLException ex) + { + Logger.Log(ex); + data["code"] = 5; + data["message"] = "文档格式有误,请另存文档后再进行校对"; + } + catch (Exception ex) + { + Logger.Log(ex); + throw ex; + } //if (loadingDialog != null && !loadingDialog.IsDisposed) //{ // loadingDialog.Close(); @@ -751,6 +769,7 @@ namespace AIProofread } catch (Exception ex) { + Logger.Log("导出勘误表失败:" + ex.Message + "\n" + ex.StackTrace + "\n\n"); return BridgeResult.Error(-1, ex.Message); } } diff --git a/AIProofread/Config.cs b/AIProofread/Config.cs index d4a1ff1..4172a7b 100644 --- a/AIProofread/Config.cs +++ b/AIProofread/Config.cs @@ -12,7 +12,7 @@ namespace AIProofread public class Config { public static readonly string APP_NAME = "AI校对王"; - public static readonly string APP_VERSION = "2.2.1"; + public static readonly string APP_VERSION = "2.2.2"; public static bool IS_WPS = false; public static bool UpgradeForcedNotice = false; public static readonly string APP_BASE_DIR = AppDomain.CurrentDomain.BaseDirectory; diff --git a/AIProofread/Controls/FormContact.Designer.cs b/AIProofread/Controls/FormContact.Designer.cs index 8a52482..19e0dc1 100644 --- a/AIProofread/Controls/FormContact.Designer.cs +++ b/AIProofread/Controls/FormContact.Designer.cs @@ -40,7 +40,7 @@ this.WebViewContact.Dock = System.Windows.Forms.DockStyle.Fill; this.WebViewContact.Location = new System.Drawing.Point(0, 0); this.WebViewContact.Name = "WebViewContact"; - this.WebViewContact.Size = new System.Drawing.Size(540, 420); + this.WebViewContact.Size = new System.Drawing.Size(620, 450); this.WebViewContact.TabIndex = 0; this.WebViewContact.ZoomFactor = 1D; // @@ -48,7 +48,7 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(540, 420); + this.ClientSize = new System.Drawing.Size(620, 450); this.Controls.Add(this.WebViewContact); this.Name = "FormContact"; this.ShowIcon = false; diff --git a/AIProofread/Controls/FormLogger.cs b/AIProofread/Controls/FormLogger.cs index 387a54b..094fba8 100644 --- a/AIProofread/Controls/FormLogger.cs +++ b/AIProofread/Controls/FormLogger.cs @@ -5,7 +5,7 @@ namespace AIProofread.Controls { public partial class FormLogger : Form { - private ListView LogListView; + private ListView LogListView = new ListView(); public FormLogger() { diff --git a/AIProofread/Logger.cs b/AIProofread/Logger.cs index f13c67e..3ee9048 100644 --- a/AIProofread/Logger.cs +++ b/AIProofread/Logger.cs @@ -23,7 +23,6 @@ namespace AIProofread if (LoggerForm != null && !LoggerForm.IsDisposed && LoggerForm.Visible) { LoggerForm.Log(time, tag, message); - return; } string path = Config.APP_LOG_PATH + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; if (!Directory.Exists(Config.APP_LOG_PATH)) @@ -41,7 +40,7 @@ namespace AIProofread streamWriter.Close(); streamWriter.Dispose(); } - catch (Exception e) { } + catch (Exception) { } } public static void Log(string msg) { diff --git a/AIProofread/Model/DocumentInfo.cs b/AIProofread/Model/DocumentInfo.cs index 14d5e56..882686c 100644 --- a/AIProofread/Model/DocumentInfo.cs +++ b/AIProofread/Model/DocumentInfo.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; using AIProofread.Controls; @@ -158,7 +159,7 @@ namespace AIProofread.Model private void ShowDocumentStatus(string tag) { - Logger.Log($"{fileName} {tag} PaneVisible is {PaneVisible} Poofread is {Proofread} Proofreading is {Proofreading}"); + // Logger.Log($"{fileName} {tag} PaneVisible is {PaneVisible} Poofread is {Proofread} Proofreading is {Proofreading}"); } /// @@ -211,6 +212,12 @@ namespace AIProofread.Model { try { + // 释放com + try + { + Marshal.ReleaseComObject(CurrentDocument); + } + catch (Exception) { } if(TaskPane.Control.IsDisposed) return; ProofreadMainControl control = (ProofreadMainControl)TaskPane.Control; control.ResetWeb(); @@ -647,7 +654,7 @@ namespace AIProofread.Model foreach (var item in correct.CorrectItems) { if (marks.ContainsKey(item.Id)) continue; - Logger.Log(string.Format("mark type {0} data {1}->{2}", item.Tag, item.Origin, item.Text)); + // Logger.Log(string.Format("mark type {0} data {1}->{2}", item.Tag, item.Origin, item.Text)); int _prev = prevOffset; bool isDisabled = false; // 判断查找内容是否在原始数据中,否则直跳过 @@ -773,7 +780,7 @@ namespace AIProofread.Model pi.originBackgroundColor = info.Background; pi.originSize = info.Size; } - catch (Exception ex) { } + catch (Exception ex) { Logger.Log(ex); } } marks.Add(item.Id, pi); } @@ -888,7 +895,7 @@ namespace AIProofread.Model TaskPane.Control.Focus(); } - internal void Close() + public void Close() { try { @@ -896,7 +903,8 @@ namespace AIProofread.Model marks.Clear(); // 清除区域相关数据 ranges.Clear(); - TaskPane.Dispose(); + // TaskPane.Dispose(); + this.Dispose(); } catch (Exception ex) { @@ -912,7 +920,7 @@ namespace AIProofread.Model })); } - internal void ShowUpgrade(string data, bool force) + public void ShowUpgrade(string data, bool force) { TaskPane.Control.BeginInvoke(new Action(() => { @@ -922,6 +930,7 @@ namespace AIProofread.Model if (force) { + // 已经强制更新但被忽略过则不再提示 if (Config.UpgradeForcedNotice) return; var result = MessageBox.Show(upgradeData.Message, "是否确认更新", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question); @@ -1009,5 +1018,11 @@ namespace AIProofread.Model } return dic; } + + internal void CheckPanel() + { + Logger.Log(CurrentDocument.FullName + $" TaskPane visible {PaneVisible} has " + (TaskPane == null ? "null" : "exists")); + if (TaskPane == null) CreateTaskPane(); + } } } diff --git a/AIProofread/Model/ExportDataItem.cs b/AIProofread/Model/ExportDataItem.cs index df15677..d28a47b 100644 --- a/AIProofread/Model/ExportDataItem.cs +++ b/AIProofread/Model/ExportDataItem.cs @@ -50,7 +50,7 @@ namespace AIProofread.Model return originText; } } - catch (Exception ex) { } + catch (Exception ex) { Logger.Log(ex); } var range = item.mark.Range; // 获取range所在句子 diff --git a/AIProofread/Ribbon1.Designer.cs b/AIProofread/Ribbon1.Designer.cs index 6d61c94..9e8b2a8 100644 --- a/AIProofread/Ribbon1.Designer.cs +++ b/AIProofread/Ribbon1.Designer.cs @@ -41,13 +41,6 @@ namespace AIProofread Microsoft.Office.Tools.Ribbon.RibbonDropDownItem ribbonDropDownItemImpl3 = this.Factory.CreateRibbonDropDownItem(); this.tabAIProofread = this.Factory.CreateRibbonTab(); this.group1 = this.Factory.CreateRibbonGroup(); - this.Group = this.Factory.CreateRibbonGroup(); - this.grpOther = this.Factory.CreateRibbonGroup(); - this.LblDate = this.Factory.CreateRibbonLabel(); - this.LblNickname = this.Factory.CreateRibbonLabel(); - this.group2 = this.Factory.CreateRibbonGroup(); - this.grpDebug = this.Factory.CreateRibbonGroup(); - this.dropDown1 = this.Factory.CreateRibbonDropDown(); this.BtnProofreadAll = this.Factory.CreateRibbonButton(); this.menuProofreadList = this.Factory.CreateRibbonMenu(); this.BtnProofreadExact = this.Factory.CreateRibbonButton(); @@ -60,14 +53,20 @@ namespace AIProofread this.btnDetectionParagraph = this.Factory.CreateRibbonButton(); this.btnDetectionHistory = this.Factory.CreateRibbonButton(); this.btnSetting = this.Factory.CreateRibbonButton(); + this.Group = this.Factory.CreateRibbonGroup(); this.ButtonSaveCache = this.Factory.CreateRibbonButton(); this.ButtonLoadCache = this.Factory.CreateRibbonButton(); + this.grpOther = this.Factory.CreateRibbonGroup(); this.BtnGetContact = this.Factory.CreateRibbonButton(); this.BtnUpdate = this.Factory.CreateRibbonButton(); this.btnLogin = this.Factory.CreateRibbonButton(); this.btnLogout = this.Factory.CreateRibbonButton(); + this.LblDate = this.Factory.CreateRibbonLabel(); + this.LblNickname = this.Factory.CreateRibbonLabel(); + this.group2 = this.Factory.CreateRibbonGroup(); this.BtnShowPanel = this.Factory.CreateRibbonButton(); this.BtnShowManual = this.Factory.CreateRibbonButton(); + this.grpDebug = this.Factory.CreateRibbonGroup(); this.btnShowPane = this.Factory.CreateRibbonButton(); this.btnHidePane = this.Factory.CreateRibbonButton(); this.BtnOpenLog = this.Factory.CreateRibbonButton(); @@ -76,6 +75,7 @@ namespace AIProofread this.BtnTest = this.Factory.CreateRibbonButton(); this.BtnOpenAppDir = this.Factory.CreateRibbonButton(); this.BtnShowVersion = this.Factory.CreateRibbonButton(); + this.dropDown1 = this.Factory.CreateRibbonDropDown(); this.tabAIProofread.SuspendLayout(); this.group1.SuspendLayout(); this.Group.SuspendLayout(); @@ -106,66 +106,6 @@ namespace AIProofread this.group1.Items.Add(this.btnSetting); this.group1.Name = "group1"; // - // Group - // - this.Group.Items.Add(this.ButtonSaveCache); - this.Group.Items.Add(this.ButtonLoadCache); - this.Group.Name = "Group"; - // - // grpOther - // - this.grpOther.Items.Add(this.BtnGetContact); - this.grpOther.Items.Add(this.BtnUpdate); - this.grpOther.Items.Add(this.btnLogin); - this.grpOther.Items.Add(this.btnLogout); - this.grpOther.Items.Add(this.LblDate); - this.grpOther.Items.Add(this.LblNickname); - this.grpOther.Name = "grpOther"; - // - // LblDate - // - this.LblDate.Label = "过期时间:"; - this.LblDate.Name = "LblDate"; - this.LblDate.Visible = false; - // - // LblNickname - // - this.LblNickname.Label = "xxx 已登录"; - this.LblNickname.Name = "LblNickname"; - this.LblNickname.Visible = false; - // - // group2 - // - this.group2.Items.Add(this.BtnShowPanel); - this.group2.Items.Add(this.BtnShowManual); - this.group2.Name = "group2"; - // - // grpDebug - // - this.grpDebug.Items.Add(this.btnShowPane); - this.grpDebug.Items.Add(this.btnHidePane); - this.grpDebug.Items.Add(this.BtnOpenLog); - this.grpDebug.Items.Add(this.button1); - this.grpDebug.Items.Add(this.BtnOpenLogger); - this.grpDebug.Items.Add(this.BtnTest); - this.grpDebug.Items.Add(this.BtnOpenAppDir); - this.grpDebug.Items.Add(this.BtnShowVersion); - this.grpDebug.Items.Add(this.dropDown1); - this.grpDebug.Label = "开发调试"; - this.grpDebug.Name = "grpDebug"; - this.grpDebug.Visible = false; - // - // dropDown1 - // - ribbonDropDownItemImpl1.Label = "开发"; - ribbonDropDownItemImpl2.Label = "测试"; - ribbonDropDownItemImpl3.Label = "生产"; - this.dropDown1.Items.Add(ribbonDropDownItemImpl1); - this.dropDown1.Items.Add(ribbonDropDownItemImpl2); - this.dropDown1.Items.Add(ribbonDropDownItemImpl3); - this.dropDown1.Label = "环境"; - this.dropDown1.Name = "dropDown1"; - // // BtnProofreadAll // this.BtnProofreadAll.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge; @@ -270,6 +210,12 @@ namespace AIProofread this.btnSetting.ShowImage = true; this.btnSetting.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnSetting_Click); // + // Group + // + this.Group.Items.Add(this.ButtonSaveCache); + this.Group.Items.Add(this.ButtonLoadCache); + this.Group.Name = "Group"; + // // ButtonSaveCache // this.ButtonSaveCache.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge; @@ -288,6 +234,16 @@ namespace AIProofread this.ButtonLoadCache.ShowImage = true; this.ButtonLoadCache.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.ButtonLoadCache_Click); // + // grpOther + // + this.grpOther.Items.Add(this.BtnGetContact); + this.grpOther.Items.Add(this.BtnUpdate); + this.grpOther.Items.Add(this.btnLogin); + this.grpOther.Items.Add(this.btnLogout); + this.grpOther.Items.Add(this.LblDate); + this.grpOther.Items.Add(this.LblNickname); + this.grpOther.Name = "grpOther"; + // // BtnGetContact // this.BtnGetContact.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge; @@ -325,6 +281,24 @@ namespace AIProofread this.btnLogout.Visible = false; this.btnLogout.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnLogout_Click); // + // LblDate + // + this.LblDate.Label = "过期时间:"; + this.LblDate.Name = "LblDate"; + this.LblDate.Visible = false; + // + // LblNickname + // + this.LblNickname.Label = "xxx 已登录"; + this.LblNickname.Name = "LblNickname"; + this.LblNickname.Visible = false; + // + // group2 + // + this.group2.Items.Add(this.BtnShowPanel); + this.group2.Items.Add(this.BtnShowManual); + this.group2.Name = "group2"; + // // BtnShowPanel // this.BtnShowPanel.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge; @@ -343,6 +317,21 @@ namespace AIProofread this.BtnShowManual.ShowImage = true; this.BtnShowManual.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnShowManual_Click); // + // grpDebug + // + this.grpDebug.Items.Add(this.btnShowPane); + this.grpDebug.Items.Add(this.btnHidePane); + this.grpDebug.Items.Add(this.BtnOpenLog); + this.grpDebug.Items.Add(this.button1); + this.grpDebug.Items.Add(this.BtnOpenLogger); + this.grpDebug.Items.Add(this.BtnTest); + this.grpDebug.Items.Add(this.BtnOpenAppDir); + this.grpDebug.Items.Add(this.BtnShowVersion); + this.grpDebug.Items.Add(this.dropDown1); + this.grpDebug.Label = "开发调试"; + this.grpDebug.Name = "grpDebug"; + this.grpDebug.Visible = false; + // // btnShowPane // this.btnShowPane.Label = "显示面板"; @@ -391,6 +380,17 @@ namespace AIProofread this.BtnShowVersion.Name = "BtnShowVersion"; this.BtnShowVersion.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnShowVersion_Click); // + // dropDown1 + // + ribbonDropDownItemImpl1.Label = "开发"; + ribbonDropDownItemImpl2.Label = "测试"; + ribbonDropDownItemImpl3.Label = "生产"; + this.dropDown1.Items.Add(ribbonDropDownItemImpl1); + this.dropDown1.Items.Add(ribbonDropDownItemImpl2); + this.dropDown1.Items.Add(ribbonDropDownItemImpl3); + this.dropDown1.Label = "环境"; + this.dropDown1.Name = "dropDown1"; + // // Ribbon1 // this.Name = "Ribbon1"; diff --git a/AIProofread/Ribbon1.cs b/AIProofread/Ribbon1.cs index b4caa35..85174ef 100644 --- a/AIProofread/Ribbon1.cs +++ b/AIProofread/Ribbon1.cs @@ -18,7 +18,6 @@ namespace AIProofread public partial class Ribbon1 { private bool IS_LOGIN = false; - private static bool IS_WPS = false; private Userinfo currentLoginUserinfo; private void Ribbon1_Load(object sender, RibbonUIEventArgs e) @@ -71,6 +70,7 @@ namespace AIProofread else if (key == "disable-by-upgrade") { SetCommonBtnStatus(status); + BtnUpdate.Enabled = true; BtnShowPanel.Enabled = status; } } @@ -80,7 +80,6 @@ namespace AIProofread /// public void InitWPS() { - IS_WPS = true; BtnProofreadAll.Image = AIProofread.Properties.Resources.icon_proofread_wps; menuProofreadList.Image = AIProofread.Properties.Resources.icon_proofread_wps; @@ -630,11 +629,14 @@ namespace AIProofread private void BtnProofreadExact_Click(object sender, RibbonControlEventArgs e) { + // + Globals.ThisAddIn.ActiveDocument.CheckPanel(); Globals.ThisAddIn.SendMessageToWeb("start", "exact"); } private void BtnProofreadFull_Click(object sender, RibbonControlEventArgs e) { + Globals.ThisAddIn.ActiveDocument.CheckPanel(); Globals.ThisAddIn.SendMessageToWeb("start", "full"); } } diff --git a/AIProofread/ThisAddIn.cs b/AIProofread/ThisAddIn.cs index e6263a9..6840c63 100644 --- a/AIProofread/ThisAddIn.cs +++ b/AIProofread/ThisAddIn.cs @@ -10,6 +10,7 @@ using AIProofread.Model; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Threading.Tasks; +using System.Text; //using CustomTaskPane = Microsoft.Office.Core.CustomTaskPane; //using CustomTaskPane = Microsoft.Office.Tools.CustomTaskPane; //using NPOI.SS.Formula.Functions; @@ -122,8 +123,8 @@ namespace AIProofread Application.WindowActivate += Application_WindowActivate; //Application.WindowDeactivate += Application_WindowDeactivate; - Application.DocumentBeforeSave += Application_DocumentBeforeSave; ; - + Application.DocumentBeforeSave += Application_DocumentBeforeSave; + (Application as ApplicationEvents4_Event).NewDocument += Application_NewDocument; Application.DocumentChange += Application_DocumentChange; // 选区发生变化事件 @@ -139,7 +140,7 @@ namespace AIProofread } catch (Exception ex1) { - Logger.Log("Startup", ex1.ToString()); + Logger.Log("Startup Error" + ex1.ToString()); } } @@ -163,7 +164,7 @@ namespace AIProofread } catch (Exception ex) { - Logger.Log("InitDeviceId", ex.ToString()); + Logger.Log("InitDeviceId Error:" + ex.ToString()); } }); } @@ -172,24 +173,30 @@ namespace AIProofread public void CheckDocumentClosed(object sender, System.Timers.ElapsedEventArgs e) { var existsList = new List(); - Logger.Log("检测文档是否关闭 ..."); try { - if (documentList.Count == 0) return; - + var docList = CurrentWordApplication.Documents; + if (documentList.Count == 0 || docList.Count == existsList.Count) return; existsList.Clear(); - - foreach (Document item in CurrentWordApplication.Documents) + foreach (Document item in docList) { existsList.Add(item.FullName); } + // 检测文档是否关闭 for (int i = documentList.documentList.Count - 1; i >= 0; i--) { var item = documentList.documentList[i]; - if (!existsList.Contains(item.fileName)) + // 可能出现另存问题 所以需要更新文件名称 + var oldName = item.fileName; + var currentName = item.CurrentDocument.FullName; + if(oldName != currentName) { - Logger.Log("检测到文档关闭,已移除:" + item.fileName); + item.fileName = currentName; + } + if (!existsList.Contains(currentName)) + { + Logger.Log("检测到文档关闭,已移除:" + currentName); try { item.RunInMainThread(() => @@ -340,7 +347,7 @@ namespace AIProofread // 设置当前文档 ActiveDocument = documentList.SetActiveDocument(CurrentWordApplication.ActiveDocument); ActiveDocument.CheckBtnStatus(); - CheckDocumentClosed(null,null); + CheckDocumentClosed(null, null); Logger.Log("Application_DocumentChange -- " + ActiveDocument.fileName); } @@ -426,12 +433,12 @@ namespace AIProofread private void Application_NewDocument(Document doc) { - Logger.Log("NewDocument", doc.Name); + Logger.Log("NewDocument" + doc.Name); } private void Application_DocumentOpen(Document doc) { - Logger.Log("DocumentOpen", doc.Name); + Logger.Log("DocumentOpen " + doc.Name); } diff --git a/AIProofread/core/DocumentReader.cs b/AIProofread/core/DocumentReader.cs new file mode 100644 index 0000000..37474cb --- /dev/null +++ b/AIProofread/core/DocumentReader.cs @@ -0,0 +1,76 @@ +using System.Runtime.InteropServices; +using System.Windows.Forms; +using System; +using Word = Microsoft.Office.Interop.Word; +using System.Collections.Generic; + +namespace AIProofread.core +{ + public class ProcessingContext + { + public Word.Range Range { get; set; } + public int GlobalIndex { get; set; } + } + public class DocumentReader + { + private static readonly Stack _processingStack = new Stack(); + public static List ReadByVSTO(Word.Document _doc, Word.Application _app, List list) + { + //List list = new List(); + try + { + // 关闭屏幕更新 + _app.ScreenUpdating = false; + + // 初始化堆栈:处理所有顶级 StoryRanges + foreach (Word.Range storyRange in _doc.StoryRanges) + { + _processingStack.Push(new ProcessingContext + { + Range = storyRange, + GlobalIndex = 0, + }); + } + + // 迭代处理堆栈中的每个 Range + while (_processingStack.Count > 0) + { + var context = _processingStack.Pop(); + ProcessElement(context.Range, context.GlobalIndex, list); + Marshal.ReleaseComObject(context.Range); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + finally + { + _app.ScreenUpdating = true; + Marshal.ReleaseComObject(_doc); + } + return list; + } + private static void ProcessElement(Word.Range range, int globalIndex, List list) + { + if (range.Text?.Trim() == "\r\a") + { + globalIndex++; + return; + } + var paragraphs = range.Paragraphs; + // Debug.WriteLine($"Processing element: {range.Text}"); + // 处理段落 + foreach (Word.Paragraph paragraph in paragraphs) + { + list.Add(new DocumentText + { + Text = paragraph.Range.Text, + ParagraphNumber = globalIndex + 1 + }); + Marshal.ReleaseComObject(paragraph); + globalIndex++; + } + } + } +} diff --git a/AIProofread/core/DocumentUtil.cs b/AIProofread/core/DocumentUtil.cs index c336de6..e418f2d 100644 --- a/AIProofread/core/DocumentUtil.cs +++ b/AIProofread/core/DocumentUtil.cs @@ -600,7 +600,7 @@ namespace AIProofread // 判断原始文件是否可以删除 if (File.GetAttributes(sfd.FileName).HasFlag(FileAttributes.ReadOnly)) { - Globals.ThisAddIn.ShowDialog("已经存在名勘误表文件,请更换名称或者手动删除", null, null); + Globals.ThisAddIn.ShowDialog("已经存在名勘误表文件,请更换名称或手动删除", null, null); return; } // 删除文件 重新写入新数据避免出现未知不可控bug diff --git a/AIProofread/core/Tools.cs b/AIProofread/core/Tools.cs index 4d0a47b..29c642b 100644 --- a/AIProofread/core/Tools.cs +++ b/AIProofread/core/Tools.cs @@ -1,11 +1,14 @@ -using Microsoft.Office.Interop.Word; +using AIProofread.core; +using Microsoft.Office.Interop.Word; using Newtonsoft.Json; +using NPOI; using NPOI.POIFS.FileSystem; using NPOI.XWPF.UserModel; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Runtime.InteropServices; using System.Security.Cryptography; namespace AIProofread @@ -36,55 +39,25 @@ namespace AIProofread // 获取当前文档所有文本 string allText = doc.Range().Text; List list = new List(); + + //DocumentReader.ReadByVSTO(doc, Globals.ThisAddIn.Application, list); using (FileStream stream = new FileStream(docPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - XWPFDocument ndoc = new XWPFDocument(stream); - var paragraphs = ndoc.Paragraphs; - int paragraphNumber = 1; - foreach (var bodyElement in ndoc.BodyElements) - { - // normal paragraph - if (bodyElement is XWPFParagraph p) - { - // 处理普通段落 - list.Add(new DocumentText(p.ParagraphText.Replace("\u0002", ""), paragraphNumber)); - paragraphNumber++; - } - // table -- vsto对于每个单元格的分段也会有 - else if (bodyElement is XWPFTable table) - { - foreach (var row in table.Rows) - { - foreach (var cell in row.GetTableCells()) - { - foreach (var pc in cell.Paragraphs) - { - list.Add(new DocumentText(pc.ParagraphText.Replace("\u0002", ""), paragraphNumber)); - paragraphNumber++; - } - } - //list.Add(string.Empty); - paragraphNumber++; - } - } - // 目录处理 - else if (bodyElement is XWPFSDT sdt) - { - string tocText = sdt.Content.Text; - - // 如果需要,可以进一步解析目录项// 例如,按换行符拆分目录内容 - var tocEntries = tocText.Split(new string[] { "\n", "\r", "\r\n", "\f" }, StringSplitOptions.None); - foreach (string entry in tocEntries) - { - - list.Add(new DocumentText(entry.Replace("\u0002", ""), paragraphNumber)); - paragraphNumber++; - } - } - } + ReadTextByNPOI(stream, list); + //try + //{ + + //} + //catch (POIXMLException npoiError) + //{ + // Logger.Log("GetAllText Error", npoiError); + // // Logger.Log("GetAllText", e); + // // return GetAllTextByVSTO(doc); + // // 读取文档 + // DocumentReader.ReadByVSTO(doc, Globals.ThisAddIn.Application, list); + //} } - Debug.WriteLine("GetAllText End ==>", DateTime.Now.ToLongTimeString()); var map = new Dictionary { { "list", list }, @@ -95,6 +68,55 @@ namespace AIProofread return map; } + private static void ReadTextByNPOI(FileStream stream, List list) + { + XWPFDocument ndoc = new XWPFDocument(stream); + var paragraphs = ndoc.Paragraphs; + int paragraphNumber = 1; + foreach (var bodyElement in ndoc.BodyElements) + { + // normal paragraph + if (bodyElement is XWPFParagraph p) + { + // 处理普通段落 + list.Add(new DocumentText(p.ParagraphText.Replace("\u0002", ""), paragraphNumber)); + paragraphNumber++; + } + // table -- vsto对于每个单元格的分段也会有 + else if (bodyElement is XWPFTable table) + { + foreach (var row in table.Rows) + { + foreach (var cell in row.GetTableCells()) + { + foreach (var pc in cell.Paragraphs) + { + list.Add(new DocumentText(pc.ParagraphText.Replace("\u0002", ""), paragraphNumber)); + paragraphNumber++; + } + } + //list.Add(string.Empty); + paragraphNumber++; + } + } + // 目录处理 + else if (bodyElement is XWPFSDT sdt) + { + string tocText = sdt.Content.Text; + + // 如果需要,可以进一步解析目录项// 例如,按换行符拆分目录内容 + var tocEntries = tocText.Split(new string[] { "\n", "\r", "\r\n", "\f" }, StringSplitOptions.None); + paragraphNumber+= tocEntries.Length; + // 暂时跳过目录 + //foreach (string entry in tocEntries) + //{ + // list.Add(new DocumentText(entry.Replace("\u0002", ""), paragraphNumber)); + // paragraphNumber++; + //} + } + } + } + public static string GetReadDocumentFilePath(Microsoft.Office.Interop.Word.Document doc) { // @@ -155,8 +177,7 @@ namespace AIProofread // 获取当前文档所有文本 string allText = doc.Range().Text; List list = new List(); - // // 开始分割 - MD5 md5 = new MD5CryptoServiceProvider(); + Paragraphs paragraphs = doc.Paragraphs; @@ -166,18 +187,22 @@ namespace AIProofread foreach (Paragraph p in paragraphs) { paragraphNumber++; - if (paragraphNumber % 20 == 0) - { - Debug.WriteLine("process paragraphNumber{0}", paragraphNumber); - } + //if (paragraphNumber % 20 == 0) + //{ + // Debug.WriteLine("process paragraphNumber{0}", paragraphNumber); + //} Range r = p.Range; string text = p.Range.Text; + if (text.Trim().Length == 0 || text.EndsWith("\r\a") || r.Tables.Count > 0) { continue; } list.Add(new DocumentText(text.Replace("\u0002", ""), paragraphNumber)); + Marshal.ReleaseComObject(p); } + Marshal.ReleaseComObject(paragraphs); + //for (; paragraphNumber <= total; paragraphNumber++) //{ diff --git a/updater/Form1.cs b/updater/Form1.cs index b6df72f..91b3cd1 100644 --- a/updater/Form1.cs +++ b/updater/Form1.cs @@ -19,6 +19,7 @@ namespace updater { private UpgradeInfo localVersion; private UpgradeInfo upgradeInfo; + private OfficeStarter appStarter = new OfficeStarter(); private static readonly string ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; private static readonly string LocalVersionFilePath = ApplicationBase + Path.GetFileName("version.json"); public static readonly string CONFIG_FILE = AppDomain.CurrentDomain.BaseDirectory + "app.json"; @@ -30,7 +31,7 @@ namespace updater * gm-plugin.gachafun.com 正式发布 */ #if DEBUG - private static string UpgradeInfoURI = "http://gm-plugin.gachafun.com/"; + private static string UpgradeInfoURI = "https://gm-plugin.gachafun.com/"; #else private static string UpgradeInfoURI = "https://gm-plugin.gachafun.com/"; #endif @@ -125,17 +126,22 @@ namespace updater public string CheckHostAppRunning() { Process[] array = Process.GetProcesses(); + var hasWPS = false; + var hasWord = false; foreach (Process item2 in array) { - if (item2.ProcessName.Equals("wps")) + if (item2.ProcessName.Equals("WINWORD")) { - return "WPS"; + hasWord = true; } - else if (item2.ProcessName.Equals("WINWORD")) + else if (item2.ProcessName.Equals("wps")) { - return "Word"; + hasWPS = true; } } + if (hasWord && hasWPS) return "WPS与Word"; + if (hasWord) return "Word"; + if (hasWPS) return "WPS"; return null; } @@ -253,36 +259,63 @@ namespace updater progressBar1.Value = 100; // 获取升级包路径 string updateFileName = UpgradeDir + Path.GetFileName(upgradeInfo.DownloadUrl); - if (updateFileName.EndsWith(".exe")) + try { - StartInstallExe(updateFileName); - return; - } - - // 可以考虑备份旧文件 - //string destinationFolder = Path.Combine(applicationBase, "update\\old"); - //CopyDirectory(applicationBase, destinationFolder); - //ZipFile.ExtractToDirectory(zipFilePath, applicationBase); - - using (ZipArchive zip = ZipFile.OpenRead(updateFileName)) - { - foreach (ZipArchiveEntry entry in zip.Entries) + if (updateFileName.EndsWith(".exe")) { - // 采用覆盖模式进行解压 - try - { - entry.ExtractToFile(Path.Combine(ApplicationBase, entry.FullName), true); - } - catch (Exception) - { + StartInstallExe(updateFileName); + return; + } + // 可以考虑备份旧文件 + //string destinationFolder = Path.Combine(applicationBase, "update\\old"); + //CopyDirectory(applicationBase, destinationFolder); + //ZipFile.ExtractToDirectory(zipFilePath, applicationBase); + + using (ZipArchive zip = ZipFile.OpenRead(updateFileName)) + { + foreach (ZipArchiveEntry entry in zip.Entries) + { + // 采用覆盖模式进行解压 + try + { + entry.ExtractToFile(Path.Combine(ApplicationBase, entry.FullName), true); + } + catch (Exception) + { + + } } } + MessageBox.Show("更新完成, 您可以打开文档继续校对"); + // 保存最新版本日志 + try + { + File.WriteAllText(LocalVersionFilePath, updateSource); + } + catch (Exception) { } + appStarter.StartWPS(); + appStarter.StartMSOffice(); + this.Close(); + } + catch (Exception) + { + try + { + File.Delete(updateFileName); + }catch { } + var ret = MessageBox.Show("升级失败,是否需要手动执行更新?", "更新失败", MessageBoxButtons.YesNo); + if (ret == DialogResult.Yes) + { + Process.Start(upgradeInfo.DownloadUrl); + this.Close(); + } + else + { + ButtonProcess.Visible = true; + ButtonProcess.Text = "重新更新"; + } } - MessageBox.Show("更新完成, 您可以打开文档继续校对"); - // 保存最新版本日志 - File.WriteAllText(LocalVersionFilePath, updateSource); - this.Close(); } public static void CopyDirectory(string sourceFolder, string destinationFolder) { diff --git a/updater/OfficeStarter.cs b/updater/OfficeStarter.cs index 96f4bb8..0743311 100644 --- a/updater/OfficeStarter.cs +++ b/updater/OfficeStarter.cs @@ -7,51 +7,59 @@ namespace updater { public void StartWPS() { - if (UpdateData.GetInstance().ShouldRebootWPS) + try { - string text = RegistHelper.GetRegistData(Registry.CurrentUser, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Kingsoft Office", "DisplayIcon"); - if (string.IsNullOrWhiteSpace(text)) + if (UpdateData.GetInstance().ShouldRebootWPS) { - text = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Kingsoft Office", "DisplayIcon"); - } - if (!string.IsNullOrWhiteSpace(text)) - { - text = text.Substring(0, text.LastIndexOf("WPS Office")) + "WPS Office\\ksolaunch.exe"; - Process.Start(text); + string text = RegistHelper.GetRegistData(Registry.CurrentUser, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Kingsoft Office", "DisplayIcon"); + if (string.IsNullOrWhiteSpace(text)) + { + text = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Kingsoft Office", "DisplayIcon"); + } + if (!string.IsNullOrWhiteSpace(text)) + { + text = text.Substring(0, text.LastIndexOf("WPS Office")) + "WPS Office\\ksolaunch.exe"; + Process.Start(text); + } } } + catch { } } public void StartMSOffice() { - if (UpdateData.GetInstance().ShouldRebootMSOffice) + try { - string allRegistData = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Office\\16.0\\Word\\InstallRoot", "Path"); - //检查2016 / 2019 / 365版本路径 - if (string.IsNullOrWhiteSpace(allRegistData)) + if (UpdateData.GetInstance().ShouldRebootMSOffice) { - allRegistData = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Office\\15.0\\Common\\InstallRoot", "Path"); - // 检查2013版本路径 + string allRegistData = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Office\\16.0\\Word\\InstallRoot", "Path"); + //检查2016 / 2019 / 365版本路径 + if (string.IsNullOrWhiteSpace(allRegistData)) + { + allRegistData = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Office\\15.0\\Common\\InstallRoot", "Path"); + // 检查2013版本路径 + } + if (string.IsNullOrWhiteSpace(allRegistData)) + { + allRegistData = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Office\\14.0\\Common\\InstallRoot", "Path"); + // 检查2010版本路径 + } + if (string.IsNullOrWhiteSpace(allRegistData)) + { + allRegistData = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Office\\12.0\\Common\\InstallRoot", "Path"); + //检查2007版本路径 + } + if (!string.IsNullOrWhiteSpace(allRegistData)) + { + allRegistData += "WINWORD.exe"; + //MSOffice启动路径 + Process.Start(allRegistData); + } + // 未能从注册表找到MS Office 安装路径 + // 没有找到 直接不处理了 } - if (string.IsNullOrWhiteSpace(allRegistData)) - { - allRegistData = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Office\\14.0\\Common\\InstallRoot", "Path"); - // 检查2010版本路径 - } - if (string.IsNullOrWhiteSpace(allRegistData)) - { - allRegistData = RegistHelper.GetAllRegistData(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Office\\12.0\\Common\\InstallRoot", "Path"); - //检查2007版本路径 - } - if (!string.IsNullOrWhiteSpace(allRegistData)) - { - allRegistData += "WINWORD.exe"; - //MSOffice启动路径 - Process.Start(allRegistData); - } - // 未能从注册表找到MS Office 安装路径 - // 没有找到 直接不处理了 } + catch{} } } } diff --git a/util-lib/CorrectItem.cs b/util-lib/CorrectItem.cs index 80de143..231ae9f 100644 --- a/util-lib/CorrectItem.cs +++ b/util-lib/CorrectItem.cs @@ -39,7 +39,7 @@ namespace UtilLib /// /// 校对状态 /// - [JsonProperty("is_accept")] + [JsonProperty("isAccept")] public int IsAccept { get; set; } /// /// 校对项颜色