如何用iTextSharp在多页现有PDF的指定页面写入文本
解决多页PDF指定页面添加文本的问题
你的原代码只处理了单页PDF,因为它是从头创建新文档的,没有保留原PDF的多页内容。要实现多页PDF的指定页面写入文本,我们需要用PdfStamper来修改现有PDF,而不是重新生成文档。下面是完整的解决方案:
核心思路
- 用
PdfReader读取原PDF的所有页面内容 - 用
PdfStamper在原PDF基础上添加文本,保留原有所有页面 - 遍历每一页,根据页码判断要写入的文本内容
- 在对应页面的内容层添加指定文本
完整代码示例
string oldFile = System.Web.Hosting.HostingEnvironment.MapPath("~/AuthDoc/CoverPage.pdf"); string newFile = System.Web.Hosting.HostingEnvironment.MapPath("test.pdf"); // 使用using语句确保资源自动释放 using (PdfReader reader = new PdfReader(oldFile)) { using (FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write)) using (PdfStamper stamper = new PdfStamper(reader, fs)) { // 定义字体(可根据需求调整样式、大小、颜色) BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); Font textFont = new Font(baseFont, 12, Font.NORMAL, BaseColor.BLACK); // 遍历所有页面(iTextSharp中页码从1开始) for (int pageNum = 1; pageNum <= reader.NumberOfPages; pageNum++) { // 获取当前页的内容层(OVER_LAY表示在原有内容上方添加文本) PdfContentByte contentLayer = stamper.GetOverContent(pageNum); // 根据页码匹配要写入的文本 string targetText = pageNum switch { 2 => "Hitesh Second Page", 3 => "Hitesh Third Page", // 其他页面可以设置默认文本或留空 _ => string.Empty }; if (!string.IsNullOrWhiteSpace(targetText)) { // 开始写入文本操作 contentLayer.BeginText(); contentLayer.SetFontAndSize(baseFont, textFont.Size); // 设置文本位置:x=50(距左边界),y=50(距下边界),可自行调整 contentLayer.SetTextMatrix(50, 50); contentLayer.ShowText(targetText); contentLayer.EndText(); } } } }
关键细节说明
- 为什么用PdfStamper?:原代码用
Document+PdfWriter是从头创建新PDF,无法直接复用原PDF的多页内容。PdfStamper的作用就是在现有PDF上做修改,会完整保留原文档的所有页面和格式。 - 文本位置调整:
SetTextMatrix(x, y)的坐标是以页面左下角为原点的,你可以根据需求修改x和y的值,把文本放在页面的任意位置。 - 字体自定义:如果需要使用特定字体(比如中文),可以替换
BaseFont.CreateFont的参数,指定字体文件路径即可。 - 资源释放:所有实现了
IDisposable的对象都用using包裹,避免内存泄漏和文件占用问题。
内容的提问来源于stack exchange,提问作者Hitesh
相关产品推荐
相关产品推荐

