Spire.PDF 6.12.20已发布。该版本支持通过外部服务进行数字签名并且支持设置PDF包中文件的字段并对文件进行排序。此外还增强了PDF转换到PDF/A 和PDF/A -3b的功能,以及修复了在查找文本中出现的问题。详情请阅读以下信息。
新功能:
- 支持通过外部服务进行数字签名。
void Sign()
{
PdfDocument doc = new PdfDocument();
doc.LoadFromFile(inputPath);
//Load the certificate
X509Certificate2 cert = new X509Certificate2(certPath, passwd);
CustomPKCS7SignatureFormatter customPKCS7SignatureFormatter = new CustomPKCS7SignatureFormatter(cert);
PdfSignature signature = new PdfSignature(doc, doc.Pages[0], customPKCS7SignatureFormatter, "signature0");
signature.Bounds = new RectangleF(new PointF(90, 550), new SizeF(270, 90));
//Set the dispay mode of graphics, if not set any, the default one will be applied
signature.GraphicsMode = GraphicMode.SignDetail;
signature.NameLabel = "Signer:";
signature.Name = "gary";
signature.ContactInfoLabel = "ContactInfo:";
signature.DateLabel = "Date:";
signature.Date = DateTime.Now;
signature.LocationInfoLabel = "Location:";
signature.LocationInfo = "Chengdu";
signature.ReasonLabel = "Reason: ";
signature.Reason = "The certificate of this document";
signature.DistinguishedNameLabel = "DN: ";
signature.DocumentPermissions = PdfCertificationFlags.AllowFormFill | PdfCertificationFlags.ForbidChanges;
signature.SignDetailsFont = new PdfFont(PdfFontFamily.TimesRoman, 10f);
signature.SignNameFont = new PdfFont(PdfFontFamily.Courier, 15);
signature.SignImageLayout = SignImageLayout.None;
//Save pdf file.
doc.SaveToFile(outputPath, Spire.Pdf.FileFormat.PDF);
}
class CustomPKCS7SignatureFormatter : IPdfSignatureFormatter
{
/// <summary>
/// If encapsulate is true, a copy of the message will be included in the signature.
/// </summary>
private bool m_encapsulate = true;
/// <summary>
/// The signing certificate.
/// </summary>
private X509Certificate2 m_certificate = null;
public Dictionary<String, Object> m_parameters = new Dictionary<string, object>();
/// <summary>
/// Parameters for the encoding of the signature.
/// 1.Key:Filter,String
/// Required
/// The name of the preferred signature handler to use when validating this signature.
/// 2.SubFilter,String
/// Required
/// A name that describes the encoding of the signature value.
/// PDF 1.6 defines the following values for public-key cryptographic signatures: adbe.x509.rsa_sha1, adbe.pkcs7.detached, and adbe.pkcs7.sha1
/// 3.Cert,X509Certificate2
/// Required when SubFilter is adbe.x509.rsa_sha1
/// </summary>
public Dictionary<String, Object> Parameters
{
get
{ return m_parameters; }
}
/// <summary>
/// Construct a new instance.
/// </summary>
/// <param name="certificate">The signing certificate.</param>
/// <param name="encapsulate">
/// If encapsulate is true, a copy of the message will be included in the signature.
/// </param>
public CustomPKCS7SignatureFormatter(X509Certificate2 certificate)
{
if (null == certificate)
{ throw new ArgumentNullException("certificate"); }
m_certificate = certificate;
Parameters.Add("Filter", "Adobe.PPKMS");
Parameters.Add("SubFilter", m_encapsulate ? "adbe.pkcs7.sha1" : "adbe.pkcs7.detached");
}
/// <summary>
/// Sign.
/// </summary>
/// <param name="content">The data that contains signature content.</param>
/// <returns>The signature</returns>
public byte[] Sign(byte[] content)
{
CmsSigner cmsSigner = new CmsSigner(m_certificate);
SHA1 sha1 = SHA1.Create();
SignedCms signedCms = new SignedCms(new ContentInfo(m_encapsulate ? sha1.ComputeHash(content) : content), !m_encapsulate);
signedCms.ComputeSignature(cmsSigner, true);
byte[] result = signedCms.Encode();
return result;
}
}
string[] files = Directory.GetFiles(@"files");
string inputFile = @"input.pdf";
string outputFile = @"result.pdf";
using (PdfDocument doc = new PdfDocument(inputFile))
{
//添加字段
doc.Collection.AddCustomField("No", "序号", Spire.Pdf.Collections.CustomFieldType.NumberField);
doc.Collection.AddFileRelatedField("FileName", "文件名称", Spire.Pdf.Collections.FileRelatedFieldType.FileName);
doc.Collection.AddFileRelatedField("Desc", "文件描述", Spire.Pdf.Collections.FileRelatedFieldType.Desc);
doc.Collection.AddFileRelatedField("CreateDate", "创建时间", Spire.Pdf.Collections.FileRelatedFieldType.CreationDate);
doc.Collection.AddFileRelatedField("ModDate", "修改时间", Spire.Pdf.Collections.FileRelatedFieldType.ModDate);
doc.Collection.AddFileRelatedField("FileSize", "文件大小", Spire.Pdf.Collections.FileRelatedFieldType.Size);
doc.Collection.AddCustomField("FileType", "文件类型", Spire.Pdf.Collections.CustomFieldType.TextField);
doc.Collection.AddCustomField("FileDate", "自定义时间", Spire.Pdf.Collections.CustomFieldType.DateField);
//根据字段对附件排序
doc.Collection.Sort(new string[] { "No", "fileName", "Desc", "CreateDate", "ModDate", "FileSize", "FileType", "FileDate" }, new bool[] { false, true, true, true, true, true, true, true });
for (int i = 0; i < files.Length; i++)
{
PdfAttachment attachment = new PdfAttachment(files[i]);
doc.Collection.AddAttachment(attachment);
}
int n = 1;
//设置字段值
foreach (PdfAttachment att in doc.Collection.AssociatedFiles)
{
att.SetFieldValue("No", n);
att.Description = n + "文件描述";
att.SetFieldValue("FileDate", DateTime.Today);
att.SetFieldValue("FileType", n + "文件");
n++;
}
doc.SaveToFile(outputFile, FileFormat.PDF);
doc.Dispose();
}
PdfDocument doc = new PdfDocument();
doc.LoadFromFile(inputPath);
PdfAttachment attachment = new PdfAttachment(attachmentPath);
doc.Attachments.Add(attachment,doc,Spire.Pdf.General.PdfAttachmentRelationship.Alternative);
doc.SaveToFile(outputPath);
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile(inputFile, FileFormat.PDF);
RectangleF rctg = new RectangleF(0, 0, 200, 100);
PdfTextFindCollection findCollection = pdf.Pages[0].FindText(rctg, "DEPOSIT", TextFindParameter.WholeWord);
PdfTextFindCollection findCollectionOut = pdf.Pages[0].FindText(rctg, "agreement", TextFindParameter.WholeWord);
foreach (PdfTextFind find in findCollection.Finds)
{ find.ApplyHighLight(Color.Green); }
foreach (PdfTextFind findOut in findCollectionOut.Finds)
{ findOut.ApplyHighLight(Color.Yellow); }
pdf.SaveToFile(outputFile, FileFormat.PDF);
问题修复:
- 修复了转换含附件的PDF到PDF/A-3b不符合规范的问题。
- 修复了转换含动作的PDF到PDF/A不符合规范的问题。
- 修复了获取书签时程序挂起的问题。
- 调整了.NET Standard平台下的PdfTrueTypeFont类的初始化方法。
- 修复了注释无法删除的问题。
- 修复了添加上下标导致字符间距不正确的问题。
- 修复了查找文本抛“NullReferenceException”的问题。
- 修复了查找文本失败的问题。
获取Spire.PDF 6.12.20,请点击: