You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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);

关键说明

  1. 图片位置问题:PDF的坐标系和GDI+不同,原点(0,0)在页面左下角,你之前设置SetAbsolutePosition(0,0)是把图片放在左下角,通过pageSize.Height - image.ScaledHeight计算Y坐标,才能让图片顶部和页面顶部对齐。
  2. 避免读写冲突:不能直接对原文件同时进行读写操作,用临时文件中转是安全的标准做法。
  3. 页面尺寸一致性:如果原文档页面不是A4,建议读取原文档的页面尺寸(reader.GetPageSize()),避免追加的页面尺寸和原文档不一致。

内容的提问来源于stack exchange,提问作者Skary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:42:24