我试着从几个word文档中创建很多PDF文档。不幸的是,我无法关闭/清理(垃圾收集)。因此内存消耗大量,最终程序转储。
这是我的密码。我希望你们聪明的人能引导我找到解决方案。
//**************************************************************
// Please notice:
//
// this.Files is an array with filepath and filenames e.g.:
// {"x:\doc\doc1.doc", "x:\doc\doc2.doc",...,"x:\doc\docn.doc"}.
//
// Please notice:
//**************************************************************
public void wordToPDF() {
string LS_fileName = "";
string LS_fileExtension = "";
string LS_PDF = ".pdf";
try
{
foreach (string Filename in this.Files)
{
LS_fileName = Path.GetFileName( Filename );
if (Path.GetExtension( Filename ) == ".doc" || Path.GetExtension( Filename ) == ".docx")
{
// Convert to PDF:
Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application();
wordDocument = appWord.Documents.Open(GlobalVar.TempFiles + LS_fileName);
LS_fileExtension = Path.GetExtension(Filename);
LS_fileName = LS_fileName.Replace( LS_fileExtension, LS_PDF ); int i = 0;
foreach (string value in this.Files)
{
if (value == Filename)
{
this.Files[i] = this.Files[i].Replace(LS_fileExtension, LS_PDF);
break;
}
i++;
}
wordDocument.ExportAsFixedFormat(GlobalVar.TempFiles + LS_fileName, MSWORD.WdExportFormat.wdExportFormatPDF);
System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);
}
}
}
catch (Exception ex)
{
Console.WriteLine("getFiles Hello I must be going.");
}
}
}//更新1:
public void wordToPDF() {
string LS_fileName = "";
string LS_fileExtension = "";
string LS_PDF = ".pdf";
int i = 0;
MSWORD.Application appWord = new MSWORD.Application();
try
{
foreach (string Filename in this.Files)
{
LS_fileName = Path.GetFileName( Filename );
if (Path.GetExtension( Filename ) == ".doc" || Path.GetExtension( Filename ) == ".docx")
{
// Convert to PDF:
wordDocument = appWord.Documents.Open(GlobalVar.TempFiles + LS_fileName);
LS_fileExtension = Path.GetExtension(Filename);
LS_fileName = LS_fileName.Replace( LS_fileExtension, LS_PDF );
i = 0;
foreach (string value in this.Files)
{
if (value == Filename)
{
this.Files[i] = this.Files[i].Replace(LS_fileExtension, LS_PDF);
break;
}
i++;
}
wordDocument.ExportAsFixedFormat(GlobalVar.TempFiles + LS_fileName, MSWORD.WdExportFormat.wdExportFormatPDF);
}
}
}
catch (Exception ex)
{
Console.WriteLine("getFiles Hello I must be going.");
System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);
wordDocument.Close();
if (appWord != null)
{
appWord.Quit();
appWord = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);
wordDocument.Close();
if (appWord != null)
{
appWord.Quit();
appWord = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}//更新2:
public void wordToPDF()
{
string LS_fileName = "";
string LS_fileExtension = "";
string LS_PDF = ".pdf";
object missingType = Type.Missing;
object SaveChanges = Type.Missing;
object OriginalFormat = Type.Missing;
object RouteDocument = Type.Missing;
MSWORD.Application appWord = new MSWORD.Application();
try
{
foreach (string Filename in this.Files)
{
LS_fileName = Path.GetFileName( Filename );
if (Path.GetExtension( Filename ) == ".doc" || Path.GetExtension( Filename ) == ".docx")
{
// Convert to PDF:
wordDocument = appWord.Documents.Open(GlobalVar.TempFiles + LS_fileName);
LS_fileExtension = Path.GetExtension(Filename);
LS_fileName = LS_fileName.Replace( LS_fileExtension, LS_PDF );
int i = 0;
foreach (string value in this.Files)
{
if (value == Filename)
{
this.Files[i] = this.Files[i].Replace(LS_fileExtension, LS_PDF);
break;
}
i++;
}
wordDocument.ExportAsFixedFormat(GlobalVar.TempFiles + LS_fileName, MSWORD.WdExportFormat.wdExportFormatPDF);
wordDocument.Close();
}
}
}
catch (Exception ex)
{
Console.WriteLine("getFiles Hello I must be going.");
System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);
if (appWord != null)
{
appWord.Quit();
appWord = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);
appWord.Quit(ref object SaveChanges = Type.Missing, ref object OriginalFormat);
if (appWord != null)
{
appWord = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
}发布于 2016-07-29 07:30:33
显然,退出winword应用程序不起作用。Hense应用了一种更基本的解决方案:
Process[] processes = Process.GetProcessesByName("winword");
foreach (var process in processes)
{
try
{
process.Kill();
}
catch (Exception)
{
// handle the exception...
}
}
// That solved the problem.
// Thanks for your help :-).发布于 2016-07-27 13:56:29
1)试着把这条线移出你的回路。(foreach (string Filename in this.Files))
Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application();2)在循环结束时关闭所有Documents (foreach (string Filename in this.Files)),这将关闭所有Word窗口,或者您可以保存保存文档的链接并关闭它。
编辑:
foreach (string Filename in this.Files)
{
LS_fileName = Path.GetFileName( Filename );
if (Path.GetExtension( Filename ) == ".doc" || Path.GetExtension( Filename ) == ".docx")
{
// Convert to PDF:
wordDocument = appWord.Documents.Open(GlobalVar.TempFiles + LS_fileName);
LS_fileExtension = Path.GetExtension(Filename);
LS_fileName = LS_fileName.Replace( LS_fileExtension, LS_PDF );
i = 0;
foreach (string value in this.Files)
{
if (value == Filename)
{
this.Files[i] = this.Files[i].Replace(LS_fileExtension, LS_PDF);
break;
}
i++;
}
wordDocument.ExportAsFixedFormat(GlobalVar.TempFiles + LS_fileName, MSWORD.WdExportFormat.wdExportFormatPDF);
wordDocument.Close(missing, missing, missing);
}
}描述:由于word模型,word是一个只有一个主体Microsoft.Office.Interop.Word.Application的应用程序--它包含所有在运行时打开的文档,这些文档看起来像一个独立的应用程序(windows),但它们不是。
发布于 2016-07-27 12:51:09
确保在释放COM对象之前关闭文档和应用程序,然后释放并可能强制使用GC.Collect()。
编辑:如果您多次使用word,只要启动word一次并打开文件进行pdf导出,然后逐个关闭即可。最后关闭wordApp。
Edit2:每次启动内环时,都应该将i重置为0。
https://stackoverflow.com/questions/38613260
复制相似问题