2013-07-08 2 views
7

Я использую C# и iTextSharp добавить водяной знак в моих PDF файлы:Как добавить водяной знак в файл 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

У всех ваших файлов PDF есть одинаковые медиана и обрезка? Может ли быть, что позиция '(100, 300)' находится за пределами этих полей? –

+0

позиция правильная, я проверяю ее. – Abady

+0

И каковы координаты полей media/crop, когда водяной знак не отображается? –

ответ

7

Тот факт, что размер файла увеличивается, является хорошим показателем добавления водяного знака. Основная проблема заключается в том, что вы добавляете водяной знак за пределы видимой области страницы. См 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

В iText LGPL ver 4.1.6 в Nuget нет 'pdfReader.GetMediaBox (pageNumber)', вместо этого существует 'pdfReader.GetPageSize (pageNumber)'. Также 'pageIndex' создает впечатление, что оно начинается с' 0'. Поскольку он начинается с '1',' pageNumber' будет лучше. –

+0

@RosdiKasim, в то время как я не согласен с тем, что pageIndex подразумевает индексирование на основе 0, вы правы, что GetMediaBox() - неправильный метод .... вы должны добавить это изменение в ответ, чтобы оно было более правильным. GetCropBox также является правильной оболочкой getCropBox – Arkaine55

0

Хотя я не знаю специфику iTextSharp, вероятно, на страницах, где ваше изображение не отображается, предыдущий PDF-контент изменил текущую матрицу трансформации так, чтобы все, что вы положили на страницу, было перемещено со страницы.

Это можно устранить, испустив оператор gsave до исходного содержимого страницы и испустив оператора grestore после исходного содержимого страницы (но до вашего). Это, однако, не может исправить все случаи с PDF-документом, который модифицирует CTM, делает gsave и нет grestore. Это не должно происходить в теории, согласно спецификации PDF:

вхождений д и операторы Q должны быть сбалансированы в пределах данного потока контента (или в последовательности потоков, указанных в массиве Содержания словаря-странице).

, но я могу сказать вам, что это не так на практике.

+0

OP использует 'pdfStamper.GetOverContent', что означает, что iText огибает существующий поток контента в ** q ** и ** Q ** и затем добавляет добавления OP, вне ** q ... Q ** и, поэтому на них не влияют такие изменения CTM. Я полагаю, что @Alexis прав в своем предположении. – mkl

Смежные вопросы