Spire. Office 5.12.8已正式发布。该版本带来了很多新的功能,比如:Spire.Doc 支持获取两个 Word 文档之间比较出的差异;Spire.XLS 支持调整弯箭头的折线位置;Spire.PDF 支持了添加页面标签,以及支持通过外部服务进行数字签名并且支持设置PDF包中文件的字段并对文件进行排序等等。同时,该版本修复了大量问题。详情请阅读以下内容。
该版本涵盖了最新版的Spire.Doc, Spire.PDF, Spire.XLS, Spire.Presentation, Spire.Email, Spire.DocViewer, Spire.PDFViewer, Spire.Spreadsheet, Spire.OfficeViewer, Spire.DataExport, Spire.Barcode。
版本信息如下:
- Spire.Doc.dll v8.12.14
 - Spire.Pdf.dll v6.12.20
 - Spire.XLS.dll v10.12.0
 - Spire.Email.dll v3.9.1
 - Spire.DocViewer.Forms.dll v5.1.1
 - Spire.PdfViewer.Forms.dll v5.12.5
 - Spire.PdfViewer.Asp.dll v5.12.5
 - Spire.Presentation.dll v5.12.2
 - Spire.Spreadsheet v4.12.1
 - Spire.OfficeViewer.Forms.dll v5.12.8
 - Spire.Barcode.dll v4.11.0
 - Spire.DataExport.dll v4.1.9
 - Spire.DataExport.ResourceMgr.dll v2.1.0
 - Spire.License.dll v1.3.8
 
https://www.e-iceblue.cn/Downloads/Spire-Office-NET.html
Spire.Doc
新功能:
- 支持获取两个Word文档之间比较出的差异。
 - 支持获取修订的作者和时间。
 
Document doc1 = new Document();
doc1.LoadFromFile("C:/1.docx");
Document doc2 = new Document();
doc2.LoadFromFile("C:/2.docx");
doc1.Compare(doc2, "spire.support");
foreach (Section sec in doc1.Sections)
{
    foreach (DocumentObject docItem in sec.Body.ChildObjects)
    {
        if (docItem is Paragraph)
        {
            Paragraph para = docItem as Paragraph;
            if (para.IsInsertRevision)
            {
                EditRevision insRevison = para.InsertRevision;
                EditRevisionType insType = insRevison.Type;
                string insAuthor = insRevison.Author;
                DateTime insDateTime = insRevison.DateTime;
            }
            else if (para.IsDeleteRevision)
            {
                EditRevision delRevison = para.DeleteRevision;
                EditRevisionType delType = delRevison.Type;
                string delAuthor = delRevison.Author;
                DateTime delDateTime = delRevison.DateTime;
            }
            foreach (ParagraphBase paraItem in para.ChildObjects)
            {
                if (paraItem.IsInsertRevision)
                {
                    EditRevision insRevison = paraItem.InsertRevision;
                    EditRevisionType insType = insRevison.Type;
                    string insAuthor = insRevison.Author;
                    DateTime insDateTime = insRevison.DateTime;
                }
                else if (paraItem.IsDeleteRevision)
                {
                    EditRevision delRevison = paraItem.DeleteRevision;
                    EditRevisionType delType = delRevison.Type;
                    string delAuthor = delRevison.Author;
                    DateTime delDateTime = delRevison.DateTime;
                }
            }
        }
    }
}
//Get the difference about revisions
DifferRevisions differRevisions = new DifferRevisions(doc1);
doc1.SaveToFile("C:/result.docx", FileFormat.Docx);
问题修复:
- 修复了转换Word到PDF,字体被改变的问题。
 - 修复了转换Word到PDF多出方框的问题。
 - 修复了签名文档,程序抛“指定的算法无效”的问题。
 - 修复了转换Word到PDF,图片位置左移的问题。
 - 修复了转换HTML到Word,项目符号样式被改变的问题。
 - 修复了转换Word到PDF,表格数据错误的问题。
 - 修复了加载RTF,程序抛“System.InvalidOperationException”的问题。修复了转换Word到PDF,程序挂起的问题。
 - 修复了转换Word到PDF,内容重叠的问题。
 - 修复了转换Word到PDF,内容格式不正确的问题。
 - 修复了保存文档,一些书签丢失的问题。
 - 修复了在在书签位置插入目录域,调用UpdateTableOfContents()方法更新目录程序抛“未将对象引用设置到对象的实例”异常。
 - 修复了转换HTML到PDF,程序抛“System.Collections.Generic.KeyNotFoundException”的问题。
 - 修复了转换HTML到PDF,内容不一致的问题。
 - 修复了将Html内容填充到合并域时内容不正确的问题。
 - 修复了生成Word文档用MS Word打开数学公式存在问题。
 - 修复了克隆文档样式丢失的问题。
 - 修复了包含阿拉伯文字符的Word文件转换为PDF,部分文本不正确的问题。
 - 修复了转换doc到docx,数学公式变成图片的问题。
 - 修复生成的目录内容与大纲不一致的问题。
 - 修复了转换Word到PDF,字形“-”丢失的问题。
 - 修复了转换Word到PDF内容不一致的问题。
 
