当前位置: 首页 > news >正文

使用C#的 PdfDocument 实现 PDF 页眉页脚的编辑

1. 引用库:

using iText.Kernel.Font;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Layout;

2. 对 PDF 中页面使用 PdfCanvas 进行操作

(1)删除页眉/页脚区域

canvas.SetFillColor(iText.Kernel.Colors.ColorConstants.WHITE).Rectangle(20, pageSize.GetTop() - 100, pageSize.GetWidth() - 40, 100).Fill();

(2)添加页眉/页脚

canvas.BeginText();
canvas.SetFillColorRgb(0, 0, 0);
canvas.SetFontAndSize(PdfFontFactory.CreateFont(), 14);
canvas.MoveText(100, pageSize.GetTop() - 90);
canvas.ShowText("How are you?");
canvas.EndText();

(3)光标点注意事项

        MoveText 之后,当前光标发生变动。如何不好计算,可以再次执行 BeginText。

3. 完整代码

using System;
using System.Windows.Forms;
using iText.Kernel.Font;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Layout;namespace WindowsFormsApp1
{public partial class PdfOperate : Form{public PdfOperate(){InitializeComponent();}private void btnOpenPdf_Click(object sender, EventArgs e){OpenFileDialog dlg = new OpenFileDialog(){Title = "Choose PDF...",Filter = "Pdf文件|*.pdf;",};dlg.ShowDialog();if (string.IsNullOrEmpty(dlg.FileName)) return;string inputPath = dlg.FileName;string outPath = "D:\\Document\\CMP\\APC\\资料\\out.pdf";using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(inputPath), new PdfWriter(outPath))){Document document = new Document(pdfDoc);int pageNum = pdfDoc.GetNumberOfPages();for (int i = 1; i < pageNum; i++){PdfPage page = pdfDoc.GetPage(i);Rectangle pageSize = page.GetPageSize();PdfCanvas canvas = new PdfCanvas(page);//删除页眉区域canvas.SetFillColor(iText.Kernel.Colors.ColorConstants.WHITE).Rectangle(20, pageSize.GetTop() - 100, pageSize.GetWidth() - 40, 100).Fill();//删除页脚区域canvas.SetFillColor(iText.Kernel.Colors.ColorConstants.WHITE).Rectangle(20, 0, pageSize.GetWidth() - 40, 100).Fill();//添加页眉canvas.BeginText();canvas.SetFillColorRgb(0, 0, 0);canvas.SetFontAndSize(PdfFontFactory.CreateFont(), 14);canvas.MoveText(100, pageSize.GetTop() - 90);canvas.ShowText("Research on APC in the semiconductor CMP industry");canvas.EndText();//添加页脚canvas.BeginText();     //下面的点位以页面左下角为原点canvas.MoveText(pageSize.GetWidth() / 2, 50);canvas.ShowText("2025/08/04");canvas.SetFontAndSize(PdfFontFactory.CreateFont(), 12);canvas.MoveText(pageSize.GetWidth() / 2 - 50, 0);   //没有 BeginText,则以前面的最后点位为原点进行偏移canvas.ShowText($"{i}");canvas.EndText();}}MessageBox.Show("completed...");}}
}

http://www.dtcms.com/a/344622.html

相关文章:

  • 我用Photoshop Firefly+Blender,拯救被环境毁掉的人像大片
  • Blender模型动画导入到UE5
  • uniappx新增的几个api
  • AI + 教育:个性化学习如何落地?教师角色转变与技术伦理的双重考验
  • 文字提取技术让文档实现数字化效率翻倍-文字识别接口
  • Kubernetes概念:ETCD 的本质与备份恢复实践
  • 永磁同步电机控制算法-反馈线性化滑模直接转矩控制
  • 智慧工厂烟雾检测:全场景覆盖与精准防控
  • 全运会倒计时80天,国鑫服务器如何扛起粤港澳的“数字火炬”?
  • Roadmap:一年实现安全漏洞防治自动化
  • MCP 与 Function Calling 打开真实世界的两种“母体”方式
  • 软件产品确认测试:系统长期运行稳定性(72 小时)测试
  • 集成算法学习笔记
  • Unreal Engine UStaticMeshComponent
  • 线性回归:机器学习中的基础建模工具
  • LeetCode100-76最小覆盖子串
  • C++ 面向对象之继承
  • 【DataGrip】连接达梦数据库后,能查询数据但是看不到表的几种情况分析,达梦数据库驱动包下载DmJdbcDriver18.jar
  • Leetcode—120. 三角形最小路径和【中等】(腾讯校招面试题)
  • LeetCode100-53最大子数组和
  • 数据工程师——ETL
  • 开发避坑指南(35):mybaits if标签test条件判断等号=解析异常解决方案
  • 【Protues仿真】基于AT89C52单片机的LCD液晶显示屏显示控制
  • 基于单片机的电子血压计设计方案
  • 亚信科技Java 150道面试题及参考答案(上)
  • DS 0 | 数据结构学习:前言
  • 使用隧道(Tunnel)连接PostgreSQL数据库(解决防火墙问题)
  • CentOS 10安装Ollama
  • Redis高级篇 | 分布式缓存四大核心问题讲解:持久化、主从集群、哨兵与分片集群
  • 【Java后端】【可直接落地的 Redis 分布式锁实现】