using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Packaging;
using Microsoft.Office.DocumentFormat.OpenXml.Packaging;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Client;
using Word = DocumentFormat.OpenXml.Wordprocessing;
using ClientOM = Microsoft.SharePoint.Client;
using Microsoft.Office.Word.Server.Conversions;
using System.Threading;
namespace DocxImages
{
class Program
{
static string siteUrl = "http://na03:33669";
static void Main(string[] args)
{
using (SPSite spSite = new SPSite(siteUrl))
{
using (SPWeb spWeb = spSite.OpenWeb())
{
SPList DocList = spWeb.Lists["LibSignature"];
SPListItem doc_item = DocList.GetItemById(1);
SPFile doc_inputFile = doc_item.File;
string outputPath = string.Format(@"/{0}/{1}", DocList.RootFolder.Url, doc_inputFile.Name);
byte[] byteArray2 = doc_inputFile.OpenBinary();
DocxImageProcessor docxImageProcessor = new DocxImageProcessor();
docxImageProcessor.UpdateImagePlaceHolder("Signimage", byteArray2);
}
}
}
}
public class DocxImageProcessor
{
string outputPath1;
MemoryStream memOut = null;
string siteUrl = "http://na03:33669";
MainDocumentPart m_mainDocPart;
WordprocessingDocument m_wordProcessingDocument;
Package m_docxPackage;
XmlDocument m_mainXmlDocument;
PackagePart m_masterDocumentPart = null;
const string wordmlNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
const string imageRelType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
public DocxImageProcessor()
{
using (SPSite spSite = new SPSite(siteUrl))
{
using (SPWeb spWeb = spSite.OpenWeb())
{
SPList DocList = spWeb.Lists["MergeDocSig"];
SPListItem doc_item = DocList.GetItemById(50);
SPFile doc_inputFile = doc_item.File;
outputPath1 = string.Format(@"/{0}/{1}", DocList.RootFolder.Url, doc_inputFile.Name);
byte[] byteArray2 = doc_inputFile.OpenBinary();
// In-memory stream for our consolidated WSR DOCX.
memOut = new MemoryStream();
memOut.Write(byteArray2, 0, (int)byteArray2.Length);
// string docxPath = "template.docx";
m_wordProcessingDocument = WordprocessingDocument.Open(memOut, true);
m_mainDocPart = m_wordProcessingDocument.MainDocumentPart;
m_mainXmlDocument = DocxComponentsProvider.GetDocxXmlDocument(m_mainDocPart.GetStream());
m_masterDocumentPart = DocxComponentsProvider.GetMainDocumentPart(m_wordProcessingDocument);
m_docxPackage = m_wordProcessingDocument.Package;
}
}
}
public void UpdateImagePlaceHolder(string imagePlaceHolderTagName, byte[] m_imageInBytes)
{
string imageRelationshipId = GetImagePlaceHolderRelationShipId(imagePlaceHolderTagName);
if (imageRelationshipId != string.Empty)
{
//Look through the documents relationships to see if there is an image.
PackageRelationship imagePartRelation = m_masterDocumentPart.GetRelationship(imageRelationshipId);
if (imagePartRelation != null && imagePartRelation.RelationshipType == imageRelType)
{
Uri imageUri = PackUriHelper.ResolvePartUri(m_masterDocumentPart.Uri, imagePartRelation.TargetUri);
PackagePart masterImagePart = m_docxPackage.GetPart(imageUri);
if (masterImagePart != null)
{
using (Stream outputStream = masterImagePart.GetStream(FileMode.Open, FileAccess.Write))
{
outputStream.Write(m_imageInBytes, 0, m_imageInBytes.Length);
}
masterImagePart.Package.Flush();
}
}
}
m_docxPackage.Flush();
DocxImageProcessor obj = new DocxImageProcessor();
memOut.Seek(0, SeekOrigin.Begin);
ClientContext clientContext = new ClientContext(siteUrl);
ClientOM.File.SaveBinaryDirect(clientContext, obj.outputPath1, memOut, true);
#region MyRegion2
using (SPSite spSite = new SPSite(siteUrl))
{
using (SPWeb spWeb = spSite.OpenWeb())
{
string docPath = string.Format(@"{0}{1}", spSite.Url.Replace(@"\\", ""), obj.outputPath1);
string pdfPath = docPath.Replace(".docx", ".pdf");
ConversionJobSettings JobSettings = new ConversionJobSettings();
JobSettings.OutputFormat = SaveFormat.PDF;
JobSettings.OutputSaveBehavior = SaveBehavior.AlwaysOverwrite;
ConversionJob ConvJob = new ConversionJob("Word Automation Services", JobSettings);
ConvJob.UserToken = spSite.UserToken;
ConvJob.AddFile(docPath, pdfPath);
ConvJob.Start();
Console.WriteLine("Conversion job started");
ConversionJobStatus status = new ConversionJobStatus("Word Automation Services", ConvJob.JobId, null);
Console.WriteLine("Number of documents in conversion job: {0}", status.Count);
while (true)
{
Thread.Sleep(5000);
status = new ConversionJobStatus("Word Automation Services", ConvJob.JobId,
null);
if (status.Count == status.Succeeded + status.Failed)
{
Console.WriteLine("Completed, Successful: {0}, Failed: {1}", status.Succeeded, status.Failed);
break;
}
Console.WriteLine("In progress, Successful: {0}, Failed: {1}", status.Succeeded, status.Failed);
}
#endregion
}
}
}
private string GetImagePlaceHolderRelationShipId(string imagePlaceHolderTagName)
{
string searchString = StringUtil.GetConcatenatedString("//w:sdt//w:sdtPr//w:tag[@w:val='", imagePlaceHolderTagName,"']");
XPathNodeIterator xpathNodeIterator = XMLUtil.GetNodesUsingNameSpace(searchString, m_mainXmlDocument);
string imageRelationshipId = string.Empty;
if (xpathNodeIterator != null && xpathNodeIterator.Count > 0)
{
xpathNodeIterator.Current.MoveToParent();
xpathNodeIterator.Current.MoveToParent();
XPathNodeIterator xpathNodeIteratorForRelationShipId = xpathNodeIterator.Current.SelectDescendants(DocxWordXmlConstants.DOCX_DRAWINGML_BLIP,
DocxWordXmlConstants.DRAWINGMLNAMESPACE, false);
if (xpathNodeIteratorForRelationShipId != null || xpathNodeIteratorForRelationShipId.Count > 0)
{
while (xpathNodeIteratorForRelationShipId.MoveNext())
{
if (xpathNodeIteratorForRelationShipId.Current.Name == DocxWordXmlConstants.DOCX_DRAWINGML_PREFIX_BLIP)
{
xpathNodeIteratorForRelationShipId.Current.MoveToFirstAttribute();
imageRelationshipId = xpathNodeIteratorForRelationShipId.Current.Value;
break;
}
}
}
}
return imageRelationshipId;
}
}
internal class DocxComponentsProvider
{
public static PackagePart GetMainDocumentPart(WordprocessingDocument wordProcessingDoc)
{
//Get the main document part of the master docx (document.xml).
PackagePart masterDocumentPart = null;
foreach (PackageRelationship masterDocumentRelationship in GetPackageRelationshipsFromDocx(wordProcessingDoc, DocxWordXmlConstants.DOCUMENT_RELATIONSHIP))
{
Uri documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), masterDocumentRelationship.TargetUri);
masterDocumentPart = wordProcessingDoc.Package.GetPart(documentUri);
break;
}
return masterDocumentPart;
}
private static IEnumerable<PackageRelationship> GetPackageRelationshipsFromDocx(WordprocessingDocument wordDoc,
string relationshipType)
{
//e.g. relationshipType for document xml "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
foreach (PackageRelationship packageRelationship in wordDoc.Package.GetRelationshipsByType(relationshipType))
{
//yield Used in an iterator block to provide a value to the enumerator object or to signal the end of iteration.
yield return packageRelationship;
}
}
///<summary>
/// Returns the XmlDocument of the specified docx stream
///</summary>
///<history>
///</history>
///<usage>
///XmlDocument xmlDoc = XMLUtil.GetDocxXmlDocument (docxStream);
///</usage>
public static XmlDocument GetDocxXmlDocument(Stream docxStream)
{
XmlDocument mainXmlDocument = null;
if (docxStream == Stream.Null)
{
return mainXmlDocument;
}
//Create XML document and load the *.DOCX
mainXmlDocument = new XmlDocument();
mainXmlDocument.Load(docxStream);
return mainXmlDocument;
}
}
public class StringUtil
{
public static string GetConcatenatedString(params string[] stringArray)
{
StringBuilder stringBuilder = new StringBuilder();
foreach (string stringInArray in stringArray)
stringBuilder.Append(stringInArray);
return stringBuilder.ToString();
}
}
internal class XMLUtil
{
/// <summary>
/// This function returns the XPathNodeIterator containing the list of nodes satisfying the
/// criteria as specified in the searchString. Uses XPath.
/// </summary>
/// <param name="xPath"></param>
/// <param name="xmlDocument"></param>
/// <returns></returns>
public static XPathNodeIterator GetNodesUsingNameSpace(string searchString, XmlDocument xmlDocument)
{
if (xmlDocument == null || searchString.Length == 0)
return null;
XPathNodeIterator iterator = null;
XPathNavigator navigator = xmlDocument.CreateNavigator();
XPathExpression expression = navigator.Compile(searchString);
XmlNamespaceManager xmlNamespaceManager = XMLUtil.CreateXmlNamespaceManager();
iterator = navigator.Select(searchString, xmlNamespaceManager);
return iterator;
}
///<summary>
/// This function creates collection of name space URI's and prefixes which are beign used
///</summary>
///<history>
///</history>
public static XmlNamespaceManager CreateXmlNamespaceManager()
{
XmlNamespaceManager xmlNamespaceManager = null;
NameTable nameTable = new NameTable();
xmlNamespaceManager = new XmlNamespaceManager(nameTable);
xmlNamespaceManager.AddNamespace(DocxWordXmlConstants.DOCX_WORDML_PREFIX, DocxWordXmlConstants.WORDMLNAMESPACE);
xmlNamespaceManager.AddNamespace(DocxWordXmlConstants.DOCX_WORDPROCESSINGDRAWING_PREFIX, DocxWordXmlConstants.WORDPROCESSINGDRAWING);
xmlNamespaceManager.AddNamespace(DocxWordXmlConstants.DOCX_DRAWINGML_PREFIX, DocxWordXmlConstants.DRAWINGMLNAMESPACE);
xmlNamespaceManager.AddNamespace(DocxWordXmlConstants.DOCX_DRAWINGMLPICTURE_PREFIX, DocxWordXmlConstants.DRAWINGMLPICTURENAMESPACE);
xmlNamespaceManager.AddNamespace(DocxWordXmlConstants.DOCX_WORDML_RELATIONSHIP, DocxWordXmlConstants.RELATIONSHIPNAMESPACE);
xmlNamespaceManager.AddNamespace(DocxWordXmlConstants.DOCX_URN_SCHEMAS_MS_COM_VML, DocxWordXmlConstants.URN_SCHEMAS_MS_COM_VML);
xmlNamespaceManager.AddNamespace("ds", "http://schemas.openxmlformats.org/officedocument/2006/2/customXml");
return xmlNamespaceManager;
}
}
public class DocxWordXmlConstants
{
public const string WORDMLNAMESPACE = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
public const string OPENXMLPATH = "http://schemas.openxmlformats.org/officeDocument/";
public const string DRAWINGMLNAMESPACE = "http://schemas.openxmlformats.org/drawingml/2006/main";
public const string WORDPROCESSINGDRAWING = "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing";
public const string DRAWINGMLPICTURENAMESPACE = "http://schemas.openxmlformats.org/drawingml/2006/picture";
public const string RELATIONSHIPNAMESPACE = OPENXMLPATH + "2006/relationships";
public const string DOCUMENT_RELATIONSHIP = OPENXMLPATH + "2006/relationships/officeDocument";
public const string IMAGE_RELATIONSHIP = OPENXMLPATH + "2006/relationships/image";
public const string URN_SCHEMAS_MS_COM_VML = "urn:schemas-microsoft-com:vml";
//public const string IMAGE_CONTENT_TYPE = "image/png";
// public const string IMAGE_URI_STRING = "/word/media/";
public const string DOCX_WORDML_PREFIX = "w";
public const string DOCX_DRAWINGML_PREFIX = "a";
public const string DOCX_WORDPROCESSINGDRAWING_PREFIX = "wp";
public const string DOCX_DRAWINGMLPICTURE_PREFIX = "pic";
public const string DOCX_URN_SCHEMAS_MS_COM_VML = "v";
public const string DOCX_WORDML_BOLD = "b";
public const string DOCX_WORDML_ON = "on";
public const string DOCX_WORDML_XML = "xml";
public const string DOCX_WORDML_SPACE = "space";
public const string DOCX_WORDML_PRESERVE = "preserve";
public const string DOCX_WORDML_TYPE = "type";
public const string DOCX_WORDML_SHADE = "shd";
public const string DOCX_WORDML_ALIGNMENT = "jc";
public const string DOCX_WORDML_COLOR = "color";
public const string DOCX_WORDML_FILL = "fill";
public const string DOCX_WORDML_BACKGROUND_COLOR = "bgcolor";
public const string DOCX_WORDML_SIZE = "sz";
public const string DOCX_WORDML_AUXILIARY = "wx";
public const string DOCX_WORDML_TOP = "top";
public const string DOCX_WORDML_LEFT = "left";
public const string DOCX_WORDML_BOTTOM = "bottom";
public const string DOCX_WORDML_RIGHT = "right";
public const string DOCX_WORDML_SINGLE = "single";
public const string DOCX_WORDML_AUTO = "auto";
public const string DOCX_WORDML_CANTSPLIT = "cantSplit";
public const string DOCX_WORDML_VALIGN = "vAlign";
public const string DOCX_WORDML_VERTICAL_ALIGN = "vertAlign";
public const string DOCX_WORDML_SUPERSCRIPT = "superscript";
public const string DOCX_DRAWINGML_BLIP = "blip"; // Node which holds image relationship id
public const string DOCX_DRAWINGML_PREFIX_BLIP = DOCX_DRAWINGML_PREFIX + ":" + DOCX_DRAWINGML_BLIP;
// RELATIONSHIP
public const string DOCX_WORDML_RELATIONSHIP = "r";
public const string DOCX_WORDML_RELATIONSHIP_PROPERTY = "rPr";
public const string DOCX_RELATIONSHIP_EMBED = "embed";// Attribute which holds image relationship id
public const string DOCX_RELATIONSHIP_PREFIX_EMBED = DOCX_WORDML_RELATIONSHIP + ":" + DOCX_RELATIONSHIP_EMBED;
// BODY
public const string DOCX_WORDML_BODY = "body";
public const string DOCX_WORDML_PREFIX_BODY = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_BODY;
// BOOKMARK
public const string DOCX_WORDML_BOOKMARKSTART = "bookmarkStart";
public const string DOCX_WORDML_PREFIX_BOOKMARKSTART = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_BOOKMARKSTART;
// NAME
public const string DOCX_WORDML_NAME = "name";
public const string DOCX_WORDML_PREFIX_NAME = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_NAME;
// VAL
public const string DOCX_WORDML_VAL = "val";
public const string DOCX_WORDML_PREFIX_VAL = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_VAL;
public const string DOCX_WORDML_NUMPR = "numPr";
public const string DOCX_WORDML_PREFIX_NUMPR = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_NUMPR;
// TABLE
public const string DOCX_WORDML_TABLE = "tbl";
public const string DOCX_WORDML_TABLE_PROPERTY = "tblPr";
public const string DOCX_WORDML_TABLE_STYLE = "tblStyle";
public const string DOCX_WORDML_TABLE_LOOK = "tblLook";
public const string DOCX_WORDML_TABLE_WIDTH = "tblW";
public const string DOCX_WORDML_TABLE_INDENT = "tblInd";
public const string DOCX_WORDML_TABLE_LAYOUT = "tblLayout";
public const string DOCX_WORDML_TABLE_OVERLAP = "tblOverlap";
public const string DOCX_WORDML_TABLE_BORDERS = "tblBorders";
public const string DOCX_WORDML_TABLE_COLUMN_DEFINITIONS = "tblGrid";
public const string DOCX_WORDML_TABLE_COLUMN_WIDTH = "gridCol";
public const string DOCX_WORDML_TABLE_ROW = "tr";
public const string DOCX_WORDML_TABLE_ROW_PROPERTY = "trPr";
public const string DOCX_WORDML_TABLE_HEADER = "tblHeader";
public const string DOCX_WORDML_TABLE_CELL = "tc";
public const string DOCX_WORDML_TABLE_CELL_PROPERTY = "tcPr";
public const string DOCX_WORDML_TABLE_CELL_WIDTH = "tcW";
public const string DOCX_WORDML_PREFIX_TABLE = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_TABLE;
public const string DOCX_WORDML_PREFIX_RELATIONSHIP = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_RELATIONSHIP;
public const string DOCX_WORDML_TABLE_PROPERTY_TBLLOOK_VAL = "01E0";//The tblLook element contains a bitmask that specifies how rows are to be formatted. The hexadecimal value "01E0" is the result of summing the values for four options: header row formatting, last row formatting, header column formatting, and last column formatting.
// TEXT
public const string DOCX_WORDML_TEXT = "t";
public const string DOCX_WORDML_PREFIX_TEXT = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_TEXT;
// PARAGRAPH
public const string DOCX_WORDML_PARAGRAPH = "p";
public const string DOCX_WORDML_PREFIX_PARAGRAPH = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_PARAGRAPH;
public const string DOCX_WORDML_PARAGRAPH_PROPERTY = "pPr";
public const string DOCX_WORDML_PREFIX_PARAGRAPH_PROPERTY = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_PARAGRAPH_PROPERTY;
public const string DOCX_WORDML_PARAGRAPH_STYLE = "pStyle";
public const string DOCX_WORDML_PREFIX_PARAGRAPH_STYLE = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_PARAGRAPH_STYLE;
// BREAK
public const string DOCX_WORDML_BREAK = "br";
public const string DOCX_WORDML_PREFIX_BREAK = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_BREAK;
public const string DOCX_WORDML_BREAK_PROPERTY_TYPE = DOCX_WORDML_PREFIX + ":" + DOCX_WORDML_TYPE;
public const string DOCX_WORDML_BREAK_PROPERTY_VAL = "page";
public const string STATIC_REGION_BLOCK = "STATIC_REGION_BLOCK";
public const string STATIC_REGION_TAG = "STATIC_REGION_TAG";
public const string HTML_BOLD_START_TAG = "<b>";
public const string HTML_BOLD_END_TAG = "</b>";
public const string TABLE_COLUMN_ATTRIBUTE_NAME_WIDTH = "WIDTH";
public const string TABLE_COLUMN_ATTRIBUTE_NAME_FILL = "FILL";
public const string TABLE_COLUMN_ATTRIBUTE_NAME_STYLE = "STYLE";
public const string DOCX_WORDML_VERT_ALIGN = "vertAlign";
public const string DOCX_WORDML_VERT_ALIGN_SUPERSCRIPT = "superscript";
}
}