2011-05-03 100 views
1

我迫切需要在不同類型的pdf上添加水印,包括普通pdf,數字簽名的pdf和密碼prodected pdf以編程方式使用C#。我可以對使用下面的代碼進行數字簽名的普通pdf和一些pdf進行水印處理,但對於數字簽名和安全保護的其他pdf文件不起作用。任何人都可以告訴我如何使用itextsharp刪除pdf的安全性,以便它們可以被嵌入水印。如何使用itextsharp去除PDF和水印的安全性pdf

以下代碼可以在不受安全保護但不能在安全保護pdf上加水印的普通PDF上添加水印。

public void AddWatermarkText(string sourceFile, string outputFile, 
string watermarkText, iTextSharp.text.pdf.BaseFont watermarkFont, float 
watermarkFontSize, iTextSharp.text.Color watermarkFontColor, float 
watermarkFontOpacity, float watermarkRotation) 
    { 
     iTextSharp.text.pdf.PdfReader reader = null; 
     iTextSharp.text.pdf.PdfStamper stamper = null; 
     iTextSharp.text.pdf.PdfGState gstate = null; 
     iTextSharp.text.pdf.PdfContentByte underContent = null; 
     iTextSharp.text.Rectangle rect = null; 

     int pageCount = 0; 
     try 
     { 
          { 
       reader = new iTextSharp.text.pdf.PdfReader(sourceFile); 
       rect = reader.GetPageSizeWithRotation(1); 
       stamper = new PdfStamper(reader, new System.IO.FileStream(outputFile, System.IO.FileMode.CreateNew), '\0', true); 

       if (watermarkFont == null) 
       { 
        watermarkFont =iTextSharp.text.pdf.BaseFont.CreateFont(iTextSharp.text.pdf.BaseFont.HELVETICA,iTextSharp.text.pdf.BaseFont.CP1252,iTextSharp.text.pdf.BaseFont.NOT_EMBEDDED); 
       } 
       if (watermarkFontColor == null) 
       { 
        watermarkFontColor = iTextSharp.text.Color.BLUE; 
       } 
       gstate = new iTextSharp.text.pdf.PdfGState(); 
       gstate.FillOpacity = watermarkFontOpacity; 
       gstate.StrokeOpacity = watermarkFontOpacity; 
       pageCount = reader.NumberOfPages; 
       for (int i = 1; i <= pageCount; i++) 
       { 
        underContent = stamper.GetUnderContent(i); 
        //_with1 = underContent; 
        underContent.SaveState(); 
        underContent.SetGState(gstate); 
        underContent.SetColorFill(watermarkFontColor); 
        underContent.BeginText(); 
        underContent.SetFontAndSize(watermarkFont,watermarkFontSize); 
        underContent.SetTextMatrix(30, 30); 

underContent.ShowTextAligned(iTextSharp.text.Element.ALIGN_CENTER,watermarkText,rect.Width/2, rect.Height/2, watermarkRotation); 
        underContent.EndText(); 
        underContent.RestoreState(); 
       } 
      } 
      stamper.Close(); 
      reader.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

感謝

+0

安全保護的重點在於您無法修改文檔。 – 2011-05-03 15:32:39

回答

1

iTextSharp.text.pdf.PdfReader允許你,如果你知道密碼指定所有者的密碼作爲參數。如果您有權這樣做,也可以使用許多在線網站刪除PDF文件的安全設置。 iTextSharp無法刪除安全性設置。

+0

就我而言,我不能將一個所有者Passowrd作爲參數。所以,我需要去尋找其他的選擇。你可以建議我一些網站,這將有助於我申請我的代碼來刪除安全設置。你也可以給我建議我最好的選擇。 (我在法律上有權更改安全設置) – 2011-05-03 17:38:25

+0

如果您無法控制PDF文檔的來源,可以在此處使用此工具([link] http://soft.rubypdf.com/software/pdfcrypt)並運行服務器上的可執行文件通過.net。它將扁平化任何形式的文件(不會再被填充)。解密的命令參數爲:pdfcrypt input_file.pdf output_file.pdf解密「」確保對未知密碼使用一對雙引號。 – Jay 2011-05-03 19:08:56

+0

我使用(http://rubypdf.appspot.com/pdfdecrypt.html)在線解密了我的pdf,並嘗試使用上面的代碼對此解密的pdf進行水印處理。但是我的代碼仍然無法爲PDF加水印。那麼,你能否告訴我爲什麼某些pdf可以使用上面的代碼容易地嵌入水印,即使它們是數字簽名的。同時,即使使用上述軟件解密,也不能加水印。在這種情況下,你認爲什麼是最好的選擇。 – 2011-05-03 20:06:43