3

Solidworks 生成“EDRWX”文件。通常,这些是使用Microsoft XPS 查看器 打开的。

问题:
应用程序使用 .net XPSDocument 打开它们并在打印前对它们进行一些操作。错误方法是“GetFixedDocumentSequence”。它返回 null 以及从特定计算机生成的文件。即使应用程序在特定计算机上运行,​​它也会这样做。但它适用于其他计算机生成的文件。

在此处输入图像描述

尝试使用 XPS 文档查看器打开文件时,无法打开,说无法打开。但是,它会在创建它的特定计算机上打开。如果这台电脑从 microsoft word 打印一个普通的 XPS 文件,其他电脑可以用 XPS 文档查看器正常打开它。此外,其他计算机生成的“EDRWX”文件可以在包括特定计算机在内的每台计算机上使用 XPS 文档查看器轻松打开。

更多规范:
具体电脑运行windows 8.1。
其他计算机在 Windows 7 下运行。
该应用程序使用 .net Framework 4.0 运行。

是特定计算机生成的“EDRWX”虚拟文件。
是由其他计算机之一生成的“EDRWX”虚拟文件。

问题的原因是什么?如何解决?

旁注:我已经调查了将近 3 天......所以我对这个问题很生气。可能是你的眼睛能看到我因为被吸了这么多而再也看不到的东西了。

在我的挖掘中,我发现了这两个文件之间的差异。 在此处输入图像描述

4

2 回答 2

2

失败的 EDRWX 文件不是 XPS 文件,它们是 Open XPS 文件。这两种格式非常相似,但是正如您所发现的,XPSDocument 不支持 OpenXPS。我不知道有任何直接支持 Open XPS 的 .net API,但是微软确实发布了您可以利用的独立转换器工具。

另一种可能有效也可能无效的替代方法是尝试强制 SolidWorks 在故障机器上生成 xps 而不是 oxps。solidworks 可能正在使用 xps 文档编写器生成这些文件,在这种情况下,按照此处所述更改输出格式可能会解决问题。

于 2016-02-16T18:29:20.397 回答
1

就像乔恩指出的那样,问题是从 windows8 开始,solidworks 无论如何都使用 OXPS 格式。更改组策略中的默认格式适用于其他应用程序,但 Solidworks 不在乎。所以我最终使用了微软迄今为止提供的唯一工具来处理这种情况。哪个是Windows 更新包附带的转换器应用程序。安装后,可以在此处找到转换应用程序:C:\Program Files (x86)\Windows Kits\8.0\bin

有一个 x86 版本和一个 x64 版本。

这是控制台中的一个使用示例。 在此处输入图像描述

因此,在我的应用程序旁边添加了转换器应用程序,并在我的应用程序中静默启动转换器。这是一种显示我是如何做到的方法。如有必要,该方法将给定文件转换为 XPS 格式。但结果转换必须是另一个文件,因为该工具无法覆盖它正在转换的文件。

private string EnsureFileIsUnderXPSFormat(string fileName)
{
    string retValue = fileName;
    string convertedFileName = System.IO.Path.GetDirectoryName(fileName).TrimEnd(System.IO.Path.DirectorySeparatorChar) + System.IO.Path.DirectorySeparatorChar + System.IO.Path.GetFileNameWithoutExtension(fileName) + "_converted" + System.IO.Path.GetExtension(fileName);
    Version win8version = new Version(6, 2, 9200, 0);
    if (Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version >= win8version || true)
    {
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        startInfo.Arguments = "/XPS /InputFile=" + fileName + " /OutputFile=" + convertedFileName;
        string applicationFolderPath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd(System.IO.Path.DirectorySeparatorChar) + System.IO.Path.DirectorySeparatorChar;
        startInfo.FileName = applicationFolderPath + "xpsconverter.exe";
        //if (Environment.Is64BitOperatingSystem)
        //  startInfo.FileName = @"C:\Users\maxiveil\Desktop\testConversion\xpsconverter.exe";
        //else
        //  startInfo.FileName = @"C:\Users\maxiveil\Desktop\testConversion\xpsconverter.exe";
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.CreateNoWindow = true;
        using (System.Diagnostics.Process processus = System.Diagnostics.Process.Start(startInfo))
        {
            processus.WaitForExit();
            if (processus.ExitCode != 0)
            {
                throw new Exception("Failed to convert OXPS file(" + fileName + ") to XPS format. Error code : " + processus.ExitCode.ToString());
            }
        }
        retValue = convertedFileName;
    }
    return retValue;
}

注意:转换器应用程序不关心您是否尝试将 XPS 格式文件转换为 XPS 格式文件。所以“windows8 if”是可选的。

于 2016-02-17T21:51:47.440 回答