-修复处理共用 Root 和 Info 的文档后,导致文档损坏的问题

This commit is contained in:
WMJ
2025-06-02 15:26:38 +08:00
parent ccf3a60fe4
commit d2dee29c9e
4 changed files with 19 additions and 11 deletions
+15
View File
@@ -90,6 +90,21 @@ namespace PDFPatcher.Processor
return r;
}
/// <summary>
/// 有些奇怪的 PDF 会让 Root 和 Info 共用一个对象,
/// 这将导致处理后的文档无法读取,应将其复制成副本,分别修改。
/// </summary>
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) {
+2 -11
View File
@@ -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);
+1
View File
@@ -350,6 +350,7 @@ namespace PDFPatcher.Processor
if (pdf == null) {
return false;
}
pdf.SeparateConjoinedRootAndInfo();
try {
DocInfoImporter import;
var xInfoDoc = infoDoc as PdfInfoXmlDocument;
+1
View File
@@ -23,6 +23,7 @@
自动生成书签功能可能生成空白的书签。
自动生成书签列表框导入之前保存的条件后,插入新书签将清空规则列表。
列出系统安装字体时,对于异常的字体不要抛出异常。
处理共用 Root 和 Info 的文档后,导致文档损坏。
1.0.4.4512 2024年9月30日
新增功能: