You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

653 lines
28 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Syncfusion.DocIO.DLS;
using Syncfusion.DocIO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Syncfusion.Calculate;
using Helper;
using System.Data;
using Model;
using System.Linq.Expressions;
using NLog;
using Syncfusion.XlsIO.Implementation.XmlSerialization;
using System.Security.Authentication.ExtendedProtection;
using System.Drawing;
using Syncfusion.XPS;
using System.Xml.Linq;
using System.Text.RegularExpressions;
using SkiaSharp;
using Syncfusion.DocToPDFConverter;
using Syncfusion.Pdf;
using System.Management.Instrumentation;
using Syncfusion.XlsIO.FormatParser.FormatTokens;
using System.Security.Policy;
using System.Buffers.Text;
using Syncfusion.XlsIO.Implementation.TemplateMarkers;
using System.Drawing.Printing;
using Syncfusion.XlsIO;
namespace DOCGEN.Klassen
{
public class SynFWord
{
public bool create_nativ(string property, string value, string base64, string originalfile, string destfile)
{
FileStream ms = new FileStream(originalfile, FileMode.Open, FileAccess.Read);
WordDocument document = new WordDocument();
document.Open(ms, FormatType.Automatic);
try {
document.CustomDocumentProperties.Add(property, value);
}
catch {
document.CustomDocumentProperties.Remove(property);
document.CustomDocumentProperties.Add(property, value);
}
document.Save(destfile);
ms.Close();
document.Dispose();
return true;
}
public string Generate_Word(string base64, clsDocData docdata)
{
string formattype = "";
MemoryStream ms = new MemoryStream(Helper.EncodeExtensions.DecodeBase642ByteArray(base64));
WordDocument document = new WordDocument(ms, FormatType.Doc);
formattype = document.ActualFormatType.ToString();
var formattype_original = document.ActualFormatType;
foreach (clsDocValue dv in docdata.DocValues)
{
if (dv.TMBeginn.ToString() != "" && dv.TMEnd.ToString() == "")
{
try
{
BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);
if ((dv.TMBeginn.ToString() == "TGEDKVornameNameLinksB99" || dv.TMBeginn.ToString() == "TGEDKVornameNameRechtsB99") && docdata.As_Faksimile == "True")
{
bookmarkNavigator.MoveToBookmark(dv.TMBeginn.ToString());
IWParagraph paragraph = new WParagraph(document);
paragraph.AppendBreak(BreakType.LineBreak);
System.Drawing.Image image = System.Drawing.Image.FromFile(@"x:\docdemo\unterschriften\kube1.png");
paragraph.AppendPicture(image);
paragraph.AppendBreak(BreakType.LineBreak);
paragraph.AppendText(dv.Value.ToString());
bookmarkNavigator.InsertParagraph(paragraph);
}
else
{
bookmarkNavigator.MoveToBookmark(dv.TMBeginn.ToString());
bookmarkNavigator.InsertText(dv.Value.ToString());
}
}
catch { }
}
if (dv.TMBeginn.ToString() != "" && dv.TMEnd.ToString() != "")
{
try
{
ReplaceBookmarkContent(ref document, dv.TMBeginn.ToString(), dv.TMEnd.ToString(), dv.Value.ToString());
}
catch { }
}
if (dv.FieldName.ToString() != "")
{
try
{
foreach (WSection section in document.Sections)
//Iterates through section child elements
foreach (WTextBody textBody in section.ChildEntities)
{
//Iterates through form fields
foreach (WFormField formField in textBody.FormFields)
{
if (formField.Name == dv.FieldName.ToString())
{
formField.Text = dv.Value.ToString();
break;
}
}
}
}
catch { }
}
}
if (docdata.As_Faksimile == "True")
{
TextSelection[] textSelections = document.FindAll("Thurgauer Kantonalbank", false, true);
foreach (TextSelection selection in textSelections)
{
WTextRange textRange = selection.GetAsOneRange();
WTextBody ownerTextBody = textRange.OwnerParagraph.OwnerTextBody;
//Get the index of the paragraph with specified text
int ownerParaIndex = ownerTextBody.ChildEntities.IndexOf(textRange.OwnerParagraph);
//Check whether the previous and next paragraphs are empty and remove them
if (ownerParaIndex > 0 && ownerTextBody.ChildEntities[ownerParaIndex - 1] is WParagraph &&
(ownerTextBody.ChildEntities[ownerParaIndex - 1] as WParagraph).Items.Count == 0)
{
ownerTextBody.ChildEntities.RemoveAt(ownerParaIndex - 1);
}
if (ownerParaIndex + 1 < ownerTextBody.ChildEntities.Count &&
ownerTextBody.ChildEntities[ownerParaIndex + 1] is WParagraph &&
(ownerTextBody.ChildEntities[ownerParaIndex + 1] as WParagraph).Items.Count == 0)
{
for (int i = 0; i < 4; i++)
{
try
{
ownerTextBody.ChildEntities.RemoveAt(ownerParaIndex + 1);
}
catch { }
}
}
}
}
foreach (clsDocMacro dm in docdata.DocMacros)
{
switch (dm.Name.ToUpper())
{
case "DOKUMENTSCHUETZEN":
document.Protect(ProtectionType.AllowOnlyFormFields, "Australia");
break;
default:
break;
}
if (dm.BookMark != "")
{
if (document.ProtectionType == ProtectionType.NoProtection)
{
WParagraph paragraph = document.Sections[0].Paragraphs[0] as WParagraph;
BookmarkStart bookmarkStart = new BookmarkStart(document, dm.BookMark);
paragraph.Items.Insert(0, bookmarkStart);
}
else
{
document.Protect(ProtectionType.NoProtection, "Australia");
WParagraph paragraph = document.Sections[0].Paragraphs[0] as WParagraph;
BookmarkStart bookmarkStart = new BookmarkStart(document, dm.BookMark);
BookmarkEnd bookmarkEnd = new BookmarkEnd(document, dm.BookMark);
paragraph.Items.Insert(0, bookmarkStart);
paragraph.Items.Insert(2, bookmarkEnd);
document.Protect(ProtectionType.AllowOnlyFormFields, "Australia");
}
}
}
if (docdata.Barcode == true)
{
Insert_Barcode(document, docdata);
}
//document.UpdateDocumentFields();
//document.UpdateAlternateChunks();
MemoryStream destms = new MemoryStream();
if (formattype_original.ToString().ToUpper() == "DOTMXXX")
{
document.Save(destms, FormatType.Docm);
}
else
{
document.Save(destms, formattype_original);
}
document.Close();
document.Dispose();
byte[] imageArray = destms.ToArray();
if (docdata.Result_as_PDF == "True")
{
DocGet getdoc = new DocGet("");
string destdoc = "";
destdoc = getdoc.Convert_Word_To_PDF(Convert.ToBase64String(imageArray));
return destdoc;
}
return Convert.ToBase64String(imageArray);
}
public static void ReplaceBookmarkText(ref WordDocument document, string bookmarkName, string textToFind, string textToReplace)
{
//Check whether the bookmark name is valid.
if (string.IsNullOrEmpty(bookmarkName) || document.Bookmarks.FindByName(bookmarkName) == null)
return;
//Move to the virtual cursor before the bookmark end location of the bookmark.
BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
bookmarksNavigator.MoveToBookmark(bookmarkName);
//Replace the bookmark content with new text.
TextBodyPart textBodyPart = bookmarksNavigator.GetBookmarkContent();
//Get paragraph from the textBody part.
foreach (TextBodyItem item in textBodyPart.BodyItems)
{
IterateTextBody(item, textToFind, textToReplace);
}
//Replace the bookmark content with text body part.
bookmarksNavigator.ReplaceBookmarkContent(textBodyPart);
}
public static void IterateTextBody(TextBodyItem item, string textToFind, string textToReplace)
{
switch (item.EntityType)
{
case EntityType.Paragraph:
WParagraph paragraph = (WParagraph)item;
//Replace a text in the bookmark content.
paragraph.Replace(new System.Text.RegularExpressions.Regex(textToFind), textToReplace);
break;
case EntityType.Table:
WTable table = (WTable)item;
foreach (WTableRow row in table.Rows)
{
foreach (WTableCell cell in row.Cells)
{
foreach (TextBodyItem bodyItem in cell.ChildEntities)
{
IterateTextBody(bodyItem, textToFind, textToReplace);
}
}
}
break;
case EntityType.BlockContentControl:
WTextBody body = (item as IBlockContentControl).TextBody;
foreach (TextBodyItem bodyitem in body.ChildEntities)
IterateTextBody(bodyitem, textToFind, textToReplace);
break;
}
}
public void ReplaceBookmarkContent(ref WordDocument document, String bookmark1, String bookmark2, String replacementContent)
{
//Temp Bookmark.
String tempBookmarkName = "tempBookmark";
#region Insert bookmark start after bookmark1.
//Get the bookmark instance by using FindByName method of BookmarkCollection with bookmark name.
Bookmark firstBookmark = document.Bookmarks.FindByName(bookmark1);
//Access the bookmark ends owner paragraph by using bookmark.
WParagraph firstBookmarkOwnerPara = firstBookmark.BookmarkEnd.OwnerParagraph;
//Get the index of bookmark end of bookmark1.
int index = firstBookmarkOwnerPara.Items.IndexOf(firstBookmark.BookmarkEnd);
//Create and add new bookmark start after bookmark1.
BookmarkStart newBookmarkStart = new BookmarkStart(document, tempBookmarkName);
firstBookmarkOwnerPara.ChildEntities.Insert(index + 1, newBookmarkStart);
#endregion
#region Insert bookmark end before bookmark2.
//Get the bookmark instance by using FindByName method of BookmarkCollection with bookmark name.
Bookmark secondBookmark = document.Bookmarks.FindByName(bookmark2);
//Access the bookmark starts owner paragraph by using bookmark.
WParagraph secondBookmarkOwnerPara = secondBookmark.BookmarkStart.OwnerParagraph;
//Get the index of bookmark start of bookmark2.
index = secondBookmarkOwnerPara.Items.IndexOf(secondBookmark.BookmarkStart);
//Create and add new bookmark end before bookmark2.
BookmarkEnd newBookmarkEnd = new BookmarkEnd(document, tempBookmarkName);
secondBookmarkOwnerPara.ChildEntities.Insert(index, newBookmarkEnd);
#endregion
#region Select bookmark content and replace.
//Create the bookmark navigator instance to access the newly created bookmark.
BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);
//Move the virtual cursor to the location of the temp bookmark.
bookmarkNavigator.MoveToBookmark(tempBookmarkName);
//Replace the bookmark content.
bookmarkNavigator.ReplaceBookmarkContent(replacementContent, true);
#endregion
#region Remove that temporary bookmark.
//Get the bookmark instance by using FindByName method of BookmarkCollection with bookmark name.
Bookmark bookmark = document.Bookmarks.FindByName(tempBookmarkName);
//Remove the temp bookmark named from Word document.
document.Bookmarks.Remove(bookmark);
#endregion
}
private void RemoveEmptyParagraph(IWSection curSection)
{
int j = 0;
int paraCount = 0;
while (j < curSection.Body.ChildEntities.Count)
{
//Read the section text body
WTextBody textBody = curSection.Body;
//Read all the body items collection
BodyItemCollection textbodycollection = textBody.ChildEntities as BodyItemCollection;
if (textbodycollection[j].EntityType == EntityType.Paragraph)
{
IWParagraph paragraph = textbodycollection[j] as IWParagraph;
if (paragraph.Items.Count == 0)
{
//Remove the empty paragraph to the Section
curSection.Paragraphs.RemoveAt(paraCount);
}
else
{
paraCount++;
j++;
}
}
else
{
j++;
}
}
}
private static Entity GetOwnerEntity(BookmarkStart bookmarkStart)
{
Entity baseEntity = bookmarkStart.Owner;
while (!(baseEntity is WSection))
{
if (baseEntity is null)
return baseEntity;
baseEntity = baseEntity.Owner;
}
return baseEntity;
}
public Image resizeImage(Image imgToResize, Size size)
{
return (Image)(new Bitmap(imgToResize, size));
}
private static void FindAndReplaceInTable(WTable table, TextSelection textSelection)
{
//Iterate through the rows of table.
foreach (WTableRow row in table.Rows)
{
//Iterate through the cells of rows.
foreach (WTableCell cell in row.Cells)
{
//Iterates through the items in cell.
foreach (Entity entity in cell.ChildEntities)
{
if (entity.EntityType == EntityType.Paragraph)
{
WParagraph paragraph = entity as WParagraph;
//Replace the specified regular expression with a TextSelection in the paragraph.
paragraph.Replace(new Regex("<<(.*)>>"), textSelection);
}
else if (entity.EntityType == EntityType.Table)
{
FindAndReplaceInTable(entity as WTable, textSelection);
}
}
}
}
}
public void Insert_Barcode(WordDocument document, clsDocData docData)
{
BarcodeLib.Barcode Barcode = new BarcodeLib.Barcode();
System.Drawing.Image barcodeimage = Barcode.Get_LinerBarcode(Barcoded.Symbology.I2of5C, docData.Dokumentid.Substring(9, 13), docData.Dokumentid.Substring(9, 13), "Below", "Arial", 8, 0);
//EDOKA_Barcode.EDOKABC bc = new EDOKA_Barcode.EDOKABC();
//System.Drawing.Image barcodeimage = bc.getimg("Interleaved 2 of 5 Mod 10", docData.Dokumentid.Substring(9,13), 190, 120);
// OFFEDK0002024002441185
//BarcodeSettings bs = new BarcodeSettings();
//bs.Type = BarCodeType.Interleaved25;
//bs.ShowBottomText = true;
//bs.ShowTopText = false;
//bs.BottomText = Documentid.Substring(9, 13); ;
//bs.Data = Documentid.Substring(9, 13);
////bs.ImageWidth = 200;
////bs.ImageHeight = 40;
//BarCodeGenerator bg = new BarCodeGenerator(bs);
//bg.GenerateImage().Save(@"h:\edoka_work\bc.jpg");
// FileStream imageStream = new FileStream(@"h:\edoka_work\bc.jpg", FileMode.Open, FileAccess.Read);
foreach (WSection section in document.Sections)
{
int bchor = 400;
int bcver = 700;
WPicture picture = new WPicture(document);
picture.LoadImage(barcodeimage);
picture.Height = 40;
picture.Width = 140;
picture.VerticalPosition = bcver;
picture.HorizontalPosition = bchor;
picture.HorizontalOrigin = HorizontalOrigin.Page;
picture.VerticalOrigin = VerticalOrigin.Margin;
picture.TextWrappingStyle = TextWrappingStyle.Square;
WPicture picture2 = new WPicture(document);
picture2.LoadImage(barcodeimage);
picture2.Height = 40;
picture2.Width = 140;
picture2.VerticalPosition = bcver;
picture2.HorizontalPosition = bchor;
picture2.HorizontalOrigin = HorizontalOrigin.Page;
picture2.VerticalOrigin = VerticalOrigin.Margin;
picture2.TextWrappingStyle = TextWrappingStyle.Square;
//Insert image in Header and Footer of section
section.HeadersFooters.Footer.AddParagraph().ChildEntities.Add(picture);
section.HeadersFooters.FirstPageFooter.AddParagraph().ChildEntities.Add(picture2);
}
}
/// <summary>Word to PDF-Konverter</summary>
/// <remarks>Das sind die Remarks</remarks>
/// <param name="dokument">Base64-Dokument</param>
public string DocToPDF(string dokument)
{
MemoryStream ms = new MemoryStream(Helper.EncodeExtensions.DecodeBase642ByteArray(dokument));
WordDocument document = new WordDocument(ms, FormatType.Automatic);
int i = 0;
//Iterate each section from Word document
foreach (WSection section in document.Sections)
{
//Create new Word document
WordDocument newDocument = new WordDocument();
//Add cloned section into new Word document
newDocument.Sections.Add(section.Clone());
//Saves the Word document to MemoryStream
FileStream outputStream = new FileStream(@"x:\T1.dotm", FileMode.OpenOrCreate, FileAccess.ReadWrite);
newDocument.Save(outputStream, FormatType.Dotm);
document.Sections.RemoveAt(i);
FileStream outputStream1 = new FileStream(@"x:\T2.dotm", FileMode.OpenOrCreate, FileAccess.ReadWrite);
document.Save(outputStream1, FormatType.Dotm);
newDocument.Close();
document.Close();
outputStream.Close();
outputStream1.Close();
i++;
}
return "";
//int cnt = document.Sections.Count;
//TextSelection textSelection = document.Find("Exemplar für", false, true);
//return dokument;
}
public int GetPageNumber(string text, WordDocument wd)
{
//DocToPDFConverter converter = new DocToPDFConverter();
//PdfDocument pdfDocument = converter.ConvertToPDF(wd);
//MemoryStream stream = new MemoryStream();
//pdfDocument.Save(stream);
//pdfDocument.Close(true);
//wd.Close();
//converter.Dispose();
//stream.Position = 0;
//FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
//stream.CopyTo(fileStream);
//fileStream.Close();
//PdfViewerControl documentViewer = new PdfViewerControl();
////Load the PDF document
//documentViewer.Load(stream);
////Get the occurrences of the target text and location.
//Dictionary<int, List<RectangleF>> textSearch = new Dictionary<int, List<RectangleF>>();
//bool IsMatchFound = documentViewer.FindText("Revision History", out textSearch);
//List<int> pageNumbers = null;
//if (IsMatchFound)
//{
// pageNumbers = GetPageNumebers(textSearch);
//}
//documentViewer.Dispose();
return 0;
}
public void Print_Word(string dokument)
{
MemoryStream ms = new MemoryStream(Helper.EncodeExtensions.DecodeBase642ByteArray(dokument));
WordDocument document = new WordDocument(ms, FormatType.Automatic);
document.UpdateDocumentFields();
int i = 0;
//Iterate each section from Word document
foreach (WSection section in document.Sections)
{
//Create new Word document
WordDocument newDocument = new WordDocument();
//Add cloned section into new Word document
newDocument.Sections.Add(section.Clone());
//Saves the Word document to MemoryStream
FileStream outputStream = new FileStream(@"x:\T1.dotm", FileMode.OpenOrCreate, FileAccess.ReadWrite);
newDocument.Save(outputStream, FormatType.Dotm);
document.Sections.RemoveAt(i);
FileStream outputStream1 = new FileStream(@"x:\T2.dotm", FileMode.OpenOrCreate, FileAccess.ReadWrite);
document.Save(outputStream1, FormatType.Dotm);
newDocument.Close();
document.Close();
outputStream.Close();
outputStream1.Close();
i++;
}
}
public void SplitDocument(ref WordDocument wordDocument, ref WordDocument target, int SectionNumber)
{
target.Sections.Add(wordDocument.Sections[SectionNumber].Clone());
}
public void SplitDocument_Part2(ref WordDocument wordDocument, ref WordDocument target, int SectionNumber)
{
int i = 0;
foreach (WSection section in wordDocument.Sections)
{
if (i != SectionNumber)
{
target.Sections.Add(wordDocument.Sections[i].Clone());
}
i = i + 1;
}
return;
WTextBody textBody = null;
for (int i1 = target.Sections.Count - 1; i >= 0; i--)
{
//Accesses the Body of section where all the contents in document are apart
textBody = target.Sections[i].Body;
//Removes the last empty page in the Word document
RemoveEmptyItems(textBody);
//Removes the empty sections in the document
if (textBody.ChildEntities.Count == 0)
{
int SectionIndex = target.ChildEntities.IndexOf(target.Sections[i]);
target.ChildEntities.RemoveAt(SectionIndex);
}
}
}
private void RemoveEmptyItems(WTextBody textBody)
{
//A flag to determine any renderable item found in the Word document.
bool IsRenderableItem = false;
//Iterates into textbody items.
for (int itemIndex = textBody.ChildEntities.Count - 1; itemIndex >= 0 && !IsRenderableItem; itemIndex--)
{
#region Removes last empty paragraph
//Checks item is empty paragraph and removes it.
if (textBody.ChildEntities[itemIndex] is WParagraph)
{
WParagraph paragraph = textBody.ChildEntities[itemIndex] as WParagraph;
//Iterates into paragraph
for (int pIndex = paragraph.Items.Count - 1; pIndex >= 0; pIndex--)
{
ParagraphItem paragraphItem = paragraph.Items[pIndex];
//Removes page breaks
if ((paragraphItem is Syncfusion.DocIO.DLS.Break && (paragraphItem as Syncfusion.DocIO.DLS.Break).BreakType == BreakType.PageBreak))
paragraph.Items.RemoveAt(pIndex);
//Check paragraph contains any renderable items.
else if (!(paragraphItem is BookmarkStart || paragraphItem is BookmarkEnd))
{
//Found renderable item and break the iteration.
IsRenderableItem = true;
break;
}
}
//Remove empty paragraph and the paragraph with bookmarks only
if (paragraph.Items.Count == 0 || !IsRenderableItem)
textBody.ChildEntities.RemoveAt(itemIndex);
}
#endregion
}
}
public void Replace_Text(ref WordDocument wordDocument, string TextToReplace, string NewText)
{
wordDocument.Replace(TextToReplace, NewText, true, true);
}
public void Replace_Fieldtext(ref WordDocument wordDocument, string fieldname, string newvalue)
{
try
{
foreach (WSection section in wordDocument.Sections)
//Iterates through section child elements
foreach (WTextBody textBody in section.ChildEntities)
{
//Iterates through form fields
foreach (WFormField formField in textBody.FormFields)
{
if (formField.Name == fieldname)
{
formField.Text = newvalue;
break;
}
}
}
}
catch { }
}
}
}