嗨,我也尝试使用iText7 .Net签名后检查PDF文件是否被锁定。 我们当前的版本是:7.1.8
目前,我正在尝试一些代码,但这并不能满足我的研究要求:
try
{
//GET READER
PdfReader reader = new PdfReader(pdfModeleFile);
if (reader != null)
{
//GET DOCUMENT
PdfDocument pdfDoc = new PdfDocument(reader);
if (pdfDoc != null)
{
//GET FORM
PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, false);
int signState = form.GetSignatureFlags();
if (signState == 3)
{
//GET SIGNATURE
SignatureUtil signatureUtil = new SignatureUtil(pdfDoc);
List<string> signNamePdfAllField = signatureUtil.GetSignatureNames().ToList();
List<string> signNamePdfBlankField = signatureUtil.GetBlankSignatureNames().ToList();
SignaturePermissions perms = null;
if ((signNamePdfAllField.Count() > 0 && signNamePdfBlankField.Count() == 0)){
//SIGNATURE WAS OK (ALL SIGNATURE WAS PUT)
}
else {
//ONE OR MORE SIGNATURE WAS MISING
}
}
else
{
//SIGNATURE STATE OFF CURRENT PDF WAS NOT OK
}
}
else
{
//PDF FILE HAVE NOT FORM
}
}
else
{
//PDF FILE HAVE SOME PROBLEM
}
}
catch (Exception e)
{
//PDF FILE HAVE SOME PROBLEM
}
为便于解释,我正在搜索解决方案以获取此信息(例如pdf adobe reader):
先谢谢您。
答案 0 :(得分:1)
通过签名的 MDP (修改检测和阻止)信息表示签名后的文档锁定。 iText没有用于这些信息的显式吸气剂,但是您可以使用通用的低级吸气剂来访问它们。
例如以下代码显示PdfDocument pdfDocument
签名的MDP信息:
SignatureUtil signatureUtil = new SignatureUtil(pdfDocument);
foreach (string name in signatureUtil.GetSignatureNames())
{
Console.WriteLine("\nInspecting signature '{0}':", name);
PdfDictionary dict = signatureUtil.GetSignatureDictionary(name);
PdfArray referenceArray = dict.GetAsArray(PdfName.Reference);
if (referenceArray == null | referenceArray.Size() == 0)
{
Console.WriteLine("The signature does not apply a transform.");
continue;
}
foreach (PdfObject referenceArrayObject in referenceArray)
{
PdfObject referenceObject = referenceArrayObject;
if (referenceObject.IsIndirectReference())
referenceObject = ((PdfIndirectReference)referenceObject).GetRefersTo(true);
if (referenceObject.IsIndirectReference())
{
Console.WriteLine("A transform is too deeply nested.");
continue;
}
if (!referenceObject.IsDictionary())
{
Console.WriteLine("A transform is not a dictionary.");
continue;
}
PdfDictionary reference = (PdfDictionary)referenceObject;
PdfName method = reference.GetAsName(PdfName.TransformMethod);
if (method == null)
{
Console.WriteLine("The signature does not provide the name of its transform method. (Invalid!)");
continue;
}
if (new PdfName("UR").Equals(method))
{
Console.WriteLine("The signature is a usage rights signature.");
continue;
}
if (PdfName.DocMDP.Equals(method))
{
Console.WriteLine("The signature has a DocMDP transform method, it is a certification signature.");
}
else if (PdfName.FieldMDP.Equals(method))
{
Console.WriteLine("The signature has a FieldMDP transform method.");
}
else
{
Console.WriteLine("The signature has the unknown '{0}' transform method. (Invalid!)", method);
continue;
}
PdfDictionary transformParams = reference.GetAsDictionary(PdfName.TransformParams);
if (transformParams == null)
{
Console.WriteLine("The transform has no parameters. (Invalid!)");
continue;
}
PdfName action = transformParams.GetAsName(PdfName.Action);
if (action != null)
{
if (PdfName.All.Equals(action))
{
Console.WriteLine("The transform locks all form fields.");
}
else
{
PdfArray fields = transformParams.GetAsArray(PdfName.Fields);
if (PdfName.Include.Equals(action))
{
if (fields == null)
Console.WriteLine("The transform locks all listed form fields but does not provide the list. (Invalid!)");
else
Console.WriteLine("The transform locks all the listed form fields: {0}", fields);
}
else if (PdfName.Exclude.Equals(action))
{
if (fields == null)
Console.WriteLine("The transform locks all except listed form fields but does not provide the list. (Invalid!)");
else
Console.WriteLine("The transform locks all except the listed form fields: {0}", fields);
}
else
{
Console.WriteLine("The transform uses the unknown action '{0}' for field locking. (Invalid!)", action);
}
}
}
PdfNumber p = transformParams.GetAsNumber(PdfName.P);
if (p != null)
{
switch (p.IntValue())
{
case 1:
Console.WriteLine("The transform locks the document entirely.");
break;
case 2:
Console.WriteLine("The transform restricts document manipulation to at most filling in forms, instantiating page templates, and signing.");
break;
case 3:
Console.WriteLine("The transform restricts document manipulation to at most filling in forms, instantiating page templates, and signing, as well as annotation creation, deletion, and modification.");
break;
default:
Console.WriteLine("The transform access permissions value is unknown: {0}. (Invalid!)", p.IntValue());
break;
}
Console.WriteLine("In a PAdES or PDF-2 context, addition of validation related information and proofs of existence is additionally allowed.");
}
}
}
您似乎对 P 值"The transform locks the document entirely."
的{{1}}输出非常感兴趣。
有关背景,请研究PDF规范ISO 32000-1和ISO 32000-2以及对其的Adobe和ETSI扩展。
在CheckMdpTransformations测试1
中可以找到Java等效项。