使用 Itext 7 填写 acro 字段后将可编辑 PDF 更改为不可编辑/只读

问题描述 投票:0回答:3

好的,我有这个 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 最新版本。 感谢提前。

c# asp.net pdf-generation itext7
3个回答
3
投票

因此,只需用您需要完成此操作的代码来回答这个问题就像@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


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);

0
投票

有两种方法可以解决这个问题。如果出于辅助目的需要保留 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.