2015-04-23 4 views
0

Я хочу добавить функциональность добавления водяного знака с использованием библиотеки itextSharp в pdf-документ, который добавляется в библиотеку. Для этого я создал прослушиватель событий, который запускается при добавлении элемента. Код выглядит следующим образом:Watermarking 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.

ответ

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

Я, вероятно, сделал опечатку или два, так как я не запускал этот код. Однако это должно дать вам представление.

Смежные вопросы