如何使用iText7和C#向现有PDF添加文本且不覆盖原有内容
问题根源
你当前的代码核心问题是没有将原有cat.pdf的内容加载到待编辑的PDF文档对象中:创建PdfDocument时仅传入了输出用的PdfWriter,相当于新建了空白PDF仅写入txt内容,原有cat.pdf的内容完全没有被导入,声明的readerFile对象没有被实际使用,属于无效代码。
解决方案
场景1:在cat.pdf所有内容的末尾追加txt文本(不覆盖任何原有内容包括图片)
这是最常见的需求场景,只需要修改PdfDocument的构造逻辑,同时传入读取原PDF的PdfReader和写入目标文件的PdfWriter即可,原有内容会被完整保留,新文本会自动追加到文档末尾。
修正后的代码如下:
// 定义文件路径 string sourcePdfPath = @"C:\InesProjetos\PrintTextWithImage\PrintTextWithImage\cat.pdf"; string destPdfPath = @"C:\demo.pdf"; string textPath = @"C:\InesProjetos\PrintTextWithImage\PrintTextWithImage\text.txt"; // 读取txt文本内容,用using自动释放资源 string textContent; using (StreamReader rdr = new StreamReader(textPath)) { textContent = rdr.ReadToEnd(); } // 同时传入原PDF读取器和目标PDF写入器,自动导入原PDF内容 using (PdfReader reader = new PdfReader(sourcePdfPath)) using (PdfWriter writer = new PdfWriter(destPdfPath)) using (PdfDocument pdf = new PdfDocument(reader, writer)) using (Document document = new Document(pdf)) { // 追加文本到文档末尾,不会覆盖原有内容 document.Add(new Paragraph(textContent)); }
场景2:在PDF内指定图片的紧后方插入文本(不是追加到文档末尾)
如果需要定位到具体图片的位置插入文本,需要额外增加元素识别逻辑:
- 遍历
PdfDocument的每一页,解析页面中的所有元素 - 匹配到目标图片后,获取图片的底部Y坐标和所在页码
- 在同页面该坐标的下方写入目标文本即可
补充疑问解答
- 你声明的
readerFile必须传入PdfDocument的构造函数才能生效,否则就是未使用的无效对象 - 确实需要先将cat.pdf的内容导入到目标PDF中再添加文本,上述代码中
PdfDocument(reader, writer)的构造逻辑就已经实现了该功能:构造时会自动把原PDF的所有内容复制到目标PDF的编辑流中,后续添加的内容会在原有基础上追加,不会覆盖原有内容。
内容的提问来源于stack exchange,提问作者Inês Borges
相关产品推荐
相关产品推荐

