使用 Interop.Word C# 将 doc 转换为 pdf

Converting doc to pdf using Interop.Word C#

我正在使用 C# 将 .doc 转换为 .pdf。 .doc 在供应商的网站上。要获取 .doc,我们必须单击一个按钮,该按钮会向我们提供 Open, Save, or Cancel 选项。当用户单击 Save 按钮时,它会提示输入位置。用户选择映射驱动器中的位置,例如 S:\Some Folder\abc.doc,实际文件夹位置是 \server\folder\Some Folder。这是我的程序发挥作用的地方。我在 c# 中使用 FileSystemWatcher class 并为 .doc 文件设置了过滤器。我可以在调试中看到文件已找到。文件夹位置被硬编码并保存为上述实际文件夹位置。用户和应用程序对该文件夹具有完全权限。但是,当我 运行 程序时,我得到 FileNotFoundException

这就是我的

        WriteToFile("Starting Word application");
        Application word = new Application();

        object missing = Type.Missing;

        var sourcefile = new FileInfo(path);

        // check if the created file ends with .doc. 
        System.Diagnostics.Debug.WriteLine(path);
        if (!path.ToLower().EndsWith(".doc"))
        {
            return "";
        }

        word.Visible = false;

        WriteToFile("Opening doc as read only");
        // open readonly            
        System.Diagnostics.Debug.WriteLine(sourcefile.FullName);
        var doc = word.Documents.Open(FileName: sourcefile.FullName, ReadOnly: true);

奇怪的是 sourcefile.FullName 没有显示 path 设置的硬编码服务器地址。它将文件路径显示为 S:\Some Folder\abc.doc,这对我来说毫无意义。这是怎么回事,为什么找不到文件?

我的猜测是您使用了错误的 FileInfo 对象。尝试生成一个新的或使用

System.IO.Path.Combine(@"\server\folder\Some Folder", "sourcefile.Name") 

您还可以使用它来生成新的 FileInfo 对象。您正在使用的对象可能是使用映射驱动器的用户对话框之一。您的位置也确实有错字。 \SERVERNAME\ 不是 UNC 路径。字符串的开头应该只有两个反斜杠。应该是

@"\server\folder\Some Folder"

WriteToFile("Starting Word application");
Application word = new Word.Application();

object missing = Type.Missing;

var sourcefile = new System.IO.FileInfo(path);
string SomeShare = @"\SomeServer\Someshare\Somepath";
System.IO.FileInfo WorkFile = new System.IO.FileInfo(System.IO.Path.Combine(SomeShare, sourcefile.Name));

// check if the created file ends with .doc. 
System.Diagnostics.Debug.WriteLine(path);
if (!path.ToLower().EndsWith(".doc"))
{
     return "";
}

word.Visible = false;

WriteToFile("Opening doc as read only");
// open readonly            
System.Diagnostics.Debug.WriteLine(sourcefile.FullName);
var doc = word.Documents.Open(FileName: WorkFile.FullName, ReadOnly: true);
}  

这对我来说很好用,它更新了正确的 UNC 模式的路径。如果文件仍然不可访问,您应该检查是否可以使用您生成的 UNC 路径在工作站上打开它。

当底层文件仍处于 use/being 写入状态时,OnCreate 事件可能会触发,如果您立即尝试访问它可能会导致问题。

简单的解决方案是引入任意延迟以允许文件被创建它的进程关闭,或者更好的是一个具有短暂延迟的循环,该循环尝试访问该文件,如果它捕获相关异常发生并重试。