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
相关产品推荐
相关产品推荐

