C# 给现有PDF文档添加页眉、页脚
概述
页眉页脚是一篇完整、精致的文档的重要组成部分。在页眉页脚处,可以呈现的内容很多,如公司名称、页码、工作表名、日期、图片,如LOGO、标记等。在之前的文章中介绍了如何通过新建一页空白PDF页来添加页眉到该页面,包括文字页面、图片页眉。但是在实际应用中,该方法会有一定局限性,通过测试,下面将介绍C#给现有的PDF文档添加页眉页脚的方法。该方法中,丰富了我们对于添加页眉页脚的内容形式,包括添加图片、文字、超链接、页码等。
使用工具
注:下载该类库后,注意在程序中添加引用Spire.Pdf.dll(dll文件可在安装路径下的Bin文件夹中获取)

C# 代码步骤(供参考)
步骤 1 :添加using指令
using Spire.Pdf;
using Spire.Pdf.AutomaticFields;
using Spire.Pdf.Graphics;
using System;
using System.Drawing;
步骤 2 :加载测试文档
//实例化PdfDocument类,加载测试文档
PdfDocument existingPdf = new PdfDocument();
existingPdf.LoadFromFile("Test.pdf");
步骤 3 :添加页眉页脚
//调用DrawHeader()方法在现有文档添加页眉
DrawHeader(existingPdf); //调用DrawFooter()方法在现有文档添加页脚
DrawFooter(existingPdf);
注:这里需要自定义方法来分别添加页眉、页脚到PDF文档。
自定义方法添加页眉:
//在页面上方空白部位绘制页眉
static void DrawHeader(PdfDocument doc)
{
//获取页面大小
SizeF pageSize = doc.Pages[].Size; //声明x,y两个float型变量
float x = ;
float y = ; for (int i = ; i < doc.Pages.Count; i++)
{
//在每一页的指定位置绘制图片
PdfImage headerImage = PdfImage.FromFile("logo.png");
float width = headerImage.Width / ;
float height = headerImage.Height / ;
doc.Pages[i].Canvas.DrawImage(headerImage, x, y, width, height); //在每一页的指定位置绘制横线
PdfPen pen = new PdfPen(PdfBrushes.Gray, 0.5f);
doc.Pages[i].Canvas.DrawLine(pen, x, y + height + , pageSize.Width - x, y + height + );
}
}
自定义方法添加页脚:
//在页面下方空白部位绘制页脚
static void DrawFooter(PdfDocument doc)
{
//获取页面大小
SizeF pageSize = doc.Pages[].Size; //声明x,y两个float型变量
float x = ;
float y = pageSize.Height - ; for (int i = ; i < doc.Pages.Count; i++)
{
//在每一页的指定位置绘制横线
PdfPen pen = new PdfPen(PdfBrushes.Gray, 0.5f);
doc.Pages[i].Canvas.DrawLine(pen, x, y, pageSize.Width - x, y); //在每一页的指定位置绘制文字
y = y + ;
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", 10f, FontStyle.Bold), true);
PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Left);
String footerText = " Website\n https://g20.org/";
doc.Pages[i].Canvas.DrawString(footerText, font, PdfBrushes.Black, x, y, format); //在每一页的指定位置当前页码和总页码
PdfPageNumberField number = new PdfPageNumberField();
PdfPageCountField count = new PdfPageCountField();
PdfCompositeField compositeField = new PdfCompositeField(font, PdfBrushes.Black, "{0}/{1}", number, count);
compositeField.StringFormat = new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Top);
SizeF size = font.MeasureString(compositeField.Text);
compositeField.Bounds = new RectangleF(pageSize.Width - x - size.Width, y, size.Width, size.Height);
compositeField.Draw(doc.Pages[i].Canvas);
}
}
步骤 4 :保存文档
existingPdf.SaveToFile("output.pdf");
System.Diagnostics.Process.Start("output.pdf");
代码完成后,调试运行程序,生成文档。打开文档后,效果如下:

全部代码:
using Spire.Pdf;
using Spire.Pdf.AutomaticFields;
using Spire.Pdf.Graphics;
using System;
using System.Drawing; namespace PdfHeader
{
class Program
{
static void Main(string[] args)
{
//加载一个测试文档
PdfDocument existingPdf = new PdfDocument();
existingPdf.LoadFromFile("Test.pdf"); //调用DrawHeader()方法在现有文档添加页眉
DrawHeader(existingPdf); //调用DrawFooter()方法在现有文档添加页脚
DrawFooter(existingPdf); //保存并打开文档
existingPdf.SaveToFile("output.pdf");
System.Diagnostics.Process.Start("output.pdf"); }
//在页面上方空白部位绘制页眉
static void DrawHeader(PdfDocument doc)
{
//获取页面大小
SizeF pageSize = doc.Pages[].Size; //声明x,y两个float型变量
float x = ;
float y = ; for (int i = ; i < doc.Pages.Count; i++)
{
//在每一页的指定位置绘制图片
PdfImage headerImage = PdfImage.FromFile("logo.png");
float width = headerImage.Width / ;
float height = headerImage.Height / ;
doc.Pages[i].Canvas.DrawImage(headerImage, x, y, width, height); //在每一页的指定位置绘制横线
PdfPen pen = new PdfPen(PdfBrushes.Gray, 0.5f);
doc.Pages[i].Canvas.DrawLine(pen, x, y + height + , pageSize.Width - x, y + height + );
}
} //在页面下方空白部位绘制页脚
static void DrawFooter(PdfDocument doc)
{
//获取页面大小
SizeF pageSize = doc.Pages[].Size; //声明x,y两个float型变量
float x = ;
float y = pageSize.Height - ; for (int i = ; i < doc.Pages.Count; i++)
{
//在每一页的指定位置绘制横线
PdfPen pen = new PdfPen(PdfBrushes.Gray, 0.5f);
doc.Pages[i].Canvas.DrawLine(pen, x, y, pageSize.Width - x, y); //在每一页的指定位置绘制文字
y = y + ;
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", 10f, FontStyle.Bold), true);
PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Left);
String footerText = " Website\n https://g20.org/";
doc.Pages[i].Canvas.DrawString(footerText, font, PdfBrushes.Black, x, y, format); //在每一页的指定位置当前页码和总页码
PdfPageNumberField number = new PdfPageNumberField();
PdfPageCountField count = new PdfPageCountField();
PdfCompositeField compositeField = new PdfCompositeField(font, PdfBrushes.Black, "{0}/{1}", number, count);
compositeField.StringFormat = new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Top);
SizeF size = font.MeasureString(compositeField.Text);
compositeField.Bounds = new RectangleF(pageSize.Width - x - size.Width, y, size.Width, size.Height);
compositeField.Draw(doc.Pages[i].Canvas);
}
}
}
}
总结
相较于上篇文章中的添加页眉的方法,本方法在处理现有的PDF文档中更具实用性。当然,两种方法针对不同的程序设计需要,满足不同的需求,我们在选择这两种方法时,可酌情而定。
(本文完)
如需转载,请注明出处。
C# 给现有PDF文档添加页眉、页脚的更多相关文章
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- ABBYY FineReader 15 如何为PDF文档添加页眉页脚
页眉.页脚是文档页面顶部或底部重复出现的文本信息.很多用户会习惯在文档页面的顶部与底部区域添加页眉.页脚来展现页码.文档标题.作者姓名.品牌名称等附加信息.而ABBYY FineReader 15(W ...
- 如何给PDF文档添加和删除贝茨编号
PDF文件的使用频率高了,我们也不只局限于使用PDF文件了,也会需要编辑PDF文件的时候,那么如何在PDF文件中添加和去除贝茨编号呢,应该有很多小伙伴都想知道吧,今天就来跟大家分享一下吧,小伙伴们就一 ...
- 利用iTextSharp组件给PDF文档添加图片水印,文字水印
最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了.以下做个记录: 首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来. 代码中添加引用为: using S ...
- C#如何给PDF文档添加注释
整理文档时,我们可能会需要在一些或一段文字上添加注释加以说明,那如何以编程的方式实现呢?本文将实例讲述C#中如何使用免费组件给PDF文档添加文本注释,包括自由文本注释.自由文本注释能允许我们自定义它的 ...
- [.NET开发] C# 合并、拆分PDF文档
在整理文件时,将多个同类型文档合并是实现文档归类的有效方法,也便于文档管理或者文档传输.当然,也可以对一些比较大的文件进行拆分来获取自己想要的部分文档.可以任意地对文档进行合并.拆分无疑为我们了提供极 ...
- C# 复制PDF页面到另一个PDF文档
C# 复制PDF页面到另一个PDF文档 有时候我们可能有这样一个需求,那就是把PDF页面从一个PDF文档复制到另一个PDF文档中.由于PDF文档并不像word文档那样好编辑,因此复制也相对没有那么容易 ...
- Quartz 2D编程指南- PDF文档的创建、显示及转换
PDF文档存储依赖于分辨率的向量图形.文本和位图,并用于程序的一系列指令中.一个PDF文档可以包含多页的图形和文本.PDF可用于创建跨平台.只读的文档,也可用于绘制依赖于分辨率的图形. ...
- PDF文档盖章
概述 在pdf文档的最后一页,合适位置,添加印章图片. maven依赖 <dependency> <groupId>com.itextpdf</groupId> & ...
随机推荐
- 麒麟子Cocos Creator实用技巧
大家好,我是麒麟子, 开源棋牌<幼麟棋牌-四川麻将>(泄漏版叫 <达达麻将>)作者,成都幼麟科技创始人. 自09年进入游戏行业以来,不知不觉已经度过了十个春秋. 曾经我也血气方 ...
- c++ 获取磁盘句柄
磁盘的句柄可以用CreateFile函数获得.获得句柄后,就可以配合其他函数对磁盘进行一些操作. int main() { HANDLE hFile = INVALID_HANDLE_VALUE; h ...
- Java高并发缓存架构,缓存雪崩、缓存穿透之谜
面试题 了解什么是 redis 的雪崩.穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透? 面试官心理分析 其实这是问到缓存必问的,因为缓存雪崩和穿透,是 ...
- [Swift]LeetCode149. 直线上最多的点数 | Max Points on a Line
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- [Swift]LeetCode1023. 驼峰式匹配 | Camelcase Matching
A query word matches a given pattern if we can insert lowercase letters to the pattern word so that ...
- shell脚本中单双引号疑惑
工作中常用到shell脚本,遇到了一个疑惑,求解. 常见的解释: 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单独一个的单引号(对单 ...
- 浮点型和BigDecimal的使用
//import java.math.*; package cn.xiaomu_01_rumrnjieduan; import java.math.BigDecimal; /** * 浮点型和BigD ...
- [Abp 源码分析]十三、多语言(本地化)处理
0.简介 如果你所开发的需要走向世界的话,那么肯定需要针对每一个用户进行不同的本地化处理,有可能你的客户在日本,需要使用日语作为显示文本,也有可能你的客户在美国,需要使用英语作为显示文本.如果你还是一 ...
- Java操作符真的简单到易如反掌?
之前我写了一篇<吃人的那些Java名词:对象.引用.堆.栈和堆栈>,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老 ...
- Apache生产配置
httpd.conf # # This is the main Apache HTTP server configuration file. It contains the # configurati ...