该代码包含一个函数AddSiganture()
与标签搜索一个ContentControl中 “topsoft”,并增加了一个SignatureLine
它。有关SignatureLine的更多信息可以在这里找到http://msdn.microsoft.com/en-us/library/documentformat.openxml.vml.office.signatureline.aspx 实际上,签名线是一个内部具有形状和形状类型的图片。此外,使用相应的ID将ImagePart添加到文档也非常重要。图像部分的ID必须对应于Picture对象内图像对象的RelationshipId
。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DocumentFormat.OpenXml.Packaging;
using Ap = DocumentFormat.OpenXml.ExtendedProperties;
using Vt = DocumentFormat.OpenXml.VariantTypes;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;
using V = DocumentFormat.OpenXml.Vml;
using Ovml = DocumentFormat.OpenXml.Vml.Office;
using Ds = DocumentFormat.OpenXml.CustomXmlDataProperties;
using A = DocumentFormat.OpenXml.Drawing;
using M = DocumentFormat.OpenXml.Math;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void button1_Click(object sender, EventArgs e)
{
using (WordprocessingDocument document = WordprocessingDocument.Open(@"C:\Users\Tigran\Documents\qw.docx", true))
{
AddSiganture(document, "Tigran Topchyan", "Head of Development", "[email protected]");
document.Close();
}
}
public void AddSiganture(WordprocessingDocument document, string signerName, string signerTitle, string signerEmail)
{
MainDocumentPart mainDocumentPart1 = document.MainDocumentPart;
string imagePartID = "ID_" + Guid.NewGuid().ToString("N");
string signatureID = Guid.NewGuid().ToString("B");
Picture picture1 = new Picture();
V.Shapetype shapetype1 = new V.Shapetype() { Id = "_x0000_t75", CoordinateSize = "21600,21600", Filled = false, Stroked = false, OptionalNumber = 75, PreferRelative = true, EdgePath = "[email protected]@[email protected]@[email protected]@[email protected]@5xe" };
V.Stroke stroke1 = new V.Stroke() { JoinStyle = V.StrokeJoinStyleValues.Miter };
V.Formulas formulas1 = new V.Formulas();
V.Formula formula1 = new V.Formula() { Equation = "if lineDrawn pixelLineWidth 0" };
V.Formula formula2 = new V.Formula() { Equation = "sum @0 1 0" };
V.Formula formula3 = new V.Formula() { Equation = "sum 0 0 @1" };
V.Formula formula4 = new V.Formula() { Equation = "prod @2 1 2" };
V.Formula formula5 = new V.Formula() { Equation = "prod @3 21600 pixelWidth" };
V.Formula formula6 = new V.Formula() { Equation = "prod @3 21600 pixelHeight" };
V.Formula formula7 = new V.Formula() { Equation = "sum @0 0 1" };
V.Formula formula8 = new V.Formula() { Equation = "prod @6 1 2" };
V.Formula formula9 = new V.Formula() { Equation = "prod @7 21600 pixelWidth" };
V.Formula formula10 = new V.Formula() { Equation = "sum @8 21600 0" };
V.Formula formula11 = new V.Formula() { Equation = "prod @7 21600 pixelHeight" };
V.Formula formula12 = new V.Formula() { Equation = "sum @10 21600 0" };
formulas1.Append(formula1);
formulas1.Append(formula2);
formulas1.Append(formula3);
formulas1.Append(formula4);
formulas1.Append(formula5);
formulas1.Append(formula6);
formulas1.Append(formula7);
formulas1.Append(formula8);
formulas1.Append(formula9);
formulas1.Append(formula10);
formulas1.Append(formula11);
formulas1.Append(formula12);
V.Path path1 = new V.Path() { AllowGradientShape = true, ConnectionPointType = Ovml.ConnectValues.Rectangle, AllowExtrusion = false };
Ovml.Lock lock1 = new Ovml.Lock() { Extension = V.ExtensionHandlingBehaviorValues.Edit, AspectRatio = true };
shapetype1.Append(stroke1);
shapetype1.Append(formulas1);
shapetype1.Append(path1);
shapetype1.Append(lock1);
V.Shape shape1 = new V.Shape()
{
Id = "_x0000_i1025",
Style = "width:192pt;height:96pt",
Alternate = "Microsoft Office Signature Line...",
Type = "#_x0000_t75"
};
V.ImageData imageData1 = new V.ImageData() { Title = "", RelationshipId = imagePartID };
Ovml.Lock lock2 = new Ovml.Lock()
{
Extension = V.ExtensionHandlingBehaviorValues.Edit,
Grouping = true, Ungrouping = true, Rotation = true, Cropping = true, Verticies = true, TextLock = true
};
Ovml.SignatureLine signatureLine1 = new Ovml.SignatureLine()
{
Extension = V.ExtensionHandlingBehaviorValues.Edit,
IsSignatureLine = true,
Id = signatureID,
ProviderId = "{00000000-0000-0000-0000-000000000000}",
SuggestedSigner = signerName,
SuggestedSigner2 = signerTitle,
SuggestedSignerEmail = signerEmail
};
shape1.Append(imageData1);
shape1.Append(lock2);
shape1.Append(signatureLine1);
picture1.Append(shapetype1);
picture1.Append(shape1);
var contentControls = mainDocumentPart1.Document.Descendants<SdtElement>();
foreach (SdtElement elem in contentControls)
{
if (elem.SdtProperties.GetFirstChild<Tag>().Val == "topsoft")
{
var content = elem.GetFirstChild<SdtContentBlock>();
content.RemoveAllChildren();
content.Append(picture1);
}
}
ImagePart imagePart1 = mainDocumentPart1.AddNewPart<ImagePart>("image/x-emf", imagePartID);
GenerateImagePartContent(imagePart1);
}
public void GenerateImagePartContent(ImagePart imagePart1)
{
System.IO.Stream data = GetBinaryDataStream(imagePart1Data);
imagePart1.FeedData(data);
data.Close();
}
#region Binary Data
public string imagePart1Data = "AQAAAGwAAAAAAAAAAAAAAP8AAAB/AAAAAAAAAAAAAABQIwAAoBEAACBFTUYAAAEAtBQAAIMAAAAFAAAAAAAAAAAAAAAAAAAAAAUAACADAADEAQAAGgEAAAAAAAAAAAAAAAAAAOPjBgBuTgQACgAAABAAAAAAAAAAAAAAAEsAAAAQAAAAAAAAAAUAAAAeAAAAGAAAAAAAAAAAAAAAAAEAAIAAAAAnAAAAGAAAAAEAAAAAAAAAAAAAAAAAAAAlAAAADAAAAAEAAABMAAAAZAAAAAAAAAAAAAAA/wAAAH8AAAAAAAAAAAAAAAABAACAAAAAIQDwAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAwAAAAAAACAKAAAAAwAAAABAAAAJwAAABgAAAABAAAAAAAAAP///wAAAAAAJQAAAAwAAAABAAAATAAAAGQAAAAAAAAAAAAAAP8AAAB/AAAAAAAAAAAAAAAAAQAAgAAAACEA8AAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAAMAAAAAAAAgCgAAAAMAAAAAQAAACcAAAAYAAAAAQAAAAAAAADw8PAAAAAAACUAAAAMAAAAAQAAAEwAAABkAAAAAAAAAAAAAAD/AAAAfwAAAAAAAAAAAAAAAAEAAIAAAAAhAPAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAADAAAAAAAAIAoAAAADAAAAAEAAAAnAAAAGAAAAAEAAAAAAAAA8PDwAAAAAAAlAAAADAAAAAEAAABMAAAAZAAAAAAAAAAAAAAA/wAAAH8AAAAAAAAAAAAAAAABAACAAAAAIQDwAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAwAAAAAAACAKAAAAAwAAAABAAAAJwAAABgAAAABAAAAAAAAAPDw8AAAAAAAJQAAAAwAAAABAAAATAAAAGQAAAAAAAAAAAAAAP8AAAB/AAAAAAAAAAAAAAAAAQAAgAAAACEA8AAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAAMAAAAAAAAgCgAAAAMAAAAAQAAACcAAAAYAAAAAQAAAAAAAADw8PAAAAAAACUAAAAMAAAAAQAAAEwAAABkAAAAAAAAAAAAAAD/AAAAfwAAAAAAAAAAAAAAAAEAAIAAAAAhAPAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAADAAAAAAAAIAoAAAADAAAAAEAAAAnAAAAGAAAAAEAAAAAAAAA////AAAAAAAlAAAADAAAAAEAAABMAAAAZAAAAAAAAAAAAAAA/wAAAH8AAAAAAAAAAAAAAAABAACAAAAAIQDwAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAwAAAAAAACAKAAAAAwAAAABAAAAJwAAABgAAAABAAAAAAAAAP///wAAAAAAJQAAAAwAAAABAAAATAAAAGQAAAAAAAAAAAAAAP8AAAB/AAAAAAAAAAAAAAAAAQAAgAAAACEA8AAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAAMAAAAAAAAgCgAAAAMAAAAAQAAACcAAAAYAAAAAQAAAAAAAAD///8AAAAAACUAAAAMAAAAAQAAAEwAAABkAAAAAAAAAAMAAAD/AAAAEgAAAAAAAAADAAAAAAEAABAAAAAhAPAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAADAAAAAAAAIAoAAAADAAAAAEAAAAnAAAAGAAAAAEAAAAAAAAAAAAAAAAAAAAlAAAADAAAAAEAAABMAAAAZAAAAAAAAAAAAAAA//////////8AAAAAFgAAAAAAAAA1AAAAIQDwAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAwAAAAAAACAKAAAAAwAAAABAAAAJwAAABgAAAABAAAAAAAAAAAAAAAAAAAAJQAAAAwAAAABAAAATAAAAGQAAAAAAAAAAAAAAP//////////AAAAABYAAAAAAQAAAAAAACEA8AAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAAMAAAAAAAAgCgAAAAMAAAAAQAAACcAAAAYAAAAAQAAAAAAAAAAAAAAAAAAACUAAAAMAAAAAQAAAEwAAABkAAAAAAAAAAAAAAD//////////wABAAAWAAAAAAAAADUAAAAhAPAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAADAAAAAAAAIAoAAAADAAAAAEAAAAnAAAAGAAAAAEAAAAAAAAAAAAAAAAAAAAlAAAADAAAAAEAAABMAAAAZAAAAAAAAABLAAAA/wAAAEwAAAAAAAAASwAAAAABAAACAAAAIQDwAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAwAAAAAAACAKAAAAAwAAAABAAAAJwAAABgAAAABAAAAAAAAAP///wAAAAAAJQAAAAwAAAABAAAATAAAAGQAAAAAAAAAFgAAAP8AAABKAAAAAAAAABYAAAAAAQAANQAAACEA8AAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAAMAAAAAAAAgCgAAAAMAAAAAQAAACcAAAAYAAAAAQAAAAAAAAD///8AAAAAACUAAAAMAAAAAQAAAEwAAABkAAAACQAAACcAAAAfAAAASgAAAAkAAAAnAAAAFwAAACQAAAAhAPAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAADAAAAAAAAIAoAAAADAAAAAEAAABSAAAAcAEAAAEAAADg////AAAAAAAAAAAAAAAAkAEAAAAAAAEAAAAAYQByAGkAYQBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8eC8AAAAAAAAAAAAAAAAAyPEJ1/4HAADI8QnX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";
public System.IO.Stream GetBinaryDataStream(string base64String)
{
return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String));
}
#endregion
}
}