我正在使用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文件中没有添加水印,尽管文件大小增加,任何想法?
答案 0 :(得分:8)
文件大小增加的事实表明添加了水印。主要问题是您在页面的可见区域外添加水印。见How to position text relative to page using iText?
你需要这样的东西:
Rectangle pagesize = reader.GetCropBox(pageIndex);
if (pagesize == null)
pagesize = reader.GetMediaBox(pageIndex);
img.SetAbsolutePosition(
pagesize.GetLeft(),
pagesize.GetBottom());
即:如果要在页面的左下角添加图像。您可以添加偏移量,但要确保x方向上的偏移量不超过页面宽度,y方向上的偏移量不超过页面高度。
答案 1 :(得分:0)
虽然我不知道iTextSharp的具体细节,可能在您的图像未显示的页面上,但之前的PDF内容已经修改了当前的转换矩阵,这样您放在页面上的任何内容都会移出页面。 / p>
这可以通过在原始页面内容之前发出gsave运算符并在原始页面内容之后(但在您之前)发出grestore运算符来解决。但是,这可能无法修复所有修改CTM的PDF文档的情况,而是执行gsave而不执行grestore。根据PDF规范,这不应该在理论上发生:
q和Q运算符的出现应在给定的内容流中(或在页面字典的Contents数组中指定的流序列内)进行平衡。
但我可以从经验中告诉你,实际情况并非如此。