深入iTextSharp:揭秘高级PDF操作技巧,提升工作效率的3大绝招
发布时间: 2024-12-28 12:56:00 阅读量: 6 订阅数: 8
![iTextSharp使用手册中文版](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTA0MDAzMy8yMDE4MDYvMTA0MDAzMy0yMDE4MDYyNzEzMjMzMzc0Ny03MDI3MzA5NjgucG5n?x-oss-process=image/format,png)
# 摘要
iTextSharp是一个广泛使用的.NET库,用于创建和操作PDF文档。本文详细介绍了iTextSharp的基础操作、文档构建技巧、表格与列表管理以及其在数据处理与报告生成中的应用。通过对文档结构元素的理解、高级文本和字体处理、图形与图表的集成,展示了如何创建丰富多样的PDF内容。此外,本文还探讨了iTextSharp在处理动态数据、表单验证、报告定制等方面的应用,并深入分析了安全性、权限管理、水印添加和文档保护的高级功能。通过案例分析,本文揭示了iTextSharp在实际项目中的高级应用,如多语言文档的生成和大规模文档批处理操作,为读者提供全面的技术参考和实践指导。
# 关键字
iTextSharp;PDF文档;表格与列表;数据处理;报告生成;文档安全性;权限管理;案例分析
参考资源链接:[iTextSharp中文教程:快速入门与解决中文显示问题](https://wenku.csdn.net/doc/6412b592be7fbd1778d439f9?spm=1055.2635.3001.10343)
# 1. iTextSharp概述与基础操作
iTextSharp是一个强大的PDF处理库,它允许开发者创建复杂的PDF文件,从简单的电子文档到高度复杂的报告。它基于Java的iText库,支持.NET平台,是生成高质量PDF文件的首选工具之一。本章将介绍iTextSharp的基础知识,包括安装过程、基本的PDF文件创建和写入操作。
## 1.1 iTextSharp简介
iTextSharp是iText库的C#版本,它提供了一套丰富的API,用于创建、编辑、解析和渲染PDF文档。这个库支持PDF的各种特性,包括文本、图像、链接、字体嵌入等,非常适合需要在应用程序中自动化生成PDF文件的场景。
## 1.2 安装iTextSharp
安装iTextSharp相对简单,可以通过NuGet包管理器安装到你的.NET项目中。在Visual Studio中,打开“管理NuGet包”对话框,搜索“iTextSharp”并安装最新版本即可。
## 1.3 创建第一个PDF文件
创建一个基础的PDF文件是学习iTextSharp的第一步。以下是一个简单的示例,演示如何创建一个包含文本的PDF文档:
```csharp
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
public void CreatePdf()
{
// 创建一个新的PDF文档
Document pdfDoc = new Document(PageSize.A4);
// 打开一个流来写入PDF文档
PdfWriter.GetInstance(pdfDoc, new FileStream("output.pdf", FileMode.Create));
// 打开文档以便写入内容
pdfDoc.Open();
// 添加一段文本到文档中
pdfDoc.Add(new Paragraph("Hello, iTextSharp!"));
// 关闭文档
pdfDoc.Close();
}
```
以上代码展示了如何使用iTextSharp来创建一个包含简单文本的PDF文件。这只是一个起点,随着我们深入探讨,会发现iTextSharp提供的功能远远超出了这个基础用例。
# 2. 深度解析iTextSharp的文档构建技巧
## 2.1 创建和修改PDF文档结构
### 2.1.1 理解文档结构元素
在处理PDF文档时,了解其结构至关重要。文档由一系列的结构元素组成,如文档目录、章节、段落、列表和图像等。每种元素都有其特定的用途和属性。例如,`PdfPTable`类用于创建表格,而`PdfPText`类则用于创建包含文本的段落。
```csharp
// 示例代码:创建简单的PDF文档结构
PdfDocument pdf = new PdfDocument(new PdfWriter("example.pdf"));
Document document = new Document(pdf);
// 添加章节
Paragraph title = new Paragraph("Chapter Title");
document.Add(title);
// 添加段落
Paragraph paragraph = new Paragraph("This is a paragraph in the document.");
document.Add(paragraph);
document.Close();
```
在这段代码中,首先创建了PDF文档实例,然后在文档对象中添加了一个章节和一个段落。每一个结构元素的添加都是对文档内容进行构建的一步。
### 2.1.2 添加章节和段落
章节和段落是文档内容的主体,它们在视觉上帮助读者识别文档的组织结构。章节通常通过标题来定义,段落是内容的最小单元。
```csharp
// 示例代码:添加带有子章节的文档结构
document.Add(new Paragraph("Section 1"));
for (int i = 0; i < 5; i++)
{
document.Add(new Paragraph($"Subsection {i + 1}"));
document.Add(new Paragraph("Lorem ipsum dolor sit amet, consectetur adipiscing elit."));
}
```
在这个示例中,我们添加了一个主章节和五个子章节,每个子章节后面跟着一个段落。使用了循环来模拟多个子章节的情况。
## 2.2 高级文本和字体处理
### 2.2.1 文本样式和字体嵌入
在创建PDF时,可添加不同样式(如加粗、斜体、下划线)的文本,并且可以嵌入字体,确保在不同设备和平台上都能正确显示文本。
```csharp
// 示例代码:添加带有样式的文本和嵌入字体
PdfFont boldFont = PdfFontFactory.CreateFont(StandardFonts.HELVETICA, PdfEncodings.IDENTITY_H, PdfFontFactory.EmbedDED);
document.Add(new Paragraph("Bold text: ").SetBold().SetFont(boldFont));
```
上述代码创建了一个加粗的文本样式,并且通过`PdfFontFactory`类嵌入了字体,以确保无论在哪个平台上打开,PDF都能正确显示加粗的文本。
### 2.2.2 复杂文本排版技巧
复杂文本排版涉及对字体大小、行间距、对齐方式等多个属性的调整,以达到美观的文档布局。
```csharp
// 示例代码:实现复杂的文本排版
PdfFont font = PdfFontFactory.CreateFont(StandardFonts.COURIER, PdfEncodings.IDENTITY_H, PdfFontFactory.EmbedDED);
Paragraph complexText = new Paragraph()
.Add(new Text("Left-aligned text "))
.Add(new Text("Center-aligned text ").SetBold().SetHorizontalAlignment(HorizontalAlignment.CENTER))
.Add(new Text("Right-aligned text"))
.SetFixedLeading(14).SetMultipliedLeading(1.2f);
document.Add(complexText);
```
在此段代码中,创建了一个包含左对齐、居中对齐和右对齐文本的复杂排版。通过`SetFixedLeading`和`SetMultipliedLeading`方法设置了行间距。
## 2.3 图形与图表的集成
### 2.3.1 插入和管理图形
在PDF文档中添加图像和图表可以为读者提供视觉信息。iTextSharp支持多种图像格式,包括JPEG、PNG、GIF等。
```csharp
// 示例代码:在PDF中插入图像
Image gifImage = ImageDataFactory.Create("image.gif");
document.Add(new Paragraph("An image:"));
document.Add(new AreaBreak());
document.Add(new Paragraph("This is an image."));
document.Add(gifImage.SetKeepTogether(true));
```
在这个示例中,我们首先创建了一个图像实例,然后将其添加到了PDF文档中。`SetKeepTogether`方法确保了图像和相关的段落内容不会被分割到不同的页面。
### 2.3.2 图表的创建与自定义
创建和集成图表,如条形图、折线图等,可以增强文档的信息表达能力。
```csharp
// 示例代码:创建和插入一个简单的条形图
Chart chart = Chart.MakeChart(Chart.CHART_TYPE_COLUMN, "Series 1", "Data 1");
document.Add(chart);
document.Close();
```
以上代码演示了如何快速创建一个条形图并将其添加到PDF文档中。iTextSharp封装了对图表的高级操作,可以轻松自定义图表的各种属性。
在接下来的章节中,我们将继续深入了解如何使用iTextSharp在表格与列表管理、数据处理与报告生成中的应用,以及如何探索其高级功能和实际案例分析。
# 3. ```markdown
# 第三章:iTextSharp中的表格与列表管理
在本章节中,我们将深入探讨iTextSharp库中如何管理表格与列表,并展示如何将它们嵌套使用以满足复杂文档布局的需求。本章节将包含创建表格和定制样式的方法、动态生成列表和目录的技巧,以及如何在文档中灵活运用这些元素来展示信息。
## 3.1 表格的创建与样式定制
### 3.1.1 基本表格结构的构建
iTextSharp库提供了丰富的API来创建和操作表格。要构建一个基本的表格,你需要了解`PdfPTable`类。这个类是用于创建和管理PDF表格的核心组件。首先,我们需要创建一个`PdfPTable`的实例,并通过设置列数来初始化表格的结构。
```java
PdfPTable table = new PdfPTable(4); // 创建包含4列的表格
table.setWidths(new int[]{20, 30, 40, 10}); // 设置每列的宽度比例
```
接着,可以使用`addCell()`方法向表格中添加单元格,并且插入文本、图片或其它元素。`PdfPCell`类代表一个单元格,可进一步定制单元格的样式,如背景色、边框等。
```java
PdfPCell cell = new PdfPCell(new Phrase("单元格内容")); // 创建一个包含文本的单元格
cell.setBackgroundColor(BaseColor.LIGHT_GRAY); // 设置背景色
table.addCell(cell); // 将单元格添加到表格中
```
### 3.1.2 高级表格样式应用
创建好表格的结构后,我们可以进一步定制表格的样式来满足不同的展示需求。除了单独定制单元格的样式,还可以为整个表格设置样式,如线条宽度、单元格内边距等。
```java
table.getDefaultCell().setPadding(5); // 设置单元格默认内边距为5pt
table.getDefaultCell().setBorder(Rectangle.TOP); // 设置单元格默认边框为上边框
```
创建复杂的表格样式时,可能会需要使用`PdfPTable`的继承类`PdfTable`,它允许更多高级定制。例如,可以使用`setSpacingBefore()`和`setSpacingAfter()`方法来设置表格前后间距。
```java
PdfTable pdfTable = new PdfTable(table);
pdfTable.setSpacingBefore(10f); // 表格前间距为10pt
pdfTable.setSpacingAfter(10f); // 表格后间距为10pt
```
对于跨行或跨列的单元格,iTextSharp提供了`setColspan()`和`setRowspan()`方法,以便在表格中创建合并单元格的效果。
```java
PdfPCell cell = new PdfPCell(new Phrase("合并单元格内容"));
cell.setColspan(2); // 单元格横跨2列
cell.setRowspan(2); // 单元格纵跨2行
table.addCell(cell);
```
## 3.2 列表和目录的动态生成
### 3.2.1 列表项的添加和格式化
在iTextSharp中,列表可以使用`PdfPList`或`PdfList`类来创建。基本的列表创建流程涉及到初始化一个列表对象,然后逐个添加列表项(`PdfListItem`)。
```java
PdfPList list = new PdfPList();
list.add(new ListItem("列表项一"));
list.add(new ListItem("列表项二"));
```
格式化列表时,可以调整列表的缩进、间距以及项符号样式。`setIndentationLeft()`方法可以设置列表的左缩进,而`setListSymbol()`方法可以设置列表项前的符号,包括自定义符号。
```java
list.setIndentationLeft(10f); // 设置列表左缩进为10pt
list.setListSymbol(new Chunk(new Circle(), 0, 0, true)); // 使用自定义符号
```
### 3.2.2 目录的自动构建与链接
为了在文档中创建目录,iTextSharp提供了一套便捷的工具,允许自动生成目录并链接到文档中的各个章节。`PdfOutline`对象可以创建一个目录项,并且可以将这些目录项添加到文档的书签中。
```java
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("example.pdf"));
document.open();
PdfOutline root = writer.getDirectContent().getOutlines(true);
PdfOutline parent = root.addOutline("目录");
```
在添加文档内容后,可以遍历文档结构,找到需要在目录中列出的章节,并为它们创建`PdfOutline`对象。
```java
PdfOutline child = parent.addOutline("章节标题");
child.setDestination(PdfDestination.makeDestination(new PdfName("section1")));
```
## 3.3 表格与列表的交互应用
### 3.3.1 表格内的列表嵌套
在复杂的文档布局中,有时需要在表格的单元格中嵌套列表。这可以在`PdfPCell`中添加一个`PdfList`来实现。通过这种方式,可以在表格的特定位置展示更为详细和有层次的列表信息。
```java
PdfPTable table = new PdfPTable(1); // 创建包含1列的表格
PdfPCell cell = new PdfPCell();
PdfPList list = new PdfPList();
list.add(new ListItem("列表项A"));
list.add(new ListItem("列表项B"));
cell.addElement(list); // 将列表添加到表格的单元格中
table.addCell(cell);
```
### 3.3.2 列表数据在表格中的展示
反之,在列表中也可以嵌入表格,尤其当列表项需要展示较为复杂的数据结构时。利用嵌套表格展示列表数据能够增加信息的可读性和结构化程度。
```java
PdfPList list = new PdfPList();
PdfPTable innerTable = new PdfPTable(2); // 创建包含2列的嵌套表格
innerTable.setWidths(new int[]{30, 70});
innerTable.addCell("列1");
innerTable.addCell("列2");
list.add(new ListItem(innerTable));
```
表格和列表的这种嵌套关系增加了文档的灵活性,使得内容的展示可以更加符合特定的格式要求。
在本章中,我们详细探讨了如何使用iTextSharp创建和管理表格与列表,并展示了一些基本和高级的定制技巧。这些技巧对于生成复杂且高度定制化的PDF文档至关重要。接下来的章节将介绍如何利用iTextSharp进行数据处理和报告生成。
```
以上为第三章的内容,包含表格和列表的创建、样式定制以及它们之间的交互应用。文章中的示例代码以及对应的解释确保了内容的连贯性和易理解性,满足了目标人群对于实用性和深度知识的需求。
# 4. iTextSharp在数据处理与报告生成中的应用
## 4.1 数据绑定与动态文档生成
### 4.1.1 使用XML和JSON绑定数据
在iTextSharp中,可以通过定义XML或JSON来绑定数据,进而动态生成文档。这类技术使得数据源可以是各种格式的外部文件,如XML和JSON等,这对于生成定制化报告及动态内容十分有用。
以XML为例,我们首先需要一个XML文件,它定义了文档的结构和内容:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<name>John Doe</name>
<position>Software Developer</position>
<salary>8000</salary>
</employee>
<employee>
<name>Jane Smith</name>
<position>Project Manager</position>
<salary>12000</salary>
</employee>
</employees>
```
在iTextSharp中,我们需要读取这个文件,并将其内容绑定到文档的相应位置。以下是代码示例:
```csharp
Document document = new Document();
PdfWriter.GetInstance(document, new FileStream("output.pdf", FileMode.Create));
document.Open();
// 解析XML文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("data.xml");
XmlNodeList employees = xmlDoc.SelectNodes("/employees/employee");
foreach (XmlNode employee in employees)
{
Paragraph employeeName = new Paragraph(employee.SelectSingleNode("name").InnerText);
document.Add(employeeName);
Paragraph employeePosition = new Paragraph(employee.SelectSingleNode("position").InnerText);
document.Add(employeePosition);
Paragraph employeeSalary = new Paragraph("Salary: " + employee.SelectSingleNode("salary").InnerText);
document.Add(employeeSalary);
}
document.Close();
```
### 4.1.2 动态创建PDF报告
通过上述方法,我们可以创建一个简单的PDF报告,报告中的内容来源于XML文件。为了让报告更加丰富,我们可以在代码中添加表格、图表等元素,还可以根据需要设置字体和格式。
将数据绑定到PDF的一个核心组件是`PdfPTable`,这是一个用于创建PDF表格的类。以下是一个示例,展示如何使用`PdfPTable`来动态创建包含数据的表格:
```csharp
PdfPTable table = new PdfPTable(3); // 创建一个3列的表格
table.WidthPercentage = 100f;
// 添加列标题
table.AddCell("Name");
table.AddCell("Position");
table.AddCell("Salary");
// 从XML中添加数据
foreach (XmlNode employee in employees)
{
table.AddCell(employee.SelectSingleNode("name").InnerText);
table.AddCell(employee.SelectSingleNode("position").InnerText);
table.AddCell(employee.SelectSingleNode("salary").InnerText);
}
document.Add(table);
```
## 4.2 数据验证和表单处理
### 4.2.1 表单字段的创建与验证
iTextSharp提供了一套完整的API来创建PDF表单和表单字段。表单字段可以被创建为文本框、复选框、单选按钮等。同时,iTextSharp还支持在生成PDF文档时对用户输入的数据进行验证。
以下是创建一个简单的包含文本输入和提交按钮的PDF表单的示例代码:
```csharp
PdfWriter.GetInstance(document, new FileStream("form.pdf", FileMode.Create));
document.Open();
PdfPTable table = new PdfPTable(2);
table.WidthPercentage = 100f;
// 添加标签和输入字段
table.AddCell(new PdfPCell(new Phrase("Name: ")));
iTextSharp.text.pdf.PdfPCell cell = new iTextSharp.text.pdf.PdfPCell();
PdfFormField nameField = PdfFormField.CreateText(writer, cell培训班矩形,
"name", "",PdfAnnotation.HIGHLIGHT_INVERT);
document.Add(table);
PdfFormField submitButton = PdfFormField.CreateButton(writer,
new Rectangle(20, 30, 80, 40),
"submit", PdfAction.CreateSubmitForm("http://example.com", false));
submitButton.Flags = PdfAnnotation.IS_LOCKED;
document.Add(new Paragraph("Submit: " + submitButton));
document.Close();
```
### 4.2.2 表单数据的读取和处理
一旦表单被提交,开发者通常需要读取和处理这些数据。这可以通过iTextSharp提供的API来实现。处理表单数据通常包含解析表单字段并获取用户输入的值。
假设我们有一个包含数据的PDF表单,我们可以使用以下代码来读取表单中的数据:
```csharp
PdfReader reader = new PdfReader("form.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileStream("filledForm.pdf", FileMode.Create));
AcroFields formFields = stamper.AcroFields;
// 获取表单字段的值
string name = formFields.GetField("name");
string submittedData = formFields.GetField("submit");
Console.WriteLine("Name: " + name);
Console.WriteLine("Submitted: " + submittedData);
stamper.FormFlattening = true;
stamper.Close();
reader.Close();
```
## 4.3 报告的高级定制
### 4.3.1 动态内容和事件处理
在PDF报告中,动态内容和事件处理是增强用户体验的重要手段。iTextSharp支持在文档中添加JavaScript脚本,以便在打开、关闭或打印PDF时执行特定的操作。
### 4.3.2 报告样式和模板的创建
利用iTextSharp,可以创建样式和模板,这样在生成报告时可以应用这些预先定义的格式,从而简化报告生成过程并保持一致性。
创建样式通常涉及定义字体、颜色和其他视觉元素。在模板方面,可以预先布局页面并设置好区域供后来填充数据。
```csharp
// 示例代码:定义一个样式
iTextSharp.text.ElementStyle style = new iTextSharp.text.ElementStyle();
style.FontSize = 12;
style.Font = iTextSharp.text.Font.FontFamily.HELVETICA;
style.Color = new iTextSharp.text.BaseColor(0, 0, 0);
// 创建一个带样式的段落
Paragraph styledParagraph = new Paragraph("This is a styled paragraph.", style);
document.Add(styledParagraph);
```
通过这种方式,可以确保报告风格统一、专业,同时也便于维护和更新。
# 5. iTextSharp的高级功能与案例分析
## 5.1 安全性和权限管理
### 5.1.1 PDF加密与解密
在处理敏感信息时,PDF文档的安全性和权限管理至关重要。iTextSharp库提供了一系列工具来帮助我们实现对PDF文档的加密和解密功能。使用`PdfStamper`类和`PdfReader`类,我们可以轻松地对现有的PDF文档进行加密和解密操作。
**加密PDF文档示例代码:**
```csharp
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
public void EncryptPdf(string src, string dest, string userPassword, string ownerPassword)
{
PdfReader reader = new PdfReader(src, new byte[0]);
using (FileStream output = new FileStream(dest, FileMode.Create))
{
PdfStamper stamper = new PdfStamper(reader, output);
stamper.SetEncryption(
System.Text.Encoding.Default.GetBytes(userPassword),
System.Text.Encoding.Default.GetBytes(ownerPassword),
PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY,
PdfWriter.STANDARD_ENCRYPTION_128);
stamper.Close();
}
}
```
### 5.1.2 用户权限的设置与控制
除了加密和解密外,iTextSharp还允许我们对用户的权限进行细致的设置。例如,我们可能希望用户能够打印文档,但不能复制文本。通过`SetEncryption`方法的不同参数,我们可以控制这些权限。
**设置用户权限示例代码:**
```csharp
PdfStamper stamper = new PdfStamper(reader, output);
stamper.SetEncryption(
null, // No user password
System.Text.Encoding.Default.GetBytes(ownerPassword),
PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY,
PdfWriter.STANDARD_ENCRYPTION_128);
stamper.Close();
```
## 5.2 水印和文档保护
### 5.2.1 文档水印的添加
水印是一种流行的文档保护手段,它不仅可以防止未经授权的复制,还可以为文档增加品牌标识。在iTextSharp中,我们可以使用`PdfContentByte`类来添加文本或图像水印。
**添加文本水印示例代码:**
```csharp
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create)))
{
PdfContentByte over;
for (int i = 1; i <= reader.NumberOfPages; i++)
{
over = stamper.GetOverContent(i);
over.BeginText();
over.SetFontAndSize(BaseFont.CreateFont(), 18);
over.SetTextMatrix(30, 500);
over.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "CONFIDENTIAL", 30, 500, 45);
over.EndText();
}
}
```
### 5.2.2 防止复制和打印的策略
我们也可以通过设置文档的属性来禁止复制和打印,以保护文档内容不被轻易传播。
**设置文档属性示例代码:**
```csharp
PdfReader reader = new PdfReader(input);
PdfStamper stamper = new PdfStamper(reader, new FileStream(output, FileMode.Create));
stamper.SetFullCompression();
stamper.SetEncryption(null, null, PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_DETERMINISTIC开奖结果 | PdfWriter.ALLOW_COPY, PdfWriter.STANDARD_ENCRYPTION_128);
stamper.SetOutlines(null);
stamper.SetPageAction(PdfWriter.PAGE_OPEN, PdfAction.CreateJavaScript("app.execMenuItem('Print');"), PdfWriter.WRITE_ALLtoISOStringNames);
stamper.SetJavaScript("if(typeof(this.print) == 'function') this.print();");
stamper.Close();
```
## 5.3 实际项目中的高级应用案例
### 5.3.1 多语言文档的生成与管理
在国际化项目中,支持多语言文档的生成是常见的需求。iTextSharp的高级功能可以帮助我们处理多语言内容的PDF文档,例如,通过Unicode支持,我们可以创建包含多种语言的文档。
**创建多语言PDF示例代码:**
```csharp
// 示例代码展示了如何创建一个包含多种语言的PDF文档
Document document = new Document();
PdfWriter.GetInstance(document, new FileStream("multilanguage.pdf", FileMode.Create));
document.Open();
document.Add(new Paragraph("Hello, World!"));
document.Add(new Paragraph("你好,世界!"));
document.Add(new Paragraph("Hola, Mundo!"));
document.Close();
```
### 5.3.2 大规模文档的批处理操作
对于需要处理大量文档的情况,批处理操作变得尤为重要。iTextSharp允许我们通过编写高效的代码来批量创建、转换或更新PDF文档。
**批量转换文档示例代码:**
```csharp
// 示例代码展示了如何批量转换目录中的所有PDF文件到另一个文件夹中
string[] files = Directory.GetFiles(inputDir, "*.pdf");
foreach (string file in files)
{
using (PdfReader reader = new PdfReader(file))
{
Document document = new Document();
PdfWriter.GetInstance(document, new FileStream(Path.Combine(outputDir, Path.GetFileName(file)), FileMode.Create));
document.Open();
PdfContentByte canvas = new PdfContentByte(writer);
foreach (int i in Enumerable.Range(1, reader.NumberOfPages))
{
document.SetMargins(20, 20, 20, 20);
canvas.SaveState();
document.NewPage();
canvas.SetGrayFill(0.8f);
canvas.Rectangle(20, 20, 540, 750);
canvas.Fill();
canvas.RestoreState();
document.Add(new Paragraph("This is a page with a watermark."));
}
document.Close();
}
}
```
请注意,上述代码片段仅作为示例,实际应用时需要根据具体需求进行调整和错误处理。在执行这些操作时,还需要确保文件路径正确,并且有足够的权限对文件进行读写操作。在生产环境中,还需要考虑到异常处理和日志记录以确保操作的健壮性。
0
0