From 200f415ac6fdbedb1f4785309bc84cf555e6646d Mon Sep 17 00:00:00 2001 From: callmeyan Date: Sun, 30 Mar 2025 14:28:18 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=F0=9F=93=9C=EF=B8=8F=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC;=E5=AF=B9=E4=BA=8E=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=96=87=E6=A1=A3=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/AIProofread/v17/.suo | Bin 2867200 -> 2867200 bytes AIProofread/Bridge.cs | 2 +- AIProofread/Config.cs | 2 +- AIProofread/Properties/AssemblyInfo.cs | 6 +- AIProofread/core/Tools.cs | 139 +++++++++++++++---------- 5 files changed, 90 insertions(+), 59 deletions(-) diff --git a/.vs/AIProofread/v17/.suo b/.vs/AIProofread/v17/.suo index 5574349a9323d41a2845387ed34b24f49e680981..70971010d488c386fae5a37cd6d24ef5f89e5f70 100644 GIT binary patch delta 15315 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 delta 20382 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 GY5x~)&b9vl diff --git a/AIProofread/Bridge.cs b/AIProofread/Bridge.cs index 9145c56..f078c38 100644 --- a/AIProofread/Bridge.cs +++ b/AIProofread/Bridge.cs @@ -427,7 +427,7 @@ namespace AIProofread { Logger.Log(ex); data["code"] = 5; - data["message"] = "文档格式有误,请另存文档后再进行校对"; + data["message"] = "文档格式有误或内容异常,请另存文档后再进行校对"; } catch (Exception ex) { diff --git a/AIProofread/Config.cs b/AIProofread/Config.cs index 832c043..34fa015 100644 --- a/AIProofread/Config.cs +++ b/AIProofread/Config.cs @@ -36,7 +36,7 @@ namespace AIProofread public class Config { public static readonly string APP_NAME = "AI校对王"; - public static readonly string APP_VERSION = "2.2.2"; + public static readonly string APP_VERSION = "2.2.3"; 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/Properties/AssemblyInfo.cs b/AIProofread/Properties/AssemblyInfo.cs index a31bd9c..52b42d2 100644 --- a/AIProofread/Properties/AssemblyInfo.cs +++ b/AIProofread/Properties/AssemblyInfo.cs @@ -7,10 +7,10 @@ using System.Security; // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("AI校对王")] -[assembly: AssemblyDescription("AI校对王 2.2.1")] +[assembly: AssemblyDescription("AI校对王 2.2.3")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("果麦文化传媒股份有限公司")] -[assembly: AssemblyProduct("AI校对王 2.2.1")] +[assembly: AssemblyProduct("AI校对王 2.2.3")] [assembly: AssemblyCopyright("Copyright © 果麦文化传媒股份有限公司 2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -34,5 +34,5 @@ using System.Security; // 方法是按如下所示使用“*”: : // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("2.0")] -[assembly: AssemblyFileVersion("2.2.1.0")] +[assembly: AssemblyFileVersion("2.2.3.0")] diff --git a/AIProofread/core/Tools.cs b/AIProofread/core/Tools.cs index 0541279..2b946e3 100644 --- a/AIProofread/core/Tools.cs +++ b/AIProofread/core/Tools.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.IO.Compression; using System.Runtime.InteropServices; using System.Security.Cryptography; @@ -41,22 +42,34 @@ namespace AIProofread List list = new List(); //DocumentReader.ReadByVSTO(doc, Globals.ThisAddIn.Application, list); - using (FileStream stream = new FileStream(docPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + try { - 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); - //} + ReadTextByNPOI(docPath, list); } + catch (POIXMLException ex) + { + // 编号有误,移除编号再读取 + if (ex.StackTrace.Contains("NPOI.XWPF.UserModel.XWPFNumbering")) + { + RemoveNumbersReadTextByNPOI(docPath, list); + } + } + //using (FileStream stream = new FileStream(docPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + //{ + + // //try + // //{ + + // //} + // //catch (POIXMLException npoiError) + // //{ + // // Logger.Log("GetAllText Error", npoiError); + // // // Logger.Log("GetAllText", e); + // // // return GetAllTextByVSTO(doc); + // // // 读取文档 + // // DocumentReader.ReadByVSTO(doc, Globals.ThisAddIn.Application, list); + // //} + //} var map = new Dictionary { { "list", list }, @@ -67,55 +80,73 @@ namespace AIProofread return map; } - private static void ReadTextByNPOI(FileStream stream, List list) + private static void RemoveNumbersReadTextByNPOI(string filePath, List list) { - XWPFDocument ndoc = new XWPFDocument(stream); - var paragraphs = ndoc.Paragraphs; - int paragraphNumber = 1; - foreach (var bodyElement in ndoc.BodyElements) + list.Clear(); + var fs = File.OpenWrite(filePath); + // 打开Zip文件,删除 numbering.xml + using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update)) { - // normal paragraph - if (bodyElement is XWPFParagraph p) + var numberingEntry = archive.GetEntry("word/numbering.xml"); + numberingEntry?.Delete(); // 删除 numbering.xml + } + fs.Close(); + ReadTextByNPOI(filePath, list); + } + + private static void ReadTextByNPOI(string filePath, List list) + { + //, FileMode.Open, FileAccess.Read, FileShare.ReadWrite + using (var stream = File.OpenRead(filePath)) + { + XWPFDocument ndoc = new XWPFDocument(stream); + var paragraphs = ndoc.Paragraphs; + int paragraphNumber = 1; + foreach (var bodyElement in ndoc.BodyElements) { - // 处理普通段落 - var text = p.ParagraphText.Replace("\u0002", ""); - if(text.Trim().Length > 0) + // normal paragraph + if (bodyElement is XWPFParagraph p) { - list.Add(new DocumentText(text, paragraphNumber)); - } - paragraphNumber++; - } - // table -- vsto对于每个单元格的分段也会有 - else if (bodyElement is XWPFTable table) - { - foreach (var row in table.Rows) - { - foreach (var cell in row.GetTableCells()) + // 处理普通段落 + var text = p.ParagraphText.Replace("\u0002", ""); + if (text.Trim().Length > 0) { - foreach (var pc in cell.Paragraphs) - { - list.Add(new DocumentText(pc.ParagraphText.Replace("\u0002", ""), paragraphNumber)); - paragraphNumber++; - } + list.Add(new DocumentText(text, paragraphNumber)); } - //list.Add(string.Empty); paragraphNumber++; } - } - // 目录处理 - else if (bodyElement is XWPFSDT sdt) - { - string tocText = sdt.Content.Text; + // 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++; - //} + // 如果需要,可以进一步解析目录项// 例如,按换行符拆分目录内容 + 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++; + //} + } } } }