2013-10-24 119 views
2

我打開一個現有的PDF。檢查保護並要求密碼,如果它被保護並打開它:Itextsharp打開密碼保護文件修改它並採取保護

 PdfReader pdfReader = null; 
     Stream outputStream = null; 
     PdfStamper pdfStamper = null; 

     try 
     { 
      pdfReader = GetPdfReaderObject(); 
      outputStream = new FileStream(filePathDestination, FileMode.Create, FileAccess.Write, FileShare.None); 
      pdfStamper = new PdfStamper(pdfReader, outputStream); 

       PdfLayer layer = new PdfLayer("watermark", pdfStamper.Writer); 

       for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) { 
        pdfStamper.FormFlattening = false; 
        iTextSharp.text.Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex); 
        PdfContentByte pdfData = pdfStamper.GetOverContent(pageIndex); 

        pdfData.BeginLayer(layer); 

        PdfGState graphicsState = new PdfGState(); 
        graphicsState.FillOpacity = 0.5F; 
        pdfData.SetGState(graphicsState); 
        pdfData.BeginText(); 

        iTextSharp.text.Image watermarkImage = iTextSharp.text.Image.GetInstance(System.Drawing.Image.FromFile(watermarkImagePath), ImageFormat.Png); 

        float width = pageRectangle.Width; 
        float height = pageRectangle.Height; 

        watermarkImage.SetAbsolutePosition(width/2 - watermarkImage.Width/2, height/2 - watermarkImage.Height/2); 

        pdfData.AddImage(watermarkImage); 
        pdfData.EndText(); 
        pdfData.EndLayer(); 
       } 
      } 
      pdfStamper.Close(); 
      outputStream.Close(); 
      outputStream.Dispose(); 
      pdfReader.Close(); 
      pdfReader.Dispose(); 

     } catch (Exception e) { 
      .... 
     } 
    } 

我的修改後,我保存它,但保護被破壞。

爲什麼保護被破壞? 如何從原始文檔保存保護並將其添加到修改後的文檔中。

Regards

+0

請提供更多代碼。你不顯示你修改你的PDF的方式。你使用「PdfStamper」嗎?或者'PdfCopy'?或者一個'PdfWriter'?如何? – mkl

回答

3

您使用PdfStamper來操縱現有的PDF。

對於任何來源PDF:如果您想要對結果進行加密,則可以適當使用SetEncryption方法。

看一看在EncryptionPdf.cs,尤其是它的方法EncryptPdf

PdfReader reader = ...; 
using (MemoryStream ms = new MemoryStream()) 
{ 
    using (PdfStamper stamper = new PdfStamper(reader, ms)) 
    { 
     stamper.SetEncryption(
       USER, OWNER, 
       PdfWriter.ALLOW_PRINTING, 
       PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA 
     ); 
    } 
    return ms.ToArray(); 
} 

這裏USEROWNER是您所選擇的用戶和所有者密碼。您可能想要使用一組不同的權限。

對於已經加密的源的PDF你可以替代地選擇使用在附加模式的PdfStamper(即使用PdfStamper構造與bool append參數設置爲true)。在這種情況下,原始加密也將應用於更新的PDF。

+0

使用附加標誌,保護/加密也在修改後工作。但是,如果我使用Acrobat Reader打開pdf,它會告訴我:「此頁面存在錯誤,Acrobat可能無法正確顯示頁面,請聯繫創建PDF文檔的人員以糾正問題。」我是否還需要加密我的新添加的圖像?問題是什麼?在沒有加密的文件上工作沒有失敗。 – GermanSniper

+0

@GermanSniper你可以在操作之前和之後提供一個示例嗎? – mkl

+0

我會稍後提供一些示例文件。但還有一個問題:如果我添加標籤追加,我無法從pdf中刪除內容。我如何保存加密,刪除和添加內容?慢慢地,我要瘋了... – GermanSniper

1

您使用的是哪一個版本的iText?

當使用owner密碼打開受密碼保護並由PdfStamper控制的密碼保護PDF時,確實已刪除了所有原始密碼保護。這在iText 5.3.5中改變了。請參閱changelog

重要說明:我們現在在加蓋文檔時保留原始的所有者密碼。

換句話說:所有iText版本在5.3.5之前,所有者密碼都會丟失。從5.3.5開始,應該保留。

+0

我使用版本5.4.3。這不可能是問題 – GermanSniper

+0

*我們現在在蓋印文檔時保留原始的所有者密碼* - 總是?我找到一個'if(reader.isEncrypted()&&(append || PdfReader.unethicalreading)){crypto = new PdfEncryption(reader.getDecrypt()); }'在'PdfStamperImp'代碼中,它看起來像只保留在追加或不道德的模式... – mkl

+0

嗯...我寫了代碼。現在你提醒我不道德的模式,我記得:如果你知道所有者密碼,你可能應該用'stamper.setEncryption()'設置密碼。如果我們自動重用現有密碼,則無法將文檔解密爲未加密的PDF(這也是一種用例)。我對你的回答給出了贊成票(我也贊成這個問題,因爲它是一個好問題)。 –