Wasserzeichen in ein Worddokument einzufügen ist über die Word Oberfläche kein Problem.
Seitenlayout >> Wasserzeichen >> Wasserzeichenvorlage auswählen … Feuer frei.
Wie lässt sich dieser Vorgang aber in Quellcode ausdrücken. Ähnlich wie bei allen Vorgängen, die mit Bildern (jedenfalls im weitesten Sinne mit Bildern) in Word zu tun haben, ist dieser Vorgang etwas aufwändiger. Zumindest ausgehend von der reinen Menge an zu schreibendem Quellcode.
Im folgenden ein Beispiel, wie ein Wasserzeichen einem Dokument hinzugefügt werden kann. Um etwas Platz zu sparen, habe ich mich in den ersten Methoden etwas knapper gehalten… ;-) Auf eine detaillierte Beschreibung aller Elemente möchte ich diesmal verzichten.
Der wirklich interessante Teil zum Hinzufügen eines Wasserzeichens befindet sich in der Methode CreateShape.
public class Watermark
{
public void AddToDocument(MainDocumentPart mainDocumentPart)
{
foreach (var header in mainDocumentPart.HeaderParts)
{
AddToHeader(header);
}
}
private void AddToHeader(HeaderPart part)
{
if (part.Header == null)
{
part.Header = new Header();
}
part.Header.Append(CreateSdtBlock());
part.Header.Save();
}
private SdtBlock CreateSdtBlock()
{
return new SdtBlock(new OpenXmlElement[] { CreateSdtProperties(), CreateSdtContentBlock() });
}
private SdtContentBlock CreateSdtContentBlock()
{
return new SdtContentBlock(CreateParagraph());
}
private Paragraph CreateParagraph()
{
return new Paragraph(new OpenXmlElement[] { CreateParagraphProperties(), CreateRun() });
}
private ParagraphProperties CreateParagraphProperties()
{
return new ParagraphProperties(new ParagraphStyleId { Val = "Header" });
}
private Run CreateRun()
{
return new Run(new OpenXmlElement[] { CreateRunProperties(), CreatePicture() });
}
private RunProperties CreateRunProperties()
{
var runProperties1 = new RunProperties();
var noProof1 = new NoProof();
var languages1 = new Languages { Val = "en-US", EastAsia = "zh-TW" };
runProperties1.Append(noProof1);
runProperties1.Append(languages1);
return runProperties1;
}
private SdtProperties CreateSdtProperties()
{
var sdtProperties1 = new SdtProperties();
var sdtId1 = new SdtId { Val = 285922954 };
var sdtContentDocPartObject1 = new SdtContentDocPartObject();
var docPartGallery1 = new DocPartGallery { Val = "Watermarks" };
var docPartUnique1 = new DocPartUnique();
sdtContentDocPartObject1.Append(docPartGallery1);
sdtContentDocPartObject1.Append(docPartUnique1);
sdtProperties1.Append(sdtId1);
sdtProperties1.Append(sdtContentDocPartObject1);
return sdtProperties1;
}
private Picture CreatePicture()
{
var picture1 = new Picture();
var shapetype1 = CreateShapetype();
var shape1 = CreateShape();
picture1.Append(shapetype1);
picture1.Append(shape1);
return picture1;
}
private Shape CreateShape()
{
var shape1 = new Shape { Id = "PowerPlusWaterMarkObject357476642", Style = "position:absolute;margin-left:0;margin-top:0;width:527.85pt;height:131.95pt;rotation:315;z-index:-251656192;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin", OptionalString = "_x0000_s3073", AllowInCell = false, FillColor = "silver", Stroked = false, Type = "#_x0000_t136" };
var fill1 = new Fill { Opacity = ".5" };
var textPath2 = new TextPath { Style = "font-family:\"Calibri\";font-size:1pt", String = "VERTRAULICH" };
var textWrap1 = new Wvml.TextWrap { AnchorX = Wvml.HorizontalAnchorValues.Margin, AnchorY = Wvml.VerticalAnchorValues.Margin };
shape1.Append(fill1);
shape1.Append(textPath2);
shape1.Append(textWrap1);
return shape1;
}
private Shapetype CreateShapetype()
{
var shapetype1 = new Shapetype { Id = "_x0000_t136", CoordinateSize = "21600,21600", OptionalNumber = 136, Adjustment = "10800", EdgePath = "m@7,l@8,m@5,21600l@6,21600e" };
var formulas1 = CreateFormulas();
var path1 = new Path { AllowTextPath = true, ConnectionPointType = Ovml.ConnectValues.Custom, ConnectionPoints = "@9,0;@10,10800;@11,21600;@12,10800", ConnectAngles = "270,180,90,0" };
var textPath1 = new TextPath { On = true, FitShape = true };
var handles1 = CreateHandles();
var lock1 = new Ovml.Lock { Extension = ExtensionHandlingBehaviorValues.Edit, TextLock = true, ShapeType = true };
shapetype1.Append(formulas1);
shapetype1.Append(path1);
shapetype1.Append(textPath1);
shapetype1.Append(handles1);
shapetype1.Append(lock1);
return shapetype1;
}
private Handles CreateHandles()
{
var handles1 = new Handles();
var handle1 = new Handle { Position = "#0,bottomRight", XRange = "6629,14971" };
handles1.Append(handle1);
return handles1;
}
private Formulas CreateFormulas()
{
var formulas1 = new Formulas();
var formula1 = new Formula { Equation = "sum #0 0 10800" };
var formula2 = new Formula { Equation = "prod #0 2 1" };
var formula3 = new Formula { Equation = "sum 21600 0 @1" };
var formula4 = new Formula { Equation = "sum 0 0 @2" };
var formula5 = new Formula { Equation = "sum 21600 0 @3" };
var formula6 = new Formula { Equation = "if @0 @3 0" };
var formula7 = new Formula { Equation = "if @0 21600 @1" };
var formula8 = new Formula { Equation = "if @0 0 @2" };
var formula9 = new Formula { Equation = "if @0 @4 21600" };
var formula10 = new Formula { Equation = "mid @5 @6" };
var formula11 = new Formula { Equation = "mid @8 @5" };
var formula12 = new Formula { Equation = "mid @7 @8" };
var formula13 = new Formula { Equation = "mid @6 @7" };
var formula14 = new Formula { Equation = "sum @6 0 @5" };
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);
formulas1.Append(formula13);
formulas1.Append(formula14);
return formulas1;
}
}
Alternativ kann anstelle eines Textes auch ein Bild als Wasserzeichen dem Dokument hinzugefügt werden. Dazu muss innerhalb des Picture Elements, genauer gesagt innerhalb des Elements Shape, der folgende Code eingefügt werden.
V.Shape shape = new V.Shape()
{
Id = "WordPictureWatermark289112470",
Style = "position:absolute;margin-left:0;margin-top:0;width:453.6pt;height:340.2pt;z-index:-251656192;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin",
OptionalString = "_x0000_s3076",
AllowInCell = false,
Type = "#_x0000_t75"
};
V.ImageData imageData = new V.ImageData
{
Gain = "19661f",
BlackLevel = "22938f",
Title = "show_bildCA5I22SA",
RelationshipId = "rId1"
};
shape.Append(imageData);
Statt eines Fill, Textpath und eines TextWrap Elements wird einfach ein ImageData hinzugefügt, dass allerdings zuvor als externe Referenz eingebunden werden muss.
Viel Spass beim selber machen! :-)
0 Kommentare:
Kommentar veröffentlichen