359 lines
12 KiB
C#
359 lines
12 KiB
C#
// ========================================================================
|
|
// Copyright 2006 - Volian Enterprises, Inc. All rights reserved.
|
|
// Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
|
|
// ------------------------------------------------------------------------
|
|
// $Workfile: $ $Revision: $
|
|
// $Author: $ $Date: $
|
|
//
|
|
// $History: $
|
|
// ========================================================================
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Windows.Forms;
|
|
using System.Data;
|
|
using System.Data.OleDb;
|
|
using System.Collections.Specialized;
|
|
using System.Collections.Generic;
|
|
using System.Xml;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using Volian.MSWord;
|
|
using VEPROMS.CSLA.Library;
|
|
using System.Threading;
|
|
|
|
namespace DataLoader
|
|
{
|
|
public partial class Loader
|
|
{
|
|
private void SaveSectionDocument(string fname, string stpseq, string stype, ref int cid, string sectName)
|
|
{
|
|
int docid = SaveWordDoc(fname, stype, sectName);
|
|
switch (docid)
|
|
{
|
|
case 0:
|
|
// could add the following back in - but many of these may be put out in the log, and
|
|
// don't supply any pertinent info.
|
|
//log.InfoFormat("Timing problem for save of word document, will retry. oldstepsequence = {0}", stpseq);
|
|
break;
|
|
case -1:
|
|
log.ErrorFormat("Could not complete save of word document, oldstepsequence = {0}", stpseq);
|
|
break;
|
|
default:
|
|
cid = docid;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private int SaveWordDoc(string fname, string title, string stype, ConfigInfo ci, string sectName, DateTime dtsutc)
|
|
{
|
|
int docid = 0;
|
|
if (System.IO.File.Exists(fname))
|
|
{
|
|
FileInfo myFile = new FileInfo(fname);
|
|
GC.Collect();
|
|
frmMain.AddInfo("Processing {0} {1}", fname, GC.GetTotalMemory(true));
|
|
//string tmpName = @"C:\Temp\DataLoader\" + myFile.Name.Replace(".", "_") + ".RTF";
|
|
string tmpName = Path.GetTempFileName();
|
|
string temppath = Path.GetTempFileName();
|
|
if (frmMain.MySettings.ExecutionMode == ExecutionMode.Production ||
|
|
frmMain.MySettings.ConvertTo == AccPageConversion.MSWord)
|
|
{
|
|
FileInfo tmpFile = new FileInfo(tmpName);
|
|
if (tmpFile.Exists)
|
|
tmpFile.Delete();
|
|
myFile.CopyTo(tmpName);
|
|
LoadAndSaveRichTextBox41(tmpName);
|
|
WordDocument wd = new WordDocument(tmpName, stype, temppath);
|
|
Thread myThread = new Thread(wd.GetAsciiFromWord);
|
|
myThread.Start();
|
|
myThread.Join(30000); // Wait 30 seconds to time-out
|
|
if (myThread.ThreadState == System.Threading.ThreadState.Running)
|
|
{
|
|
WordDoc.KillWordApps();
|
|
Thread.Sleep(1000);// Give the process a second to shutdown
|
|
frmMain.AddError("Could not open file '{0}'", fname);
|
|
docid = SaveDoc(fname, title, ci, "", dtsutc); // Save the original file
|
|
}
|
|
else
|
|
{
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
ci.AddItem("Printing", "Length", string.Format("{0:0.0000}", wd.DocLen));
|
|
docid = SaveDoc(temppath, title, ci, wd.ASCII, dtsutc);
|
|
DeleteFile(temppath);
|
|
DeleteFile(tmpName);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (frmMain.MySettings.ConvertTo == AccPageConversion.RichTextFormat)
|
|
docid = SaveDoc(fname, title, ci, "", dtsutc); // Need to get Ascii Text from RTF
|
|
}
|
|
}
|
|
else
|
|
frmMain.AddError("Missing rtf file: {0}", fname);
|
|
return docid;
|
|
}
|
|
private RichTextBox _MyRichTextBox = null;
|
|
public RichTextBox MyRichTextBox
|
|
{
|
|
get
|
|
{
|
|
if (_MyRichTextBox == null)
|
|
_MyRichTextBox = new RichTextBox();
|
|
return _MyRichTextBox;
|
|
}
|
|
}
|
|
private void LoadAndSaveRichTextBox(string tmpName)
|
|
{
|
|
string rtf = LoadFileRaw(tmpName);
|
|
// Parse for margins because the RTB will remove them
|
|
rtf = rtf.Replace("\x95", @"\bullet ");
|
|
Match match = Regex.Match(rtf, @"((\\marg[^\\]+)+)", RegexOptions.Singleline);
|
|
//rtf = rtf.Replace("\\sectd", "");
|
|
//rtf = rtf.Replace("\\sbkpage", "");
|
|
//rtf = rtf.Replace("\\sect", "\\page");
|
|
rtf = Regex.Replace(rtf, @"\\sectd(?=[ \\{])", "");
|
|
rtf = Regex.Replace(rtf, @"\\sbkpage(?=[ \\{])", "");
|
|
rtf = Regex.Replace(rtf, @"\\sect(?=[ \\{])", @"\page");
|
|
rtf = Regex.Replace(rtf, @"\\par(?=[ \\{])", @" <<par>>\par");
|
|
MyRichTextBox.Rtf = rtf; // Allow the RichTextBox to parse the RTF
|
|
rtf = MyRichTextBox.Rtf; // Get the RTF back from the RichTextBox
|
|
// Add the margins to the RTB output
|
|
rtf = Regex.Replace(rtf, @"( |\r\n)<<par>>\\par(?=[\r \\{])", @"\par");
|
|
rtf = Regex.Replace(rtf, @" <<par>>\\f. \\", @"\par\");
|
|
rtf = Regex.Replace(rtf, @" <<par>>", @"\par");
|
|
rtf = Regex.Replace(rtf, @"\\ansi(?=[ \\{])", @"\ansi" + match.Value);
|
|
//rtf = rtf.Replace(@"\ansi\", @"\ansi\" + match.Value);
|
|
// Save the modified rtf to the temporary file
|
|
SaveFile(rtf, tmpName);
|
|
}
|
|
private RichTextBox41 _MyRichTextBox41 = null;
|
|
public RichTextBox41 MyRichTextBox41
|
|
{
|
|
get
|
|
{
|
|
if (_MyRichTextBox41 == null)
|
|
_MyRichTextBox41 = new RichTextBox41();
|
|
return _MyRichTextBox41;
|
|
}
|
|
}
|
|
//private void LoadAndSaveRichTextBox41(string tmpName)
|
|
//{
|
|
// string rtf = LoadFileRaw(tmpName);
|
|
// // Parse for margins because the RTB will remove them
|
|
// rtf = rtf.Replace("\x95", @"\bullet ");
|
|
// Match match = Regex.Match(rtf, @"((\\marg[^\\]+)+)", RegexOptions.Singleline);
|
|
// rtf = Regex.Replace(rtf, @"(?<!\\[^ \\\r\n]*)\\sectd ", "");
|
|
// rtf = Regex.Replace(rtf, @"(?<!\\[^ \\\r\n]*)\\sbkpage ", "");
|
|
// rtf = Regex.Replace(rtf, @"\\sectd(?=[\\{])", "");
|
|
// rtf = Regex.Replace(rtf, @"\\sbkpage(?=[\\{])", "");
|
|
// rtf = Regex.Replace(rtf, @"\\sect(?=[ \\{])", @"\page");
|
|
// MyRichTextBox41.Rtf = rtf; // Allow the RichTextBox to parse the RTF
|
|
// rtf = MyRichTextBox41.Rtf; // Get the RTF back from the RichTextBox
|
|
// // Add the margins to the RTB output
|
|
// rtf = Regex.Replace(rtf, @"\\ansi(?=[ \\{])", @"\ansi" + match.Value);
|
|
// // Save the modified rtf to the temporary file
|
|
// SaveFile(rtf, tmpName);
|
|
//}
|
|
private void LoadAndSaveRichTextBox41(string tmpName)
|
|
{
|
|
string rtf = LoadFileRaw(tmpName);
|
|
rtf = StripTokensFromFontTable(rtf);
|
|
// Parse for margins because the RTB will remove them
|
|
rtf = rtf.Replace("\x95", @"\bullet ");// Bullet
|
|
rtf = rtf.Replace("\x93", @"\'93");// Left Double Quote
|
|
rtf = rtf.Replace("\x94", @"\'94");// Right Double Quote
|
|
rtf = rtf.Replace("\x96", @"\u8211?");//
|
|
rtf = rtf.Replace("\x89", @"\u8240?");//
|
|
rtf = rtf.Replace("\x92", @"\u8217?");//
|
|
rtf = rtf.Replace("\x84", @"\u8222?");//
|
|
rtf = rtf.Replace("\x85", @"\u8230?");//
|
|
rtf = rtf.Replace("\x97", @"\u8212?");//
|
|
rtf = rtf.Replace("\x9C", @"\u339?");//
|
|
rtf = rtf.Replace("\x98", @"\u732?");//
|
|
Match match = Regex.Match(rtf, @"((\\marg[^\\]+)+)", RegexOptions.Singleline);
|
|
rtf = Regex.Replace(rtf, @"(?<!\\[^ \\\r\n]*)\\sectd ", "");
|
|
rtf = Regex.Replace(rtf, @"(?<!\\[^ \\\r\n]*)\\sbkpage ", "");
|
|
rtf = Regex.Replace(rtf, @"\\sectd(?=[\\{])", "");
|
|
rtf = Regex.Replace(rtf, @"\\sbkpage(?=[\\{])", "");
|
|
rtf = Regex.Replace(rtf, @"\\sect(?=[ \\{\r])", @"\page");
|
|
MyRichTextBox41.Rtf = rtf; // Allow the RichTextBox to parse the RTF
|
|
rtf = MyRichTextBox41.Rtf; // Get the RTF back from the RichTextBox
|
|
// Add the margins to the RTB output
|
|
rtf = Regex.Replace(rtf, @"\\ansi(?=[ \\{])", @"\ansi" + match.Value);
|
|
// Save the modified rtf to the temporary file
|
|
SaveFile(rtf, tmpName);
|
|
}
|
|
private string _Prefix;
|
|
private string FixFontTableEntry(Match m)
|
|
{
|
|
string tableEntry = m.ToString();
|
|
if (tableEntry.Contains(@"\page "))
|
|
{
|
|
tableEntry = tableEntry.Replace(@"\page ", "");
|
|
_Prefix += "\x0C";
|
|
}
|
|
if (tableEntry.Contains(@"\column "))
|
|
{
|
|
tableEntry = tableEntry.Replace(@"\column ", "");
|
|
_Prefix += "\x0E";
|
|
}
|
|
if (tableEntry.Contains(@"\tab "))
|
|
{
|
|
tableEntry = tableEntry.Replace(@"\tab ", "");
|
|
_Prefix += "\x09";
|
|
}
|
|
return tableEntry;
|
|
}
|
|
private string StripTokensFromFontTable(string rtf)
|
|
{
|
|
_Prefix = "";
|
|
string rtfout = Regex.Replace(rtf, @"{\\f[0-9]+[^}]*}", new MatchEvaluator(FixFontTableEntry), RegexOptions.Singleline);
|
|
return rtfout;
|
|
}
|
|
private static void TryToShowMSWord(WordDoc myWordDoc)
|
|
{
|
|
try
|
|
{
|
|
if (MessageBox.Show("Word is having problems processing this file.\r\n\r\nDo you want to see?", "MS Word Failure", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
|
|
{
|
|
WordDoc.MyWordApp.Visible = true;
|
|
MessageBox.Show("Click on OK when you are done with MS Word", "Wait until done with MS Word", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message);
|
|
}
|
|
}
|
|
|
|
private static void CloseMSWord(WordDoc myWordDoc)
|
|
{
|
|
try
|
|
{
|
|
// RHM 20100628 - All of a sudden, this was null and would not work.
|
|
// I added the else clause so that the WinWord process would be terminated.
|
|
if (myWordDoc != null)
|
|
{
|
|
WordDoc.CloseApp();
|
|
Application.DoEvents();
|
|
while (WordDoc.WordProcesses.Length > 0)
|
|
Application.DoEvents();
|
|
}
|
|
else
|
|
{
|
|
WordDoc.KillWordApps();
|
|
Application.DoEvents();
|
|
while (WordDoc.WordProcesses.Length > 0)
|
|
Application.DoEvents();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message);
|
|
}
|
|
}
|
|
private static void DeleteFile(string fName)
|
|
{
|
|
if (File.Exists(fName))
|
|
File.Delete(fName);
|
|
}
|
|
private string LoadFileRaw(string fName)
|
|
{
|
|
try
|
|
{
|
|
FileInfo file = new FileInfo(fName);
|
|
byte[] myBytes = new byte[file.Length];
|
|
using (FileStream fs = file.OpenRead())
|
|
{
|
|
fs.Read(myBytes, 0, (int)file.Length);
|
|
fs.Close();
|
|
}
|
|
StringBuilder sb = new StringBuilder();
|
|
foreach (byte byt in myBytes)
|
|
{
|
|
int iByte = (int)byt;
|
|
sb.Append((char)byt);
|
|
}
|
|
return sb.ToString();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message);
|
|
Application.DoEvents();
|
|
return LoadFileRaw(fName);
|
|
}
|
|
}
|
|
private void SaveFile(string str, string fName)
|
|
{
|
|
FileInfo file = new FileInfo(fName);
|
|
using (StreamWriter sw = file.CreateText())
|
|
{
|
|
sw.Write(str);
|
|
sw.Close();
|
|
}
|
|
}
|
|
private int SaveWordDoc(string temppath, string stype, string sectName)
|
|
{
|
|
ConfigInfo ci = new ConfigInfo(null);
|
|
ci.AddItem("Edit", "Initialized", "true");
|
|
FileInfo myFile = new FileInfo(temppath);
|
|
ci.AddItem("History", "OriginalFileName", myFile.Name);
|
|
return SaveWordDoc(temppath, String.Empty, stype, ci, sectName, myFile.LastWriteTimeUtc);
|
|
}
|
|
private int SaveTheDoc(string temppath, string title, ConfigInfo ci, string ascii, DateTime dtsutc)
|
|
{
|
|
try
|
|
{
|
|
FileStream fs = File.Open(temppath, FileMode.Open, FileAccess.Read, FileShare.None);
|
|
long len = fs.Length + 1;
|
|
byte[] ByteArray = new byte[len];
|
|
int nBytesRead = fs.Read(ByteArray, 0, (int)len);
|
|
fs.Close();
|
|
string t1 = (title == null || title == "") ? null : title;
|
|
using (Document doc = Document.MakeDocument(t1, ByteArray, null, ci == null ? null : ci.ToString(), dtsutc, "Migration", ".Doc"))
|
|
{
|
|
FileInfo tmpFile = new FileInfo(temppath);
|
|
string docfile = temppath.Substring(0, temppath.LastIndexOf(".")) + @".doc";
|
|
if (File.Exists(docfile)) File.Delete(docfile);
|
|
FileInfo doctmpFile = tmpFile.CopyTo(docfile);
|
|
doc.DocAscii = ascii;
|
|
doc.Save();
|
|
File.Delete(docfile);
|
|
return doc.DocID;
|
|
}
|
|
}
|
|
// for an io exception, keep trying
|
|
catch (IOException exio)
|
|
{
|
|
Console.WriteLine("IO: {0} - {1}", exio.GetType().Name, exio.Message);
|
|
frmMain.AddError(exio, "SaveTheDoc('{0}','{1}')", temppath, title);
|
|
Wait(2);
|
|
return 0;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
log.Error("Save Word Doc");
|
|
log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
|
|
frmMain.AddError(ex, "SaveTheDoc('{0}','{1}')", temppath, title);
|
|
return -1;
|
|
}
|
|
|
|
}
|
|
private int SaveDoc(string temppath, string title, ConfigInfo ci, string ascii, DateTime dtsutc)
|
|
{
|
|
int done = 0;
|
|
int ntry = 0;
|
|
while (done == 0 && ntry < 4)
|
|
{
|
|
ntry++;
|
|
done = SaveTheDoc(temppath, title, ci, ascii, dtsutc);
|
|
}
|
|
return done;
|
|
}
|
|
}
|
|
}
|