如何将PDF页面全部内容完整复制到更大尺寸的新PDF页面中
解决方案
原有实现丢失书签、注释的核心原因是通过CopyAsFormXObject仅迁移了页面的可视化渲染内容,没有携带文档级(书签/大纲)、页面级(注释、自定义属性)的元数据。正确实现不需要重建空白页面嵌入源内容,直接修改原有页面的尺寸定义,整体偏移内容到居中位置即可,所有原PDF属性都会完整保留。
修正后代码
public void FixSize() // 属于PDFentry类的方法 { // FQFName是文件全路径属性 string tempFile = Path.GetTempFileName(); // 绑定读写,直接保留原文档所有结构 using PdfReader reader = new PdfReader(FQFName); using PdfWriter writer = new PdfWriter(tempFile); using PdfDocument pdfDoc = new PdfDocument(reader, writer); iText.Kernel.Geom.PageSize targetPageSize = iText.Kernel.Geom.PageSize.LETTER; int pageCount = pdfDoc.GetNumberOfPages(); for (int pageNum = 1; pageNum <= pageCount; pageNum++) { PdfPage page = pdfDoc.GetPage(pageNum); Rectangle originalBox = page.GetMediaBox(); // 计算居中偏移量 float offsetX = (targetPageSize.GetWidth() - originalBox.GetWidth()) / 2; float offsetY = (targetPageSize.GetHeight() - originalBox.GetHeight()) / 2; // 更新页面尺寸为标准信纸大小 page.SetMediaBox(targetPageSize); page.SetCropBox(targetPageSize); // 给整个页面内容添加偏移,前置到内容流最开头 new PdfContentStreamPrepend(page).ConcatMatrix(1, 0, 0, 1, offsetX, offsetY); // 同步偏移所有注释坐标,避免注释错位 foreach (var annotation in page.GetAnnotations()) { Rectangle annotRect = annotation.GetRectangle().ToRectangle(); annotation.SetRectangle(new PdfArray( new Rectangle( annotRect.GetX() + offsetX, annotRect.GetY() + offsetY, annotRect.GetWidth(), annotRect.GetHeight() ) )); } } pdfDoc.Close(); // 替换原文件 File.Copy(tempFile, FQFName, true); File.Delete(tempFile); }
方案说明
- 直接基于原文档结构修改,无需重建页面,书签、大纲等所有文档级属性自动完整保留
- 同步处理注释坐标偏移,不会出现内容与注释错位的问题
- 完全保留原有内容画质,无二次渲染损耗
- 仅需处理页面尺寸和偏移逻辑,执行效率远高于转FormXObject的实现
内容的提问来源于stack exchange,提问作者RobertSF
相关产品推荐
相关产品推荐

