2

入力可能なフィールドを含み、Adobe Readerで開いて、エンドユーザーが入力できるPDFフォームのライブラリがあります。PDFを生成するのではなく、単に既存のPDFを使用することに注意してください。これらのフォームはすべて、パスワードを使用してAcrobatの入力できないフィールドを編集することから保護されています。

問題は、コードでPDFを開いて一部のフィールドに事前入力すると、パスワード保護が失われ、提供されるフォームがAcrobatで編集可能になることです。

それで:

  1. PDFと結果の出力ストリームのロックを解除せずにiTextSharpを使用して入力可能なフィールドを事前入力する方法はありますか?
  2. エンドユーザーがパスワードを必要とせずに、リーダーで開いたり、入力可能なフィールドに入力したり、印刷したりできるようにしながら、フォームを再ロックする方法はありますか?

これは、現在使用しているコードの簡略化された例です。出力ストリームをロックしようとしましたが(コードは現在利用できません)、ファイルはリーダーにパスワードの入力を求められませんでした。

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.
4

1 に答える 1

2

パスワードで保護されているPDFを編集することはできません。あなたはそれを編集するためにパスワードでそれを開かなければならないことをしているようになります。これで、そのドキュメントのコピーを作成してユーザーに提示しているように見えます。編集パスワードを使用してPDFを暗号化できます。これは、私がitextsharpで使用していることがわかったメソッドのコピーです。editPasswordnullのままに時間を設定するとopenPassword、ユーザーは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();
        }
    }
于 2012-11-05T20:42:38.703 に答える