紧急求助:使用iTextSharp删除已加PDF水印

leon51 2020-07-09 10:22:20
我需要给pdf加上水印,重新添加时需先删除已加的水印,每次添加的水印可能是不一样的。
网上说加水印有很多种方法,我找到其中以下两种并测试ok。
想当然地认为自已加的,能加就能删除,但没有找到删除上次已加的水印的方法,因为已加的图层不知如何获取,每次的水印内容又不一样。

第一种加水印的方式
PdfReader reader1 = new PdfReader(startFile);
using (FileStream fs = new FileStream(watermarkedFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (PdfStamper stamper = new PdfStamper(reader1, fs))
{
int pageCount1 = reader1.NumberOfPages;
PdfLayer layer = new PdfLayer("WatermarkLayer", stamper.Writer);
for (int i = 1; i <= pageCount1; i++)
{
iTextSharp.text.Rectangle rect = reader1.GetPageSize(i);
PdfContentByte cb = stamper.GetUnderContent(i);
cb.BeginLayer(layer);
cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 50);
PdfGState gState = new PdfGState();
gState.FillOpacity = 0.25f;
cb.SetGState(gState);
cb.SetColorFill(BaseColor.BLACK);
cb.BeginText();
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, watermarkText, rect.Width / 2, rect.Height / 2, 45f);
cb.EndText();
cb.EndLayer();
}
}
}


第二种加水印的方式

PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
pdfReader = new PdfReader(inputfilepath);
pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.OpenOrCreate));
int total = pdfReader.NumberOfPages + 1;
Rectangle psize = pdfReader.GetPageSize(1);
float width = psize.Width;
float height = psize.Height;
PdfContentByte content;
BaseFont font = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false);

PdfGState gs = new PdfGState();
for (int i = 1; i < total; i++)
{
content = pdfStamper.GetOverContent(i);
gs.FillOpacity = 0.3f;
content.SetGState(gs);
content.BeginText();
content.SetColorFill(BaseColor.RED);
content.SetFontAndSize(font, 30);
content.SetTextMatrix(0, 0);
content.ShowTextAligned(Element.ALIGN_LEFT, waterMarkName, 10, height - 30, 0);
content.EndText();
}
...全文
9319 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
leon51 2020-07-15
  • 打赏
  • 举报
回复
取消了,有空再看吧
jhonsonzhang 2020-07-11
  • 打赏
  • 举报
回复
可以消除所有的图层和水印效果。把你需要的文本提取到自己的new document里面
jhonsonzhang 2020-07-11
  • 打赏
  • 举报
回复
如果该源文件是进行过加密处理的,打住了,没有办法进行重新处理。没有加密,用pdfreader结合pdfstamper提取页面图像是可以消除图像的,当然你得新建一个new document.
耗子哭死猫 2020-07-10
  • 打赏
  • 举报
回复
引用 2 楼 leon51 的回复:
[quote=引用 1 楼 耗子哭死猫 的回复:]没做过,按我的理解肯定是这段PdfContentByte cb = stamper.GetUnderContent(i); 你放在方法外面,删除的时候还是这个添加水印的对象
感谢你的回复,PdfContentByte并没有提供删除的方法。我正在看PdfLayer行不行。[/quote] 你可以把没添加水印的对象保存下来,添加水印的时候再new一个对象。这也是一个思路
leon51 2020-07-10
  • 打赏
  • 举报
回复
引用 1 楼 耗子哭死猫 的回复:
没做过,按我的理解肯定是这段PdfContentByte cb = stamper.GetUnderContent(i); 你放在方法外面,删除的时候还是这个添加水印的对象
感谢你的回复,PdfContentByte并没有提供删除的方法。我正在看PdfLayer行不行。
耗子哭死猫 2020-07-10
  • 打赏
  • 举报
回复
没做过,按我的理解肯定是这段PdfContentByte cb = stamper.GetUnderContent(i); 你放在方法外面,删除的时候还是这个添加水印的对象

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