Created
          August 11, 2016 07:29 
        
      - 
      
- 
        Save mirjalal/d672b0f2d232b57066b38c0c4db35a64 to your computer and use it in GitHub Desktop. 
    Programmatically create Word document & save it as PDF document in C#
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | // before compiling the code please add the following library to your project references: | |
| // Microsoft Word 15.0 Object Library | |
| // in my case I'm using Office 2013 as well. | |
| // then add following line to your program: | |
| using Word = Microsoft.Office.Interop.Word; | |
| // make sure Word was not opened | |
| foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcesses()) | |
| { | |
| if (item.ProcessName == "WINWORD") | |
| item.Kill(); | |
| } | |
| object oMissing = System.Reflection.Missing.Value; | |
| object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */ | |
| //Start Word and create a new document. | |
| Word._Application oWord; | |
| Word._Document oDoc; | |
| oWord = new Word.Application(); | |
| oWord.Visible = false; | |
| oDoc = oWord.Documents.Add(ref oMissing, ref oMissing, | |
| ref oMissing, ref oMissing); | |
| //Insert a paragraph at the beginning of the document. | |
| Word.Paragraph oPara1; | |
| oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing); | |
| oPara1.Range.Text = "Heading 1"; | |
| oPara1.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; | |
| oPara1.Range.Font.Bold = 1; | |
| oPara1.Format.SpaceAfter = 24; //24 pt spacing after paragraph. | |
| oPara1.Range.InsertParagraphAfter(); | |
| //Insert a paragraph at the end of the document. | |
| Word.Paragraph oPara2; | |
| oPara1.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight; | |
| object oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range; | |
| oPara2 = oDoc.Content.Paragraphs.Add(ref oRng); | |
| oPara2.Range.Text = "Heading 2"; | |
| oPara2.Format.SpaceAfter = 6; | |
| oPara2.Range.InsertParagraphAfter(); | |
| //Insert another paragraph. | |
| Word.Paragraph oPara3; | |
| oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range; | |
| oPara3 = oDoc.Content.Paragraphs.Add(ref oRng); | |
| oPara1.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphJustify; | |
| oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:"; | |
| oPara3.Range.Font.Bold = 0; | |
| oPara3.Format.SpaceAfter = 24; | |
| oPara3.Range.InsertParagraphAfter(); | |
| //Insert a 3 x 5 table, fill it with data, and make the first row | |
| //bold and italic. | |
| Word.Table oTable; | |
| Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range; | |
| oTable = oDoc.Tables.Add(wrdRng, 3, 5, ref oMissing, ref oMissing); | |
| oTable.Range.ParagraphFormat.SpaceAfter = 6; | |
| int r, c; | |
| string strText; | |
| for (r = 1; r <= 3; r++) | |
| { | |
| for (c = 1; c <= 5; c++) | |
| { | |
| strText = "r" + r + "c" + c; | |
| oTable.Cell(r, c).Range.Text = strText; | |
| } | |
| } | |
| oTable.Rows[1].Range.Font.Bold = 1; | |
| oTable.Rows[1].Range.Font.Italic = 1; | |
| //Add some text after the table. | |
| Word.Paragraph oPara4; | |
| oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range; | |
| oPara4 = oDoc.Content.Paragraphs.Add(ref oRng); | |
| oPara4.Range.InsertParagraphBefore(); | |
| oPara4.Range.Text = "And here's another table:"; | |
| oPara4.Format.SpaceAfter = 24; | |
| oPara4.Range.InsertParagraphAfter(); | |
| //Insert a 5 x 2 table, fill it with data, and change the column widths. | |
| wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range; | |
| oTable = oDoc.Tables.Add(wrdRng, 5, 2, ref oMissing, ref oMissing); | |
| oTable.Range.ParagraphFormat.SpaceAfter = 6; | |
| for (r = 1; r <= 5; r++) | |
| { | |
| for (c = 1; c <= 2; c++) | |
| { | |
| strText = "r" + r + "c" + c; | |
| oTable.Cell(r, c).Range.Text = strText; | |
| } | |
| } | |
| oTable.Columns[1].Width = oWord.InchesToPoints(2); //Change width of columns 1 & 2 | |
| oTable.Columns[2].Width = oWord.InchesToPoints(3); | |
| //Keep inserting text. When you get to 7 inches from top of the | |
| //document, insert a hard page break. | |
| object oPos; | |
| double dPos = oWord.InchesToPoints(7); | |
| oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter(); | |
| do | |
| { | |
| wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range; | |
| wrdRng.ParagraphFormat.SpaceAfter = 6; | |
| wrdRng.InsertAfter("A line of text"); | |
| wrdRng.InsertParagraphAfter(); | |
| oPos = wrdRng.get_Information(Word.WdInformation.wdVerticalPositionRelativeToPage); | |
| } | |
| while (dPos >= Convert.ToDouble(oPos)); | |
| object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd; | |
| object oPageBreak = Word.WdBreakType.wdPageBreak; | |
| wrdRng.Collapse(ref oCollapseEnd); | |
| wrdRng.InsertBreak(ref oPageBreak); | |
| wrdRng.Collapse(ref oCollapseEnd); | |
| wrdRng.InsertAfter("We're now on page 2. Here's my chart:"); | |
| wrdRng.InsertParagraphAfter(); | |
| //Insert a chart. | |
| Word.InlineShape oShape; | |
| object oClassType = "MSGraph.Chart.8"; | |
| wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range; | |
| oShape = wrdRng.InlineShapes.AddOLEObject(ref oClassType, ref oMissing, | |
| ref oMissing, ref oMissing, ref oMissing, | |
| ref oMissing, ref oMissing, ref oMissing); | |
| //Demonstrate use of late bound oChart and oChartApp objects to | |
| //manipulate the chart object with MSGraph. | |
| object oChart; | |
| object oChartApp; | |
| oChart = oShape.OLEFormat.Object; | |
| oChartApp = oChart.GetType().InvokeMember("Application", System.Reflection.BindingFlags.GetProperty, null, oChart, null); | |
| //Change the chart type to Line. | |
| object[] Parameters = new object[1]; | |
| Parameters[0] = 4; //xlLine = 4 | |
| oChart.GetType().InvokeMember("ChartType", System.Reflection.BindingFlags.SetProperty, null, oChart, Parameters); | |
| //Update the chart image and quit MSGraph. | |
| oChartApp.GetType().InvokeMember("Update", System.Reflection.BindingFlags.InvokeMethod, null, oChartApp, null); | |
| oChartApp.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, oChartApp, null); | |
| //... If desired, you can proceed from here using the Microsoft Graph | |
| //Object model on the oChart and oChartApp objects to make additional | |
| //changes to the chart. | |
| //Set the width of the chart. | |
| oShape.Width = oWord.InchesToPoints(6.25f); | |
| oShape.Height = oWord.InchesToPoints(3.57f); | |
| //Add text after the chart. | |
| wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range; | |
| wrdRng.InsertParagraphAfter(); | |
| wrdRng.InsertAfter("THE END."); | |
| object sv2 = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/mydocAsPdf.pdf"; | |
| object fileFormat = Word.WdSaveFormat.wdFormatPDF; | |
| oDoc.SaveAs2(ref sv2, ref fileFormat); | |
| // oDoc.Close(); // if you want to get headache uncomment this :P | |
| oDoc = null; | |
| oWord.Quit(ref oMissing, ref oMissing, ref oMissing); | |
| oWord = null; | |
| // force quit from Word to prevent "Save As" dialog | |
| foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcesses()) | |
| { | |
| if (item.ProcessName == "WINWORD") | |
| item.Kill(); | |
| } | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment