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

iTextSharp 4.1.6 现有PDF顶部添加文本/表格失败问题咨询

问题解答

现有代码的错误

  • PDF是有固定结构化格式的文件,包含独立的文件头、交叉引用索引、文件尾标识,不能直接拼接两个PDF的字节流生成有效文件,这是核心错误。
  • 读取原有PDF的逻辑完全错误:你用FileMode.Create打开原PDF路径,直接清空覆盖了原文件,原有内容已经被销毁。
  • 两次Document创建都没有正确绑定PdfWriter到对应的MemoryStream,生成的bytesHeader和bytesBody都是空数组,没有有效内容。
  • 最终写入文件时你写的是bytesBody而非拼接后的bytesCombined,就算拼接逻辑正确也不会输出预期内容。

可行实现方案

iTextSharp 4.1.6版本可以通过PdfStamper或者PdfCopy实现需求,分两种常见场景:

场景1:给原有PDF的每一页顶部添加页眉文本/表格

public void AddHeaderToEachPage(string originalPdfPath, string outputPdfPath, string headerText)
{
    // 读取原有PDF
    PdfReader reader = new PdfReader(originalPdfPath);
    int pageCount = reader.NumberOfPages;
    
    using (FileStream fs = new FileStream(outputPdfPath, FileMode.Create, FileAccess.Write))
    {
        PdfStamper stamper = new PdfStamper(reader, fs);
        // 遍历每一页
        for (int i = 1; i <= pageCount; i++)
        {
            // 获取页的上层内容画布,OverContent是在原有内容上方,UnderContent是在下方
            PdfContentByte cb = stamper.GetOverContent(i);
            // 开始写入文本
            cb.BeginText();
            // 设置字体字号
            BaseFont font = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            cb.SetFontAndSize(font, 12);
            // 设置文本位置,这里用页面宽度居左,Y坐标设为页面顶部向下20的位置
            Rectangle pageSize = reader.GetPageSize(i);
            cb.SetTextMatrix(pageSize.GetLeft(10), pageSize.GetTop(20));
            cb.ShowText(headerText);
            cb.EndText();
            
            // 如果要加表格的话,用ColumnText把表格渲染到指定位置即可
            // PdfPTable table = new PdfPTable(2);
            // table.AddCell("列1");
            // table.AddCell("列2");
            // table.TotalWidth = pageSize.Width - 20;
            // table.WriteSelectedRows(0, -1, 10, pageSize.GetTop(30), cb);
        }
        stamper.Close();
    }
    reader.Close();
}

场景2:在整个PDF最前面新增一页放文本/表格

public void AddFirstPage(string originalPdfPath, string outputPdfPath)
{
    PdfReader reader = new PdfReader(originalPdfPath);
    Document doc = new Document(reader.GetPageSize(1));
    using (FileStream fs = new FileStream(outputPdfPath, FileMode.Create, FileAccess.Write))
    {
        PdfCopy copy = new PdfCopy(doc, fs);
        doc.Open();
        // 先加新的首页
        doc.NewPage();
        doc.Add(new Paragraph("这是新增的首页文本"));
        // 也可以加表格
        // PdfPTable table = new PdfPTable(2);
        // table.AddCell("表头1");
        // table.AddCell("表头2");
        // doc.Add(table);
        
        // 再逐页添加原有PDF的内容
        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            copy.AddPage(copy.GetImportedPage(reader, i));
        }
        doc.Close();
    }
    reader.Close();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:21:04