Как добавить водяной знак в PDF файл?
Я использую 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 не добавляется водяной знак, хотя размер файла увеличился, есть идеи?
2 ответов
тот факт, что размер файла увеличивается, является хорошим признаком добавления водяного знака. Основная проблема заключается в том, что вы добавляете водяной знак вне видимой области страницы. См.Как расположить текст относительно страницы с помощью 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 после исходного содержимого страницы (но перед вашим). Это, однако, не может исправить все случаи с PDF-документом, который изменяет CTM делает gsave и не grestore. Это не должно происходить в теории, согласно спецификации PDF:
вхождения операторов q и Q должны быть сбалансированы в пределах заданного потока содержимого (или в последовательности потоков, указанных в массиве содержимого словаря страниц).
но я могу сказать вам по опыту, что на практике это не так.