2015-04-23 115 views
0

我想添加一个功能,使用itextSharp库添加水印到正在被添加到库中的pdf文档。为此,我创建了一个事件侦听器,该事件侦听器在添加项目时触发。代码如下:关于文档上传的水印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。 我知道它也可以通过工作流完成,但我对共享点来说很新。因此,如果你有一个有工作流程的答案,请给出解释自动化PDF水印工作流程的链接。

回答

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

我可能做了一两个错字,因为我没有运行这段代码。但是,它应该给你一个想法。