这是一个需要密码才能打开的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);
}