好的,所以我的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的最新版本。 谢谢你的进步。
答案 0 :(得分:1)
所以只需要使用代码回答这个问题你需要完成这个问题就像@mkl建议使用flatten:这是你能做的事情
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
答案 1 :(得分:0)
以下是我使用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);