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日 新增功能: