簡體   English   中英

使用itext7 C#將文本添加為​​水印

[英]Adding text as watermark using itext7 C#

我正在使用以下代碼將水印添加到pdf中。

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);
    }

但是只有在內容太隱藏的最后一頁才得到水印。 您能否修改此代碼,以便我可以在所有頁面上獲得水印並在內容上顯示。

請查看iText 7 for C#快速入門教程 ,尤其是第5章:處理現有的PDF文檔 滾動到顯示“添加頁眉,頁腳和水印”的部分,然后查看示例:

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實例,而不是僅傳遞PdfWriter ,而是傳遞PdfReader實例。 我們將讀取路徑為src的文件,並將寫入路徑為dest的文件。

您要向每個頁面添加內容。 這意味着您必須遍歷每個頁面(從1n )。 為每個頁面i獲取PdfPage對象,並用您要執行的操作替換//Draw header text行。

就您而言,您可以在現有內容下方添加一個圖像。 那是正常的事情,但是您說水印已被現有內容覆蓋。 例如,當實際內容包括圖像(例如,掃描的頁面)時,就會發生這種情況。 如果在由掃描頁面組成的PDF頁面下添加水印,您將永遠看不到水印。

在這種情況下,您必須將內容添加到現有內容的頂部 ,但是最好使水印透明:

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.GetWidth() / 2pageSize.GetHeight() / 2作為坐標,這意味着我們假設頁面的左下角具有坐標(0, 0) 事實並非如此。 您可能必須將x偏移量和y偏移量添加到該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM