2013-07-08 8 views
7

私は私のPDFファイルに透かしを追加するために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(); 

+0

すべてのPDFファイルに同じメディボックスとクロップボックスがありますか? '(100、300)'の位置がこれらのボックスの外側にあるのでしょうか? –

+0

位置が正しいです、私はそれをテストします。 – Abady

+0

ウォーターマークが表示されていないときのメディア/クロップボックスの座標は? –

答えて

7

ファイルサイズが増加するという事実は、ウォーターマークが追加されたことを示しています。主な問題は、ページの可視領域外にウォーターマークを追加することです。

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

です:あなたはページの左下隅に画像を追加したい場合は、このようなものが必要How to position text relative to page using iText?

参照してください。オフセットを追加できますが、x方向のオフセットがページの幅を超えておらず、y方向のオフセットがページの高さを超えていないことを確認してください。

+1

NugetのiText LGPL ver 4.1.6には 'pdfReader.GetMediaBox(pageNumber)'はありません。代わりに 'pdfReader.GetPageSize(pageNumber)'があります。また、 'pageIndex'は' 0'で始まる印象を与えます。 '1'で始まるので、' pageNumber'が良いでしょう。 –

+0

@RosdiKasim私はpageIndexが0ベースのインデックス作成を意味するのに対し、GetMediaBox()は間違ったメソッドであると誤解しています。この編集を答えに加えると、より正確になります。 GetCropBoxはgetCropBoxの正しいケーシングです – Arkaine55

0

画像が表示されていないページでiTextSharpの詳細がわかりませんが、以前のPDFコンテンツでは現在の変換マトリックスが変更されています。

これは、元のページコンテンツの前にgsave演算子を表示し、元のページコンテンツの後にgrestore演算子を表示することで修正できます。ただし、CTMを変更するPDF文書ですべてのケースを修正するわけではありません.gsaveとgrestoreはありません。これは、PDFの仕様に応じて、理論的に起こることになっていません。

Qの出現とQオペレータは、指定されたコンテンツのストリーム(内またはページ辞書の内容を配列で指定されたストリームの配列内でバランスされなければなりません)。

実際にはそうではないことを経験から教えていただけます。

+0

OPは 'pdfStamper.GetOverContent'を使用します。つまり、iTextは** q **と** Q **の既存のコンテンツストリームをエンベッドし、後で** q ... Q **の外にOPの​​追加を追加します。従って、そのようなCTMの変化の影響を受けない。私は@Alexisが彼の前提の通りだと仮定します。 – mkl

関連する問題