【问题标题】:XpsDocument GetFixedDocumentSequence return null for files generated by a specific computerXpsDocument GetFixedDocumentSequence 为特定计算机生成的文件返回 null
【发布时间】:2023-03-30 17:45:01
【问题描述】:

Solidworks 生成“EDRWX”文件。通常,这些是opened with Microsoft XPS 查看器。

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

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

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

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

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

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

在我的挖掘中,我发现了这两个文件之间的差异。

【问题讨论】:

  • XPS 文件是 zip 存档 - 您可以使用 WinRar 打开它并查看其中的 xml 文件以了解可能的差异。每个页面都是单独的 xml。
  • @i486,好点,这就是我为查明文件之间的“差异”所做的工作。

标签: c# xps solidworks xpsdocument


【解决方案1】:

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

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

【讨论】:

  • 不知何故,我在网上找不到独立的转换器工具。这一切都指向我已经在我的计算机上安装的 Windows 更新包。
  • 在我的磁盘驱动器上找到搜索 XpsConverter.exe 的 exe。将尝试在我的应用程序中使用此应用程序。谢谢你
【解决方案2】:

就像 Jon 指出的那样,问题是从 windows8 开始,solidworks 无论如何都使用 OXPS 格式。更改组策略中的默认格式适用于其他应用程序,但 Solidworks 不在乎。所以我最终使用了微软迄今为止提供的唯一工具来处理这种情况。这是带有windows update package 的转换器应用程序。安装后,可以在此处找到转换应用程序: 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;
}

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

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多