C#使用iText 7删除PDF页面出现页码偏移如何优雅解决?
批量删除PDF指定页面避免页码偏移的解决方案
最简洁的实现方式是将待删除页码按从大到小降序排序后再执行删除操作,删除大页码时不会影响小页码的编号,完全不需要手动调整页码计数:
pdfDoc = new PdfDocument(new PdfReader(arrAllFiles[docNumber]), new PdfWriter(newpdfPathWithfilename)); // 按降序排序待删除页码后遍历删除,无需调整计数 foreach (var pageNumber in BlankPagesList.OrderByDescending(p => p)) { pdfDoc.RemovePage(pageNumber); }
实现原理
降序删除时,每次移除的都是当前文档中编号更大的页面,排在它前面的所有页面编号不会发生任何偏移,后续删除更小的页码时可以直接匹配原始页码列表中的值,没有额外的计数维护成本。
注意事项
- 如果待删除页码列表可能存在重复值,可以在排序前追加
Distinct()去重,避免重复删除同个页码抛出异常 - 注意确认传入的页码是符合PdfDocument类要求的1基索引(第一页页码为1),不要传入0基索引值
可选优化方案
如果待删除的页面数量远多于需要保留的页面,可以反过来直接复制需要保留的页面生成新文档,性能更优:
pdfDoc = new PdfDocument(new PdfReader(arrAllFiles[docNumber])); // 构建需要保留的页码集合 var keepPageNumbers = Enumerable.Range(1, pdfDoc.GetNumberOfPages()) .Except(BlankPagesList) .ToList(); // 直接复制保留页生成新文档 pdfDoc.CopyPagesTo(keepPageNumbers, new PdfDocument(new PdfWriter(newpdfPathWithfilename))); pdfDoc.Close();
内容的提问来源于stack exchange,提问作者V. Z
相关产品推荐
相关产品推荐

