为什么通过下列代码创建的水印 即使在代码中修改水印文本结果显示的时候还是第一次创建的水印 using (PdfReader reader = new PdfReader(filepath+ filetype_pdf)) { int pageCount = reader.NumberOfPages; // 添加水印 using (PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create))) { for (int i = 1; i <= pageCount; i++) { // 水印文本 //string watermarkText = "鲁达LUDA 鲁达LUDA 鲁达LUDA 鲁达LUDA 鲁达LUDA"; // 水印字体 BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); Font font = new Font("Black", 75, FontStyle.Bold); //Brush brush = new SolidBrush(Color.FromArgb(128, Color.LightGray)); // 水印位置 iTextSharp.text.Rectangle rect = reader.GetPageSize(i); float x = rect.Width / 2; float y = rect.Height / 2; // 添加水印 PdfContentByte over = stamper.GetOverContent(i); over.SaveState(); over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f }); over.BeginText(); over.SetFontAndSize(bf, font.Size); over.SetColorFill(BaseColor.LIGHT_GRAY); over.ShowTextAligned(Element.ALIGN_CENTER, watermark, x, y, 45); over.EndText(); over.RestoreState(); } stamper.Close(); pdfViewer1.Document = PdfiumViewer.PdfDocument.Load("temp.pdf"); }
时间: 2023-12-11 16:05:45 浏览: 84
这是因为你在创建水印时,使用了一个固定的文本变量 "watermark",而没有实时更新它。所以,无论你在代码中如何修改文本,都只会显示第一次创建的水印。
要解决这个问题,你需要在循环中动态地更新水印文本变量。例如,你可以将水印文本变量放在一个数组或列表中,并在循环中根据当前页数来获取对应的文本。示例代码如下:
```
string[] watermarkTexts = new string[] { "水印1", "水印2", "水印3" };
using (PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create)))
{
for (int i = 1; i <= pageCount; i++)
{
// 获取当前页码对应的水印文本
string watermarkText = watermarkTexts[i % watermarkTexts.Length];
// 其他水印代码...
}
}
```
这样,每次循环都会根据当前页数获取对应的水印文本,从而实现动态更新水印的效果。
相关问题
为什么使用下列代码给pdf添加的水印 就算修改了watermarktext变量的文本 打开pdf文件后里边的水印还是第一次生成代码时的水印 using (PdfReader reader = new PdfReader(path)) { int pageCount = reader.NumberOfPages; // 添加水印 PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create)); for (int i = 1; i <= pageCount; i++) { // 水印文本 string watermarkText = "鲁达LUDA 鲁达LUDA 鲁达LUDA 鲁达LUDA 鲁达LUDA"; // 水印字体 BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); Font font = new Font("Black", 75, FontStyle.Bold); //Brush brush = new SolidBrush(Color.FromArgb(128, Color.LightGray)); // 水印位置 iTextSharp.text.Rectangle rect = reader.GetPageSize(i); float x = rect.Width / 2; float y = rect.Height / 2; // 添加水印 PdfContentByte over = stamper.GetOverContent(i); over.SaveState(); over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f }); over.BeginText(); over.SetFontAndSize(bf, font.Size); over.SetColorFill(BaseColor.LIGHT_GRAY); over.ShowTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45); over.EndText(); over.RestoreState(); } stamper.Close(); pdfViewer1.Document = PdfiumViewer.PdfDocument.Load("temp.pdf"); }
这是因为你每次都是将原始的PDF文件作为源文件进行处理,而不是修改已经添加水印的PDF文件。因此,每次生成的PDF文件都是带有相同水印的原始文件。要解决这个问题,你需要在每次添加水印时使用新的输出文件名,而不是使用相同的文件名。修改代码如下:
```
using (PdfReader reader = new PdfReader(path))
{
int pageCount = reader.NumberOfPages;
for (int i = 1; i <= pageCount; i++)
{
string watermarkText = "鲁达LUDA 鲁达LUDA 鲁达LUDA 鲁达LUDA 鲁达LUDA";
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
Font font = new Font("Black", 75, FontStyle.Bold);
iTextSharp.text.Rectangle rect = reader.GetPageSize(i);
float x = rect.Width / 2;
float y = rect.Height / 2;
string outputFileName = Path.Combine(Path.GetDirectoryName(path), $"temp{i}.pdf");
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(outputFileName, FileMode.Create)))
{
PdfContentByte over = stamper.GetOverContent(i);
over.SaveState();
over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f });
over.BeginText();
over.SetFontAndSize(bf, font.Size);
over.SetColorFill(BaseColor.LIGHT_GRAY);
over.ShowTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45);
over.EndText();
over.RestoreState();
}
pdfViewer1.Document = PdfiumViewer.PdfDocument.Load(outputFileName);
}
}
```
这样,每次添加水印时都会生成一个新的PDF文件,每个文件都包含不同的水印。
为什么用这段代码给pdf文件添加的水印只有第一页有using (PdfReader reader = new PdfReader(path)) { int pageCount = reader.NumberOfPages; // 添加水印 PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create)); for (int i = 1; i <= pageCount; i++) { // 水印文本 string watermarkText = "LUDA LUDA LUDA LUDA LUDA"; // 水印字体 BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); Font font = new Font("Black", 80, FontStyle.Bold); //Brush brush = new SolidBrush(Color.FromArgb(128, Color.LightGray)); // 水印位置 iTextSharp.text.Rectangle rect = reader.GetPageSize(i); float x = rect.Width / 2; float y = rect.Height / 2; // 添加水印 PdfContentByte over = stamper.GetOverContent(i); over.SaveState(); over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f }); over.BeginText(); over.SetFontAndSize(bf, font.Size); over.SetColorFill(BaseColor.GRAY); over.ShowTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45); over.EndText(); over.RestoreState(); stamper.Close(); }
这是因为你在循环中每次都调用了 `PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create));` 来创建一个新的 `PdfStamper`,这会导致每次都重新创建一份新的 PDF 文件,并且只添加了当前页的水印。
你应该将 `PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create));` 放在循环外部,只创建一次,然后在循环内部通过 `stamper.GetOverContent(i)` 来获取当前页的 `PdfContentByte`,从而实现将水印添加到所有页。修改后的代码如下:
```
using (PdfReader reader = new PdfReader(path))
{
int pageCount = reader.NumberOfPages;
// 创建 PdfStamper
PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create));
for (int i = 1; i <= pageCount; i++)
{
// 水印文本
string watermarkText = "LUDA LUDA LUDA LUDA LUDA";
// 水印字体
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
Font font = new Font("Black", 80, FontStyle.Bold);
// 水印位置
iTextSharp.text.Rectangle rect = reader.GetPageSize(i);
float x = rect.Width / 2;
float y = rect.Height / 2;
// 添加水印
PdfContentByte over = stamper.GetOverContent(i);
over.SaveState();
over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f });
over.BeginText();
over.SetFontAndSize(bf, font.Size);
over.SetColorFill(BaseColor.GRAY);
over.ShowTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45);
over.EndText();
over.RestoreState();
}
// 关闭 PdfStamper
stamper.Close();
}
```
阅读全文