在文档上载时加水印pdf

时间:2015-04-23 06:58:30

标签: sharepoint-2010 itextsharp watermark

我想添加一个使用itextSharp库将水印添加到正在添加到库中的pdf文档的功能。为此,我创建了一个在添加项目时触发的事件侦听器。代码如下:

using System;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

namespace ProjectPrac.WaterMarkOnUpload
{
    /// <summary>
    /// List Item Events
    /// </summary>
    public class WaterMarkOnUpload : SPItemEventReceiver
    {
        /// <summary>
        /// An item is being added.
        /// </summary>
        public override void ItemAdding(SPItemEventProperties properties)
        {
            base.ItemAdding(properties);
            string watermarkedFile = "Watermarked.pdf";
        // Creating watermark on a separate layer
        // Creating iTextSharp.text.pdf.PdfReader object to read the Existing PDF Document

        PdfReader reader1 = new PdfReader("C:\\Users\\Desktop\\Hello.pdf");      //THE RELATIVE PATH

        using (FileStream fs = new FileStream(watermarkedFile, FileMode.Create, FileAccess.Write, FileShare.None))
        // Creating iTextSharp.text.pdf.PdfStamper object to write Data from iTextSharp.text.pdf.PdfReader object to FileStream object
        using (PdfStamper stamper = new PdfStamper(reader1, fs))
        {
            // Getting total number of pages of the Existing Document
            int pageCount = reader1.NumberOfPages;

            // Create New Layer for Watermark
            PdfLayer layer = new PdfLayer("WatermarkLayer", stamper.Writer);
            // Loop through each Page
            for (int i = 1; i <= pageCount; i++)
            {
                // Getting the Page Size
                Rectangle rect = reader1.GetPageSize(i);

                // Get the ContentByte object
                PdfContentByte cb = stamper.GetUnderContent(i);

                // Tell the cb that the next commands should be "bound" to this new layer
                cb.BeginLayer(layer);
                cb.SetFontAndSize(BaseFont.CreateFont(
                  BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 50);

                PdfGState gState = new PdfGState();
                gState.FillOpacity = 0.25f;
                cb.SetGState(gState);

                cb.SetColorFill(BaseColor.BLACK);
                cb.BeginText();
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "Confidential", rect.Width / 2, rect.Height / 2, 45f);
                cb.EndText();

                // Close the layer
                cb.EndLayer();


        }


    }
}

我想知道如何在没有硬编码的情况下添加路径:

PdfReader reader1 = new PdfReader("C:\\Users\\Desktop\\Hello.pdf");      //THE RELATIVE PATH

然后将带水印的文档上传到库而不是原始的pdf。 我知道它也可以通过工作流完成,但我对sharepoint很新。因此,如果您有一个包含工作流程的答案,请提供解释自动化pdf水印的工作流程的链接。

1 个答案:

答案 0 :(得分:0)

您不需要拥有工作流程来实现您的目标:

首先,使用ItemAdded事件而不是ItemAdding。然后,您可以访问与更新列表项关联的SPFile。

public override void ItemAdded(SPItemEventProperties properties)
{
    var password = string.Empty; //or you put some password handling
    SPListItem listItemToFile = properties.Listitem;
    SPFile pdfOriginalFile = listItemToFile.File;
    //get byte[] of uploaded file
    byte[] contentPdfOriginalFile = pdfOriginalFile.OpenBinary();
    //create reader from byte[]
    var pdfReader = new PdfReader(new RandomAccessFileOrArray(contentPdfOriginalFile), password);

    using (var ms = new MemoryStream()) {  
        using (var stamper = new PdfStamper(pdfReader, ms, '\0', true)) {
        // do your watermarking stuff  
        ...
        // resuming SP stuff    
        }    

        var watermarkedPdfContent = ms.ToArray();
        base.EventFiringEnabled = false; //to prevent other events being fired 
        var folder = pdfOriginalFile.ParentFolder;//you want to upload to the same place
        folder.Files.Add(contentPdfOriginalFile.Name, fs.ToArray(),true);
        base.EventFiringEnabled = true;   
    }
}

由于我没有运行此代码,我可能写了一两个错字。但是,它应该给你一个想法。