From d2dee29c9e95daae2057addb52d80df47ea3f92d Mon Sep 17 00:00:00 2001 From: WMJ Date: Mon, 2 Jun 2025 15:26:38 +0800 Subject: [PATCH] =?UTF-8?q?=EF=BC=8D=E4=BF=AE=E5=A4=8D=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=85=B1=E7=94=A8=20Root=20=E5=92=8C=20Info=20=E7=9A=84?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=90=8E=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=8D=9F=E5=9D=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/Processor/PdfHelper.cs | 15 +++++++++++++++ App/Processor/PdfPageExtractor.cs | 13 ++----------- App/Processor/Worker.cs | 1 + 更新历史.txt | 1 + 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/App/Processor/PdfHelper.cs b/App/Processor/PdfHelper.cs index 82f69c5..692ddd8 100644 --- a/App/Processor/PdfHelper.cs +++ b/App/Processor/PdfHelper.cs @@ -90,6 +90,21 @@ namespace PDFPatcher.Processor return r; } + /// + /// 有些奇怪的 PDF 会让 Root 和 Info 共用一个对象, + /// 这将导致处理后的文档无法读取,应将其复制成副本,分别修改。 + /// + internal static void SeparateConjoinedRootAndInfo(this PdfReader pdf) { + if (pdf.Catalog == pdf.Trailer.GetAsDict(PdfName.INFO)) { + var d = new PdfDictionary(); + pdf.Trailer.Put(PdfName.INFO, d); + d.Merge(pdf.Catalog); + d.Put(PdfName.TYPE, PdfName.INFO); + d.Remove(PdfName.PAGES); + d.Remove(PdfName.OUTLINES); + } + } + internal static MuPDF.Document OpenMuDocument(string sourceFile) { var d = MuPDF.Context.Instance.OpenDocument(sourceFile); if (d.NeedsPassword) { diff --git a/App/Processor/PdfPageExtractor.cs b/App/Processor/PdfPageExtractor.cs index bf65e8d..34a2fcf 100644 --- a/App/Processor/PdfPageExtractor.cs +++ b/App/Processor/PdfPageExtractor.cs @@ -197,8 +197,8 @@ namespace PDFPatcher.Processor pdf.Trailer.Remove(PdfName.INFO); pdf.Catalog.Remove(PdfName.METADATA); } - else if (pdf.Catalog == pdf.Trailer.GetAsDict(PdfName.INFO)) { - FixIncorrectTrailerInfo(pdf); + else { + pdf.SeparateConjoinedRootAndInfo(); } if (options.EnableFullCompression) { pdf.RemoveUnusedObjects(); @@ -215,15 +215,6 @@ namespace PDFPatcher.Processor Tracker.TraceMessage(Tracker.Category.Alert, $"成功提取文件内容到 <<{targetFile}>>。"); } - static void FixIncorrectTrailerInfo(PdfReader pdf) { - var d = new PdfDictionary(); - pdf.Trailer.Put(PdfName.INFO, d); - d.Merge(pdf.Catalog); - d.Put(PdfName.TYPE, PdfName.INFO); - d.Remove(PdfName.PAGES); - d.Remove(PdfName.OUTLINES); - } - static string RewriteTargetFileName(string sourceFile, string targetFile, PdfReader pdf) { DocInfoExporter.RewriteDocInfoWithEncoding(pdf, AppContext.Encodings.DocInfoEncoding); targetFile = Worker.ReplaceTargetFileNameMacros(sourceFile, targetFile, pdf); diff --git a/App/Processor/Worker.cs b/App/Processor/Worker.cs index e57c9ae..c339150 100644 --- a/App/Processor/Worker.cs +++ b/App/Processor/Worker.cs @@ -350,6 +350,7 @@ namespace PDFPatcher.Processor if (pdf == null) { return false; } + pdf.SeparateConjoinedRootAndInfo(); try { DocInfoImporter import; var xInfoDoc = infoDoc as PdfInfoXmlDocument; diff --git a/更新历史.txt b/更新历史.txt index b01db21..a6aa190 100644 --- a/更新历史.txt +++ b/更新历史.txt @@ -23,6 +23,7 @@ 自动生成书签功能可能生成空白的书签。 自动生成书签列表框导入之前保存的条件后,插入新书签将清空规则列表。 列出系统安装字体时,对于异常的字体不要抛出异常。 + 处理共用 Root 和 Info 的文档后,导致文档损坏。 1.0.4.4512 2024年9月30日 新增功能: