using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml; using MuPDF; using PDFPatcher.Common; using PowerJson; namespace PDFPatcher { internal static class AppContext { static readonly string AppConfigFilePath = FileHelper.CombinePath( Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath), "AppConfig.json"); static readonly SerializationManager JsonSm = new SerializationManager(new JsonReflectionController(true)) { UseExtensions = false, SerializeEmptyCollections = false, SerializeNullValues = false, SerializeReadOnlyFields = false, SerializeReadOnlyProperties = false, CanSerializePrivateMembers = true }; internal const int MaxHistoryItemCount = 16; internal static MainForm MainForm { get; set; } static AppContext() { SaveAppSettings = true; BookmarkFile = String.Empty; TargetFile = String.Empty; CheckUpdateDate = DateTime.Now; CheckUpdateInterval = 14; Exporter = new ExporterOptions(); Importer = new ImporterOptions(); Merger = new MergerOptions(); Patcher = new PatcherOptions(); Editor = new PatcherOptions(); Reader = new ReaderOptions(); AutoBookmarker = new AutoBookmarkOptions(); Encodings = new EncodingOptions(); ImageExtracter = new ImageExtracterOptions(); ImageRenderer = new ImageRendererOptions(); ExtractPage = new ExtractPageOptions(); Ocr = new OcrOptions(); Toolbar = new ToolbarOptions(); WindowStatus = new WindowStatus(); Recent = new RecentItems(); } public static bool SaveAppSettings { get; set; } ///获取或指定是否在加载 PDF 文档时仅加载部分文档。 public static bool LoadPartialPdfFile { get; set; } private static string[] _SourceFiles = new string[0]; ///获取或指定要处理的源文件路径列表。 public static string[] SourceFiles { get => _SourceFiles; set => _SourceFiles = value ?? new string[0]; } ///获取或指定检查更新的日期。 public static DateTime CheckUpdateDate { get; set; } ///获取或指定检查更新的日期间隔。 public static int CheckUpdateInterval { get; set; } ///获取或指定是否应取消批处理操作。 public static bool Abort { get; set; } ///获取或指定书签文件的路径。 public static string BookmarkFile { get; set; } ///获取或指定目标文件的路径。 public static string TargetFile { get; set; } ///获取导出设置。 public static ExporterOptions Exporter { get; internal set; } ///获取导入设置。 public static ImporterOptions Importer { get; internal set; } ///获取生成文档的设置。 public static MergerOptions Merger { get; internal set; } ///获取生成文档的设置。 public static PatcherOptions Patcher { get; internal set; } ///获取文档编辑器的设置。 public static PatcherOptions Editor { get; internal set; } ///获取阅读器的设置。 public static ReaderOptions Reader { get; internal set; } ///获取自动生成书签的设置。 public static AutoBookmarkOptions AutoBookmarker { get; internal set; } ///获取应用程序设置。 public static EncodingOptions Encodings { get; internal set; } ///获取导出图像的设置。 public static ImageExtracterOptions ImageExtracter { get; internal set; } ///获取转换为图片的设置。 public static ImageRendererOptions ImageRenderer { get; internal set; } ///获取提取页面的设置。 public static ExtractPageOptions ExtractPage { get; internal set; } ///获取光学字符识别功能的设置。 public static OcrOptions Ocr { get; internal set; } ///获取或指定自定义工具栏的项目。 public static ToolbarOptions Toolbar { get; internal set; } ///获取或指定窗口状态。 public static WindowStatus WindowStatus { get; internal set; } public static RecentItems Recent { get; internal set; } [JsonSerializable] public sealed class RecentItems { ///获取最近使用的 PDF 文件列表。 [JsonField("源文件")] public List SourcePdfFiles { get; } = new List(); ///获取最近使用的 PDF 输出文件列表。 [JsonField("输出文件")] public List TargetPdfFiles { get; } = new List(); ///获取最近使用的信息文件列表。 [JsonField("信息文件")] public List InfoDocuments { get; } = new List(); ///获取最近使用的文件名模板列表。 [JsonField("文件名模板")] public List FileNameTemplates { get; } = new List(); ///获取最近使用的文件夹列表。 [JsonField("文件夹")] public List Folders { get; } = new List(); ///获取最近使用的查找字符串列表。 [JsonField("查找项")] public List SearchPatterns { get; } = new List(); ///获取最近使用的替换字符串列表。 [JsonField("替换项")] public List ReplacePatterns { get; } = new List(); internal static void AddHistoryItem(IList list, string item) { if (String.IsNullOrEmpty(item)) { return; } var i = -1; var m = false; foreach (var li in list) { i++; if (String.Equals(li, item, StringComparison.OrdinalIgnoreCase)) { m = true; break; } } if (m) { if (i == 0) { return; } if (i != -1) { list.RemoveAt(i); } } list.Insert(0, item); while (list.Count > MaxHistoryItemCount) { list.RemoveAt(list.Count - 1); } } } internal static void CleanUpInexistentFiles(List list) { list.RemoveAll(item => FileHelper.HasFileNameMacro(item) == false && File.Exists(item) == false); } internal static void CleanUpInexistentFolders(List list) { list.RemoveAll(item => FileHelper.HasFileNameMacro(item) == false && Directory.Exists(item) == false); } internal static bool Load(string path) { return LoadJson(path); } internal static bool LoadJson(string path) { if (String.IsNullOrEmpty(path)) { path = AppConfigFilePath; } if (File.Exists(path) == false) { return false; } ConfigurationSerialization conf; try { conf = Json.ToObject(File.ReadAllText(path, Encoding.UTF8), JsonSm); if (conf == null || conf.SaveAppSettings == false) { SaveAppSettings = false; return false; } } catch (Exception) { return false; } CheckUpdateDate = conf.CheckUpdateDate; CheckUpdateInterval = conf.CheckUpdateInterval; LoadPartialPdfFile = conf.PdfLoadMode == Configuration.OptimalMemoryUsage; if (conf.Recent != null) { Recent = conf.Recent; } if (conf.ExporterOptions != null) { Exporter = conf.ExporterOptions; } if (conf.ImporterOptions != null) { Importer = conf.ImporterOptions; } if (conf.MergerOptions != null) { Merger = conf.MergerOptions; } if (conf.PatcherOptions != null) { Patcher = conf.PatcherOptions; } if (conf.EditorOptions != null) { Editor = conf.EditorOptions; } if (conf.ReaderOptions != null) { Reader = conf.ReaderOptions; } if (conf.AutoBookmarkOptions != null) { AutoBookmarker = conf.AutoBookmarkOptions; } if (conf.Encodings != null) { Encodings = conf.Encodings; } if (conf.ImageExporterOptions != null) { ImageExtracter = conf.ImageExporterOptions; } if (conf.ImageRendererOptions != null) { ImageRenderer = conf.ImageRendererOptions; } if (conf.OcrOptions != null) { Ocr = conf.OcrOptions; } if (conf.ExtractPageOptions != null) { ExtractPage = conf.ExtractPageOptions; } if (conf.ToolbarOptions != null) { Toolbar = conf.ToolbarOptions; } if (conf.WindowStatus != null) { WindowStatus = conf.WindowStatus; } return true; } /// /// 保存应用程序配置。 /// /// 保存路径。路径为空时,保存到默认位置。 /// 是否保存历史文件列表。 /// 是否跳过只读文件。 internal static void Save(string path, bool saveHistoryFileList, bool skipReadonly) { try { SaveJson(path ?? AppConfigFilePath, saveHistoryFileList, skipReadonly); } catch (Exception ex) { AppContext.MainForm.ErrorBox("保存程序设置时出错", ex); } } static void SaveJson(FilePath path, bool saveHistoryFileList, bool skipReadonly) { if (skipReadonly && path.ExistsFile && (path.ToFileInfo().Attributes & FileAttributes.ReadOnly) > 0) { return; } var s = SaveAppSettings ? new ConfigurationSerialization { SaveAppSettings = true, CheckUpdateDate = CheckUpdateDate, CheckUpdateInterval = CheckUpdateInterval, PdfLoadMode = LoadPartialPdfFile ? Configuration.OptimalMemoryUsage : Configuration.OptimalSpeed, MergerOptions = Merger, ExporterOptions = Exporter, ImporterOptions = Importer, PatcherOptions = Patcher, EditorOptions = Editor, ReaderOptions = Reader, AutoBookmarkOptions = AutoBookmarker, Encodings = Encodings, ImageExporterOptions = ImageExtracter, ImageRendererOptions = ImageRenderer, ExtractPageOptions = ExtractPage, OcrOptions = Ocr, ToolbarOptions = Toolbar, WindowStatus = new WindowStatus(MainForm), Recent = saveHistoryFileList ? Recent : null } : new ConfigurationSerialization { SaveAppSettings = false }; path.WriteAllText(false, Encoding.UTF8, Json.ToJson(s, JsonSm)); } private static void WriteRecentFiles(XmlWriter writer, IList list, string name) { foreach (var item in list) { writer.WriteStartElement(name); writer.WriteAttributeString(Configuration.Path, item); writer.WriteEndElement(); } } } }