【问题标题】:Prefill then lock预填充然后锁定
【发布时间】:2012-11-05 16:04:38
【问题描述】:

我们有一个 PDF 表单库,其中包含可填写的字段,可以在 Adob​​e Reader 中打开并由我们的最终用户填写。请注意,我们不生成 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.

【问题讨论】:

    标签: itextsharp


    【解决方案1】:

    如果 PDF 受密码保护,您将无法对其进行编辑。你会喜欢你必须用密码打开它来编辑它。这样看来,您正在创建该文档的副本并呈现给用户。您可以使用编辑密码加密 PDF。这是我发现与 itextsharp 一起使用的方法的副本。如果您设置editPassword 而将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();
            }
        }
    

    【讨论】:

    • 这正是我要找的乔纳森!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2020-02-19
    • 2023-04-02
    • 1970-01-01
    • 2014-05-28
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多