如何用ITextSharp在已有PDF中追加页面?代码执行异常求助
解决iTextSharp追加PDF页面的问题
你当前的用法存在核心误解:PdfWriter只能创建新PDF,无法修改已有PDF文档。用FileMode.Append往已有PDF文件末尾追加字节会直接破坏PDF的内部结构(交叉引用表、文件尾标识等),这就是后续执行时页面被“替换”的原因——本质是原有PDF结构损坏,阅读器只能解析出最后写入的无效内容。
要在已有PDF中追加页面,必须使用PdfStamper配合PdfReader实现,以下是修正后的方案:
正确代码示例
string pdfPath = "目标文件路径.pdf"; string tempPdfPath = Path.GetTempFileName() + ".pdf"; // 读取原有PDF文档 using (PdfReader reader = new PdfReader(pdfPath)) { // 创建PdfStamper处理文档,输出到临时文件避免读写冲突 using (PdfStamper stamper = new PdfStamper(reader, new FileStream(tempPdfPath, FileMode.Create))) { // 获取原文档的页面尺寸(保持和原文档一致,也可指定A4等自定义尺寸) Rectangle pageSize = reader.GetPageSize(reader.NumberOfPages); // 在原文档末尾插入新页面 int newPageNum = reader.NumberOfPages + 1; stamper.InsertPage(newPageNum, pageSize); // 获取新页面的内容画布 PdfContentByte canvas = stamper.GetOverContent(newPageNum); // 处理图片并添加到新页面 iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(bitmap, System.Drawing.Imaging.ImageFormat.Jpeg); image.ScaleToFit(pageSize.Width, pageSize.Height); // PDF坐标系原点在左下角,计算Y坐标让图片顶部对齐页面顶部 image.SetAbsolutePosition(0, pageSize.Height - image.ScaledHeight); canvas.AddImage(image); } } // 替换原文件实现"原地修改"效果 File.Delete(pdfPath); File.Move(tempPdfPath, pdfPath);
关键说明
- 图片位置问题:PDF的坐标系和GDI+不同,原点(0,0)在页面左下角,你之前设置
SetAbsolutePosition(0,0)是把图片放在左下角,通过pageSize.Height - image.ScaledHeight计算Y坐标,才能让图片顶部和页面顶部对齐。 - 避免读写冲突:不能直接对原文件同时进行读写操作,用临时文件中转是安全的标准做法。
- 页面尺寸一致性:如果原文档页面不是A4,建议读取原文档的页面尺寸(
reader.GetPageSize()),避免追加的页面尺寸和原文档不一致。
内容的提问来源于stack exchange,提问作者Skary
相关产品推荐
相关产品推荐

