title: Creating a custom documentation application using Word and Visual Basic .NET
body: <p>I'm fairly new to Visual Studio (specifically Visual Basic .NET) but have been programming for quite a long time.</p>
  
  <p>Here at my company we have an Access application that allows users to create documents based on invoices that are in Great Plains, an accounting program.  Documents such as invoices, packing lists, export documentation, etc., etc.</p>
  
  <p>This application is very old and very hard to maintain so we're doing a rewrite and I've chosen this project to be my first Visual Basic .NET project.</p>
  
  <p>Basically what the application is going to do is allow users to do the following:</p>
  
  <ol>
  <li>Pull up invoice information and then add some secondary information such as comments and the like</li>
  <li>Choose which documents they want to print out</li>
  <li>Open the documents and then allow the user to edit the documents </li>
  </ol>
  
  <p>That last part is the tricky part.  The users right now create these documents out of Access and print to a PDF and then edit the PDF with comments that can be specific to the document and customer.  If they didn't have to do that, then I could just used canned reports or something.</p>
  
  <p>What I am thinking of doing is creating Word templates with text boxes and inside those text boxes adding addressable bookmarks.  When the user goes to print the documents, open Word, populate the bookmarks from the database (SQL Server) and then that will let them draw text boxes and fill them with whatever they want before they print the documents and then they can save them.</p>
  
  <p>Here's the code I worked out to do this (of course the final result will be much more complex):</p>
  
  <pre><code>Public Const wdPageBreak = 7
  
  Dim oWord As Word.Application
  Dim oDoc As Word.Document
  
  'Open recordset for rsInvoice
  
  oWord = CreateObject("Word.Application")
  
  oDoc = oWord.Documents.Add()
  oDoc.Application.Selection.Range.InsertFile("C:\document-c.dotx")
  oDoc.Application.Selection.Range.InsertBreak(wdPageBreak)
  
  oDoc.Application.Selection.Range.InsertFile("C:\document-b.dotx")
  oDoc.Application.Selection.Range.InsertBreak(wdPageBreak)
  
  oDoc.Application.Selection.Range.InsertFile("C:\document-a.dotx")
  
  oDoc.Bookmarks("document_a_invoice_number").Range.Text = rsInvoice("invoice_number")
  oDoc.Bookmarks("document_a_customer_number").Range.Text = rsInvoice("customer_number")
  ...
  etc.
  etc.
  ...
  oWord.Visible = True
  </code></pre>
  
  <p>So I guess the question I have is this the most appropriate way to approach this project or is there either a way programmatically or via a third party tool that I'm not aware of that would be easier and more efficient?</p>
  
  <p>Thanks in advance.</p>