如何在PDF文件中添加水印

本文关键字:添加 文件 PDF | 更新日期: 2023-09-27 18:21:21

我正在使用C#和iTextSharp为我的PDF文件添加水印:

Document document = new Document();
PdfReader pdfReader = new PdfReader(strFileLocation);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(strFileLocationOut, FileMode.Create, FileAccess.Write, FileShare.None));
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(WatermarkLocation);
img.SetAbsolutePosition(100, 300);
PdfContentByte waterMark;
//    
for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++)
{
    waterMark = pdfStamper.GetOverContent(pageIndex);
    waterMark.AddImage(img);
}
//
pdfStamper.FormFlattening = true;
pdfStamper.Close();

它很好,但我的问题是,在一些PDF文件中,虽然文件大小增加了,但无水印被添加,知道吗?

如何在PDF文件中添加水印

文件大小增加这一事实很好地表明添加了水印。主要问题是您在页面的可见区域之外添加水印。请参阅如何使用iText相对于页面定位文本?

你需要这样的东西:

Rectangle pagesize = reader.GetCropBox(pageIndex);
if (pagesize == null)
    pagesize = reader.GetMediaBox(pageIndex);
img.SetAbsolutePosition(
    pagesize.GetLeft(),
    pagesize.GetBottom());

也就是说:如果你想在页面的左下角添加图像。您可以添加偏移量,但要确保x方向的偏移量不超过页面宽度,y方向的偏移值不超过页面高度。

虽然我不知道iTextSharp的具体情况,可能是在没有显示图像的页面上,但以前的PDF内容修改了当前的转换矩阵,使您在页面上放置的内容都从页面上移开。

这可以通过在原始页面内容之前发出gsave运算符和在原始页面属性之后(但在您的页面内容之前)发出grestore运算符来解决。然而,这可能无法解决所有情况,因为修改CTM的PDF文档会进行gsave而不进行grestore。根据PDF规范,理论上不应该发生这种情况

q和q运算符的出现应在给定的内容流中(或在页面字典的Contents数组中指定的流序列中)保持平衡。

但我可以根据经验告诉你,实际情况并非如此。