¿Cómo agregar una marca de agua a un archivo PDF?

Estoy usando C # y iTextSharp para agregar una marca de agua a mis archivos 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(); 

Funciona bien, pero mi problema es que en algunos archivos PDF no se agrega marca de agua, aunque el tamaño del archivo aumentó, ¿alguna idea?

El hecho de que el tamaño del archivo aumenta es una buena indicación de que se agrega la marca de agua. El principal problema es que está agregando la marca de agua fuera del área visible de la página. Consulte ¿Cómo colocar el texto relativo a la página usando iText?

Necesitas algo como esto:

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

Es decir: si desea agregar la imagen en la esquina inferior izquierda de la página. Puede agregar un desplazamiento, pero asegúrese de que el desplazamiento en la dirección x no exceda el ancho de la página, y el desplazamiento en la dirección y no exceda el alto de la página.

Aunque no conozco las características específicas de iTextSharp, es probable que en las páginas donde no se muestre su imagen, el contenido anterior de PDF haya modificado la matriz de transformación actual, de modo que lo que coloque en la página se retire de la página.

Esto se puede solucionar emitiendo un operador gsave antes del contenido de la página original y emitiendo un operador de grestre después del contenido de la página original (pero antes del suyo). Esto, sin embargo, puede no solucionar todos los casos con un documento PDF que modifica el CTM hace un gsave y no grestre. Esto no se supone que suceda en teoría, de acuerdo con la especificación PDF:

Las ocurrencias de los operadores qy Q se equilibrarán dentro de un flujo de contenido dado (o dentro de la secuencia de flujos especificada en el conjunto de Contenidos del diccionario de una página).

pero puedo decir por experiencia que este no es el caso en la práctica.