Spire.XLS
新功能:
- 支持调整弯箭头的折线位置。
 
GeomertyAdjustValue ad = line.ShapeAdjustValues.AddAdjustValue(GeomertyAdjustValueFormulaType.LiteralValue);
// x是中间点的位置,小于0时在左边点的左侧,等于0时与左边点位置相同,等于50在图形中间,等于100时与右边点位置相同,大于100将超出右边点。
ad.SetFormulaParameter(x);
问题修复:
- 修复了设置自适应行高后,结果文档行高不正确的问题。
 - 修复了转换XLS到XLSX后,文本框文本的字体被改变的问题。
 - 修复了保存文档程序挂起的问题。
 - 修复了创建的折线透视图不正确的问题。
 - 修复了保存图表到图片,内容不正确的问题。
 - 修复了转换XLS到PDF,内容不正确的问题。
 - 修复了获取到的趋势线公式不正确的问题。
 - 修复了WorkBook.GetOleSiz方法返回值不正确的问题。
 - 修复了转换XLS到PDF程序抛错误“未将对象引用设置到对象的实例”的问题。
 - 修复了调用CalculateAllValue方法计算公式值,结果不正确的问题。修复了拷贝sheet后内容被改变的问题。
 - 修复了转换CSV到PDF抛错误“The max length of the sheet name is 31”的问题。
 - 修复了添加线段位置不正确的问题。
 - 修复了重复两次加载保存文档后,结果文档打开提示内容错误的问题。
 
Spire.Spreadsheet
问题修复:
- 修复了加载Excel文档时,抛“System.ArgumentNullException”的问题。
 
Spire.PDF
优化:
- 支持嵌入所有使用的字体到已有的PDF
 
新功能:
- 支持了添加页面标签。
 
//当文档没有页面标签时
PdfDocument doc = new PdfDocument(inputFile);
doc.PageLabels = new PdfPageLabels();
doc.PageLabels.AddRange(0, PdfPageLabels.Decimal_Arabic_Numerals_Style, "label ");
doc.SaveToFile(outputPDF);
//当文档有页面标签时
PdfDocument doc = new PdfDocument(inputFile);
PdfPageLabels label = doc.PageLabels;
label.AddRange(2, PdfPageLabels.Decimal_Arabic_Numerals_Style, "new label ");
doc.SaveToFile(outputPDF);
PdfStandardsConverter converter = new PdfStandardsConverter("in.pdf");
converter.ToPdfX1A2001("out.pdf");
signature.ConfigureCustomGraphics(DrawGraphics);
private void DrawGraphics(PdfCanvas g)
{
   g.DrawString("Signed by:Tom", new PdfFont(PdfFontFamily.Helvetica, 12f), PdfBrushes.Red, new Rectangle(0, 0, 120, 20));
    string inputFile = "C:/image.png";
    PdfImage img = PdfImage.FromFile(inputFile);
    g.DrawImage(img, 0, 60, 150, 50);
}
  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到TIFF,annotation丢失的问题。
 - 修复了打印PDF文档图片丢失的问题。
 - 修复了在PdfGridCell里同时添加上标和括号时内容重叠的问题。
 - 修复了转换PDF到Excel时,内容不一致的问题
 - 修复了转换PDF到Excel时,样式不正确的问题
 - 修复了嵌套的Grid发生重叠的问题
 - 修复了给PDF加密后只能签一个数字签名的问题
 - 修复了用pdfdetach工具获取到的被添加的附件的名字不正确的问题
 - 修复了在Grid单元格里当设置靠右对齐时两个不同字号的内容重叠的问题
 - 修复了转换PDF到图片程序抛NullReferenceException的问题
 - 修复了获取页面时抛NullReferenceException的问题
 - 修复了打印PDF内容乱码的问题
 - 修复了设置Grid单元格的StringFormat格式引起上下标失效的问题
 - 修复了缩小Grid单元格行高后垂直居中不生效的问题
 - 修复了转换含附件的PDF到PDF/A-3b不符合规范的问题。
 - 修复了转换含动作的PDF到PDF/A不符合规范的问题。
 - 修复了获取书签时程序挂起的问题。
 - 调整了.NET Standard平台下的PdfTrueTypeFont类的初始化方法。
 - 修复了注释无法删除的问题。
 - 修复了添加上下标导致字符间距不正确的问题。
 - 修复了查找文本抛“NullReferenceException”的问题。
 - 修复了查找文本失败的问题。
 







