好的,我有这个 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 副本后轻松更改值。有没有办法在填写表单后保存 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
类有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 表单,因此它不符合 ADA 标准或无法访问。这是一个重要的区别,在做出选择之前应该仔细考虑。
要展平表单,请使用此代码
PdfAcroForm.GetAcroForm(pdfDoc, true).FlattenFields();
或者将所有数据添加到表单字段后,您可以在最后展平表单
pdfFormFields.FlattenFields();
要使字段只读,请使用此代码或类似的代码
string[] fields = pdfFormFields.GetAllFormFields().Keys.ToArray();
foreach (var field in fields)
{
pdfFormFields.GetField(field).SetFieldFlag(PdfFormField.FF_READ_ONLY, true);
}