我有代码在用户上传文件时创建水印。水印在中间页面和页脚页面中创建。但我的问题是水印工作并不完美,具体取决于上传文件内容的内容。有关详细信息,请注意以下图片:
这是我的代码:
public bool InsertWaterMark(string path)
{
bool valid = true;
string FileDestination = AppDomain.CurrentDomain.BaseDirectory + "Content/" + path;
string FileOriginal = AppDomain.CurrentDomain.BaseDirectory + "Content/" + path.Replace("FileTemporary", "FileOriginal");
System.IO.File.Copy(FileDestination, FileOriginal);
string watermarkText = "Controlled Copy";
PdfReader reader = new PdfReader(FileOriginal);
using (FileStream fs = new FileStream(FileDestination, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (PdfStamper stamper = new PdfStamper(reader, fs))
{
int pageCount = reader.NumberOfPages;
for (int i = 1; i <= pageCount; i++)
{
PdfContentByte cbCenter = stamper.GetUnderContent(i);
PdfGState gState = new PdfGState();
cbCenter.BeginText();
iTextSharp.text.Rectangle rect = reader.GetPageSize(i);
cbCenter.SetColorFill(BaseColor.GRAY);
gState.FillOpacity = 0.15f;
cbCenter.SetGState(gState);
cbCenter.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 80);
cbCenter.ShowTextAligned(PdfContentByte.ALIGN_CENTER, watermarkText, rect.Width / 2, rect.Height / 2, 45f);
cbCenter.EndText();
PdfContentByte cbFooter = stamper.GetUnderContent(i);
PdfGState gStateFooter = new PdfGState();
cbFooter.BeginText();
cbFooter.SetColorFill(BaseColor.RED);
gStateFooter.FillOpacity = 1f;
cbFooter.SetGState(gStateFooter);
cbFooter.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_OBLIQUE, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12);
cbFooter.ShowTextAligned(PdfContentByte.ALIGN_CENTER, '"' + "When printed, this documents are considered uncontrolled" + '"', 300.7f, 10.7f, 0);
cbFooter.EndText();
}
}
}
reader.Close();
return valid;
}
请更正我的代码并提供解决方案。 谢谢你的进步
答案 0 :(得分:0)
您正在使用<Setter Property="Font"
,这意味着您要在现有内容下添加内容。
换句话说:水印涵盖的existsong内容。如果现有内容不透明,则水印将不可见。如果您执行Ctrl + A,您将能够看到形状,但在打印页面时您将看不到它。
在示例ALFA中,您会在现有文本下看到水印,因为现有文本没有背景。在示例CARLIE中,您看不到它,因为文本具有覆盖水印的白色背景。
如何解决这个问题?使用stamper.GetUnderContent(i)
代替stamper.GetOverContent(i)
。
另外:为什么你还在使用iTextSharp版本5或更早版本?目前的版本是针对.NET的iText 7。请升级!