当使用itextSharp5.5.10时,用户密码在RemoveField之后无效



这是一个需要密码才能打开的PDF文件,我添加了一个电子签名。在此之后,打开文件仍然需要密码。但在我使用AcroFields.RemoveField删除电子签名后,打开文件就不再需要密码了。这正常吗?打开PDF文件时如何保存密码?

测试pdfhttps://github.com/IYinxf/PDFs/blob/master/Encrypted.pdf

密码是11111111

代码

pdfReader = new PdfReader(strTempPath, Encoding.ASCII.GetBytes(strPassword));
if (!pdfReader.IsOpenedWithFullPermissions)
{
return ERR_PERMISSION_DENIED;
}
AcroFields af = pdfReader.AcroFields;
bool rv = af.RemoveField(fieldName);

根据负责保存加密信息的代码

if (reader.IsEncrypted() && (append || PdfReader.unethicalreading)) {
crypto = new PdfEncryption(reader.Decrypt);
}

(PdfStamperImp构造函数(

只有当您在附加模式下盖章或设置了unethicalreading标志时,才会发生这种情况。

当在附加模式下测试代码时,结果是该字段没有被删除。这是由于AcroFields字段删除代码没有正确地将PDF中正确更新的对象标记为使用了。当你手动做标记时,它工作得很好:

using (var pdfReader = new PdfReader(file, Encoding.ASCII.GetBytes(strPassword)))
using (FileStream output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output, '', true))
{
AcroFields af = pdfReader.AcroFields;
bool rv = af.RemoveField(fieldName);
pdfStamper.MarkUsed(pdfReader.Catalog);
for (int pageNo = 1; pageNo <= pdfReader.NumberOfPages; pageNo++)
{
pdfStamper.MarkUsed(pdfReader.GetPageN(pageNo));
}
}

unethicalreading标志设置为true的测试开箱即用:

PdfReader.unethicalreading = true;
using (var pdfReader = new PdfReader(file, Encoding.ASCII.GetBytes(strPassword)))
using (FileStream output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output))
{
AcroFields af = pdfReader.AcroFields;
bool rv = af.RemoveField(fieldName);
}

最新更新