可编辑的 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 的代码。一个文档可以设置两个密码,Owner
和User
。您可以将用户密码保留为 null
这样任何用户都可以打开它而不受任何密码限制。 EncryptionConstants
class有ALLOW_SCREENREADER
、ALLOW_COPY
、ALLOW_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);
好的,我有这个 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 的代码。一个文档可以设置两个密码,Owner
和User
。您可以将用户密码保留为 null
这样任何用户都可以打开它而不受任何密码限制。 EncryptionConstants
class有ALLOW_SCREENREADER
、ALLOW_COPY
、ALLOW_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);