【问题标题】:Watermarking pdf on document upload文件上传时加水印pdf
【发布时间】:2015-04-23 06:58:29
【问题描述】:

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

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 水印工作流程的链接。

【问题讨论】:

    标签: sharepoint-2010 itextsharp watermark


    【解决方案1】:

    你不需要有工作流来实现你正在寻找的东西:

    首先,使用 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;   
        }
    }
    

    由于我没有运行此代码,因此我可能打错了一两个字。不过,它应该会给你一个想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 2018-05-20
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多