2012-11-05 6 views
2

우리는 채울 수있는 필드를 포함하고 Adobe Reader에서 열고 최종 사용자가 작성할 수있는 PDF 양식의 라이브러리를 보유하고 있습니다. PDF를 생성하는 것이 아니라 기존 PDF를 사용하는 것입니다. 이러한 양식은 모두 비밀번호로 채울 수없는 필드를 Acrobat에서 편집하지 못하도록 보호되어 있습니다.미리 채우기 잠금 후

코드에서 PDF를 열 때 일부 필드를 미리 채우면 암호 보호 기능이 손실되고 제공되는 양식은 Acrobat에서 편집 할 수 있습니다.

그래서 :

  1. 은 PDF 및 결과 출력 스트림을 해제하지 않고 iTextSharp를 사용하여 작성 가능한 필드를 미리 기입 할 수있는 방법이 있습니까?
  2. 을 암호가 필요없이 최종 사용자 을 리더에서 열고 채울 수있는 입력란을 채우고 인쇄하는 등의 방법으로 양식을 다시 잠글 수 있습니까?

다음은 현재 사용중인 코드의 간단한 예입니다. 출력 스트림 (현재 사용할 수없는 코드)을 잠그려고 시도했지만 파일에서 Reader가 사용자에게 암호를 묻는 메시지를 표시 할 수 없습니다.

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
Byte[] password = encoding.GetBytes("secretPassword"); 
PdfReader reader = null; 
MemoryStream outputStream = null; 
PdfStamper stamper = null; 
pdfStream.Seek(0, SeekOrigin.Begin); 
reader = new PdfReader(pdfStream, password); 
outputStream = new MemoryStream(); 
stamper = new PdfStamper(reader, outputStream); 

AcroFields fields = stamper.AcroFields; 
fields.SetField("prefillField1", "Some text"); 
stamper.Close(); 
outputStream.Close(); 
reader.Close(); 
// outputStream sent to user/browser. PDF opens in Reader, but the form can be opened in 
// Acrobat without a password and edited. 

답변

1

암호로 보호 된 PDF는 편집 할 수 없습니다. 암호를 편집하려면 암호를 열어야합니다. 그것으로 당신은 그 문서의 복사본을 만들고 사용자에게 보여주고있는 것처럼 보입니다. 암호를 편집하여 PDF를 암호화 할 수 있습니다. 다음은 itextsharp와 함께 사용하는 것으로 발견 된 메소드의 복사본입니다. openPassword을 null로두고 editPassword을 설정하면 사용자가 PDF를보고 상호 작용할 수 있지만 설정 한 권한에 따라 편집 할 수는 없습니다. 희망이 도움이됩니다.

/// <summary> 
    /// Adds the given Open (User) and Edit (Owner) password to the PDF and optionally sets 
    /// the various Allow/Not Allowed restrictions 
    /// </summary> 
    /// <param name="openPassword">Open/User password</param> 
    /// <param name="editPassword">Edit/Owner password</param> 
    /// <param name="allowAssemply">Assembly means merging, extracting, etc the PDF pages</param> 
    /// <param name="allowCopy">Copy means right-click copying the content of the PDF to the system</param> 
    /// <param name="allowDegradedPrinting">Can print low quality version of the PDF</param> 
    /// <param name="allowFillIn">Can insert data into any AcroForms in the PDF</param> 
    /// <param name="allowModifyAnnotations">Modification of any annotations</param> 
    /// <param name="allowModifyContents">Modification of any content in the PDF</param> 
    /// <param name="allowPrinting">Allows printing at any quality level</param> 
    /// <param name="allowScreenReaders">Allows the content to be parsed/repurposed for screen readers</param> 
    public byte[] GetEncryptedPDF(byte[] pdf, 
     string openPassword, string editPassword, 
     bool allowAssemply, bool allowCopy, 
     bool allowDegradedPrinting, bool allowFillIn, 
     bool allowModifyAnnotations, bool allowModifyContents, 
     bool allowPrinting, bool allowScreenReaders) 
    { 
     int permissions = 0; 
     if (allowAssemply) 
      permissions = permissions | PdfWriter.ALLOW_ASSEMBLY; 
     if (allowCopy) 
      permissions = permissions | PdfWriter.ALLOW_COPY; 
     if (allowDegradedPrinting) 
      permissions = permissions | PdfWriter.ALLOW_DEGRADED_PRINTING; 
     if (allowFillIn) 
      permissions = permissions | PdfWriter.ALLOW_FILL_IN; 
     if (allowModifyAnnotations) 
      permissions = permissions | PdfWriter.ALLOW_MODIFY_ANNOTATIONS; 
     if (allowModifyContents) 
      permissions = permissions | PdfWriter.ALLOW_MODIFY_CONTENTS; 
     if (allowPrinting) 
      permissions = permissions | PdfWriter.ALLOW_PRINTING; 
     if (allowScreenReaders) 
      permissions = permissions | PdfWriter.ALLOW_SCREENREADERS; 

     PdfReader reader = new PdfReader(pdf); 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      PdfEncryptor.Encrypt(reader, memoryStream, true, openPassword, editPassword, permissions); 
      reader.Close(); 
      return memoryStream.ToArray(); 
     } 
    } 
+0

정확히 내가 조나단을 찾고 있습니다. 고맙습니다. –

관련 문제