How to get exact page from .doc? - c#

So i have a .doc with many pages and i want to open a specific page within C#. Here is the code i'm using to view the doc
string docPath = #"...\path\to\doc.doc";
Microsoft.Office.Interop.Word.Application app = new
Microsoft.Office.Interop.Word.Application();
Document doc = app.Documents.Open(docPath);
string words = doc.Content.Text;
doc.Close();
app.Quit();

Related

C# .Net - Insert text in Bookmark without opening Word

I managed to insert a text in a Bookmark of a Word document using Microsoft.Office.Interop.Word.
using Microsoft.Office.Interop.Word;
using Application = Microsoft.Office.Interop.Word.Application;
using Range = Microsoft.Office.Interop.Word.Range;
Application app = new Microsoft.Office.Interop.Word.Application();
Document doc = app.Documents.Open(#"C:\wordDocument.docx");
string bookmark = "bookmarkName";
Bookmark bm = doc.Bookmarks[bookmark];
Range range = bm.Range;
range.Text = "Hello World";
doc.Bookmarks.Add(bookmark, range);
/* OR
doc.Bookmarks[bookmark].Select();
app.Selection.TypeText("Hello");
*/
The problem is this also opened the Word document. Can this be done without opening the document itself? Like its all happening in the background?
Try using the Save and Close function after updating the text of the Bookmark of your Word Document.
Add the below code after the doc.Bookmarks.Add(bookmark, range);.
doc.Save();
doc.Close();
EDIT:
If the computer is slow, the Word document might show within a second since you open it up. As hardcoregamer said, you can try to hide the object of Word.Application first before opening it.
using Microsoft.Office.Interop.Word;
using Application = Microsoft.Office.Interop.Word.Application;
using Range = Microsoft.Office.Interop.Word.Range;
Application app = new Microsoft.Office.Interop.Word.Application();
app.Visible = false; //Hide the Word.Application object.
Document doc = app.Documents.Open(#"C:\wordDocument.docx");
string bookmark = "bookmarkName";
Bookmark bm = doc.Bookmarks[bookmark];
Range range = bm.Range;
range.Text = "Hello World";
doc.Bookmarks.Add(bookmark, range);
doc.Save(); //save the document.
doc.Close(); //close the document.
app.Quit(); //close the Word.Application object. otherwise, you'll get a ReadOnly error later.

How to insert a page at the end of a document?

I am doing some VSTO development for Word using C#. I am having a hard time figuring out how to insert a page(a .docx file) at the end of my active document.
WORD._Application app = new WORD.Application();
WORD._Document doc = app.Documents.Open ... ;
WORD.Selection selection = app.Selection;
object breakType = WORD.WdBreakType.wdPageBreak;
selection.InsertBreak(ref breakType);

Write text in Word Document at specific location using c#

I am trying to modify a word document and inserting data at some specific positions( I have a template document which I must get it ready and fill all the blank spaces ).I am using Microsoft.Office.Interop.Word library and till now I just figure out how to insert text at the end of the document, I will write down the code too so maybe someone can help me out.Thanks!
private void button1_Click(object sender, EventArgs e)
string str = null;
OpenFileDialog dia = new OpenFileDialog();
if (dia.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
str = dia.FileName;
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document doc1 = app.Documents.Open(str);
object missing = System.Reflection.Missing.Value;
doc1.Content.Text += "Merge?";
app.Visible = true;
doc1.Save();
this.Close();
}
}
For sake of simplicity, first add the bookmark in MS Word as follow:
Select the region where you want to add the text, Then go to Insert > Bookmark in Word.
Then give the name to the bookmark as follow:
Then use the follow modified version of Ben:
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
Document doc = app.Documents.Open(Path.Combine(Environment.CurrentDirectory, "Report.doc"));
Dictionary<string, string> bookmarks = new Dictionary<string, string> { { "DateOfIssue", "23-06-2018"}, { "TotalNumOfPages", "20" } };
foreach (var bookmark in bookmarks)
{
Bookmark bm = doc.Bookmarks[bookmark.Key];
Range range = bm.Range;
range.Text = bookmark.Value;
doc.Bookmarks.Add(bookmark.Key, range);
}
Finally the output is as follow:
You can use the Range object to insert text at a specific position. msdn
doc1.Range(0, 0).Text = "Hello World";
If you have a template and the position to insert the text is always at the same location, you could also use Bookmark. msdn
[Update]
Here is a complete example to add text to a word document by a bookmark:
Application app = new Microsoft.Office.Interop.Word.Application();
Document doc = app.Documents.Open(#"your file");
string bookmark = "BookmarkName";
Bookmark bm = doc.Bookmarks[bookmark];
Range range = bm.Range;
range.Text = "Hello World";
doc.Bookmarks.Add(bookmark, range);
With this solution, the bookmark will not be deleted and you can add/modify it later again with the same piece of code.
You can use the following to insert a string into another string in a specific position.
doc1.Content.Text = doc1.Content.Text.Insert(10, "Merge?");
Source: https://msdn.microsoft.com/en-us/library/system.string.insert(v=vs.110).aspx

Word Export ASP.NET MVC Beginner

i'm new to ASP.NET MVC and tried to generate an export from Formdata to word file. That worked quite well, all the Bookmarks in the Document are filled correctly with following code:
string savePath = (#"U:\Coding ASP.MVC\WebForm Export into WordFile\Gutachten.docx");
string templatePath = (#"U:\Coding ASP.MVC\WebForm Export into WordFile\wordTemplate.docx");
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document doc = new Microsoft.Office.Interop.Word.Document();
doc = app.Documents.Open(templatePath);
doc.Activate();
if (doc.Bookmarks.Exists("FileNoSIS"))
{
doc.Bookmarks["FileNoSIS"].Range.Text = FileNoSIS;
}
if (doc.Bookmarks.Exists("NameOfAction"))
{
doc.Bookmarks["NameOfAction"].Range.Text = NameOfAction;
}
doc.SaveAs2(savePath);
app.Application.Quit();
Response.Write("Success");
But now i want to get the thing done with a stream to edit the document and offer the new filled document as a download. Can anybody here give me some advice or any tip how to get there?
Thx

Replace a bookmark in a Word document with the contents of another word document

I'm looking to replace a bookmark in a word document with the entire contents of another word document. I was hoping to do something along the lines of the following, but appending the xml does not seem to be enough as it does not include pictures.
using Word = Microsoft.Office.Interop.Word;
...
Word.Application wordApp = new Word.Application();
Word.Document doc = wordApp.Documents.Add(filename);
var bookmark = doc.Bookmarks.OfType<Bookmark>().First();
var doc2 = wordApp.Documents.Add(filename2);
bookmark.Range.InsertXML(doc2.Contents.XML);
The second document contains a few images and a few tables of text.
Update: Progress made by using XML, but still doesn't satisfy adding pictures as well.
You've jumped in deep.
If you're using the object model (bookmark.Range) and trying to insert a picture you can use the clipboard or bookmark.Range.InlineShapes.AddPicture(...). If you're trying to insert a whole document you can copy/paste the second document:
Object objUnit = Word.WdUnits.wdStory;
wordApp.Selection.EndKey(ref objUnit, ref oMissing);
wordApp.ActiveWindow.Selection.PasteAndFormat(Word.WdRecoveryType.wdPasteDefault);
If you're using XML there may be other problems, such as formatting, images, headers/footers not coming in correctly.
Depending on the task it may be better to use DocumentBuilder and OpenXML SDK. If you're writing a Word addin you can use the object API, it will likely perform the same, if you're processing documents without Word go with OpenXML SDK and DocumentBuilder. The issue with DocumentBuilder is if it doesn't work there aren't many work-arounds to try. It's open source not the cleanest piece of code if you try troubleshooting it.
You can do this with openxml SDK and Document builder. To outline here is what you will need
1> Inject insert key in main doc
public WmlDocument GetProcessedTemplate(string templatePath, string insertKey)
{
WmlDocument templateDoc = new WmlDocument(templatePath);
using (MemoryStream mem = new MemoryStream())
{
mem.Write(templateDoc.DocumentByteArray, 0, templateDoc.DocumentByteArray.Length);
using (WordprocessingDocument doc = WordprocessingDocument.Open([source], true))
{
XDocument xDoc = doc.MainDocumentPart.GetXDocument();
XElement bookMarkPara = [get bookmarkPara to replace];
bookMarkPara.ReplaceWith(new XElement(PtOpenXml.Insert, new XAttribute("Id", insertKey)));
doc.MainDocumentPart.PutXDocument();
}
templateDoc.DocumentByteArray = mem.ToArray();
}
return templateDoc;
}
2> Use document builder to merge
List<Source> documentSources = new List<Source>();
var insertKey = "INSERT_HERE_1";
var processedTemplate = GetProcessedTemplate([docPath], insertKey);
documentSources.Add(new Source(processedTemplate, true));
documentSources.Add(new Source(new WmlDocument([docToInsertFilePath]), insertKey));
DocumentBuilder.BuildDocument(documentSources, [outputFilePath]);

Categories