2016-12-22 47 views
0

私は以下のコードを使用して私のpdfにウォーターマークを追加しています。itext7を使用してウォーターマークとしてテキストを追加するC#

private void Merge(List<string> src, string dest) 
    { 
     iTextKernel.PdfWriter writer = new iTextKernel.PdfWriter(dest); 
     iTextKernel.PdfDocument pdfDocument1 = new iTextKernel.PdfDocument(new iTextKernel.PdfReader(src[0]), writer); 
     pdfDocument1.AddEventHandler(PdfDocumentEvent.END_PAGE, new WatermarkingEventHandler()); 

     for (int i = 1, max = src.Count; i < max; i++) 
     { 
      iTextKernel.PdfDocument pdfDocument2 = new iTextKernel.PdfDocument(new iTextKernel.PdfReader(src[i])); 
      var pagesCount = pdfDocument2.GetNumberOfPages(); 
      pdfDocument2.CopyPagesTo(1, pagesCount, pdfDocument1); 
      pdfDocument2.Close(); 
     } 
     pdfDocument1.Close(); 
    protected class WatermarkingEventHandler : IEventHandler { 

     public void HandleEvent(Event e) { 
     PdfDocumentEvent docEvent = (PdfDocumentEvent) e; 
     iTextKernel.PdfDocument pdfDoc = docEvent.GetDocument(); 
     iTextKernel.PdfPage page = docEvent.GetPage(); 
     iText.Kernel.Font.PdfFont font = null; 
     try { 
      font = PdfFontFactory.CreateFont(FontConstants.HELVETICA_BOLD); 
     } catch (IOException ex) { 
      //_log.Error(ex); 
     } 
     PdfCanvas canvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc); 
     new Canvas(canvas, pdfDoc, page.GetPageSize()) 
       .SetFontColor(iText.Kernel.Colors.DeviceGray.LIGHT_GRAY) 
       .SetFontSize(60) 
       .SetFont(font) 
       .ShowTextAligned(new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT"), 298, 421, pdfDoc.GetPageNumber(page), 
         TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); 
    } 

しかし、内容の下に隠れている最後のページだけに透かしを入れています。このコードを変更して、すべてのページに透かしを入れてコンテンツに表示できるようにしてください。

+0

コードには多くの問題があります。たとえば、2つの 'PdfDocument'インスタンスは必要ありません。 1つで十分です。 –

+0

簡潔なコードを入力してください。パラメータはうまく説明されていません。質問を説明するのに少し努力してください。それは他の人々があなたにより良い、より有用な答えを与えるのを助けるでしょう。ではごきげんよう!! –

答えて

0

iText 7 for C# jump-start tutorial、具体的にはChapter 5: Manipulating an existing PDF documentをご覧ください。スクロールそれが言う部分に:「ヘッダー、フッター、および透かしの追加」と例を見て:

PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest)); 
Document document = new Document(pdfDoc); 
Rectangle pageSize; 
PdfCanvas canvas; 
int n = pdfDoc.GetNumberOfPages(); 
for (int i = 1; i <= n; i++) { 
    PdfPage page = pdfDoc.GetPage(i); 
    pageSize = page.GetPageSize(); 
    canvas = new PdfCanvas(page); 
    //Draw header text 
} 
pdfDoc.close(); 

あなたが見ることができるように、私たちは一つだけPdfDocumentインスタンスを必要とするが、代わりにのみ渡しますPdfWriterPdfReaderインスタンスも渡します。私たちはパスsrcでファイルを読み取り、パスdestでファイルに書き込みます。

各ページにコンテンツを追加します。つまり、各ページをループする必要があります(1からnまで)。各ページのPdfPageオブジェクトを取得し、iの行を//Draw header textに置き換えます。

あなたの場合は、の画像をの下に追加します。これは普通のことですが、透かしは既存のコンテンツの対象となります。これは、例えば、実際のコンテンツが画像(例えば、スキャンされたページ)からなる場合に起こる。スキャンしたページで構成されるPDFのページの下にウォーターマークを追加すると、ウォーターマークが表示されなくなります。その場合

、あなたがの上に既存のコンテンツをコンテンツを追加する必要がありますが、それは透かしを透明にするのが最善です:チュートリアルでは、我々はpageSize.GetWidth()/2を使用していることを

Paragraph p = new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT").SetFontSize(60); 
canvas.SaveState(); 
PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.2f); 
canvas.SetExtGState(gs1); 
document.ShowTextAligned(p, pageSize.GetWidth()/2, pageSize.GetHeight()/2, pdfDoc.GetPageNumber(page), TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); 
canvas.RestoreState(); 

注意pageSize.GetHeight()/2を座標として使用します。つまり、ページの左下隅に座標(0, 0)があるとします。そうではないかもしれません。その値にxオフセットとyオフセットを加えなければならないかもしれません。

+0

* "透かしを透明にすることをお勧めします" * - 透明度が最も高いほど頻繁にブレンドモードが暗くなります。 – mkl

関連する問題