Sharepoint 2010 文档上传中的pdf水印

Sharepoint 2010 文档上传中的pdf水印,sharepoint-2010,itextsharp,watermark,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; usin

我想添加一个功能,即使用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();


        }


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

您不需要工作流来实现所需的功能:

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

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;   
    }
}
因为我没有运行这段代码,所以我可能输入了一两个错误。然而,它应该给你一个想法

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