可编辑的 PDF 到 Non-Editable/Read 只有在使用 Itext 7 填写 acro-fields 之后

editable PDF to Non-Editable/Read Only after filling in the acro-fields using Itext 7

好的,我有这个 PDF,它是一个可编辑的 PDF,需要像这样才能使用此代码填写 Acro-Fields:

   string src = @"C:\Test.pdf";
        string dest = @"C:\TestDone.pdf";
        PdfReader reader = new PdfReader(src);

        reader.SetUnethicalReading(true);
        PdfDocument pdfDoc = new PdfDocument(reader, new PdfWriter(dest)); PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);
        IDictionary<String, PdfFormField> fields = form.GetFormFields();
        PdfFormField toSet;
 fields.TryGetValue("Name", out toSet);
                toSet.SetValue(NameString);

问题是当它保存它的副本时,它仍然可以编辑,用户可以在获得 PDF 副本后轻松更改 vlues。有没有办法让我们在填写表格后保存不可编辑的 PDF 副本? 我环顾四周,很多人说在 PDF 上添加加密密码,但这不是我在这里使用的方法我需要它开放供员工使用,当客户获得副本时使其不可编辑我我正在使用最新版本的 iText7。 谢谢提前。

因此,只需使用完成此操作所需的代码来回答这个问题就像@mkl 建议的那样使用扁平化:这是你可以做的

string src = @"C:\Test.pdf";
string dest = @"C:\TestDone.pdf";

PdfReader reader = new PdfReader(src);
reader.SetUnethicalReading(true);
PdfDocument pdfDoc = new PdfDocument(reader, new PdfWriter(dest)); 

PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);
IDictionary<String, PdfFormField> fields = form.GetFormFields();
PdfFormField toSet;
fields.TryGetValue("Name", out toSet);
toSet.SetValue(NameString);

PdfAcroForm.GetAcroForm(pdfDoc, true).FlattenFields(); // Add this line 

这很容易做到,因为您可以在 iText 官方网站上看到这个答案:Flattening a form

下面是我使用 itext7 api 制作只读 PDF 的代码。一个文档可以设置两个密码,OwnerUser。您可以将用户密码保留为 null 这样任何用户都可以打开它而不受任何密码限制。 EncryptionConstantsclass有ALLOW_SCREENREADERALLOW_COPYALLOW_ASSEMBLY等多个字段可用于PDF权限限制

import com.itextpdf.kernel.pdf.PdfWriter;

import com.itextpdf.kernel.pdf.PdfDocument;

import com.itextpdf.kernel.pdf.EncryptionConstants;                                                                 

import com.itextpdf.kernel.pdf. WriterProperties;                                                                        

import com.itextpdf.layout.Document;

 

final String OWNER_PASSWORD = "Security";

ByteArrayOutputStream baos = new ByteArrayOutputStream();

WriterProperties wp = new WriterProperties();

wp.setStandardEncryption(null, OWNER_PASSWORD.getBytes(), EncryptionConstants.ALLOW_PRINTING,EncryptionConstants.DO_NOT_ENCRYPT_METADATA);

writer = new PdfWriter( baos, wp );

PdfDocument pdfDocument = new PdfDocument(writer);

Document document = new Document(pdfDocument);