9

我正在使用 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 文件中没有添加水印,尽管文件大小增加了,知道吗?

4

2 回答 2

8

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

你需要这样的东西:

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

即:如果要在页面左下角添加图片。可以添加偏移量,但要确保x方向的偏移量不超过页面宽度,y方向的偏移量不超过页面高度。

于 2013-07-08T16:14:53.697 回答
0

虽然我不知道 iTextSharp 的细节,可能在您的图像未显示的页面上,以前的 PDF 内容已经修改了当前的转换矩阵,因此您在页面上放置的任何内容都被移出页面。

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

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

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

于 2013-07-08T13:19:06.387 回答