首页 > 解决方案 > XPSDocumentWriter 静默失败

问题描述

我正在使用XpsDocumentWriter该类(MSDN)-特别是使用该WriteAsync(FixedDocument)方法。

这是我用来调用此WriteAsync方法的代码:

PrintDocumentImageableArea area = null;
var xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(ref area);

var fixedDocument = GenerateDocument();

xpsDocumentWriter.WritingCompleted += DocumentWriterOnWritingCompleted;

try
{
    xpsDocumentWriter.WriteAsync(fixedDocument);
}
catch
{
    Console.WriteLine("Error occurred");
}

我遇到的问题是,当我打印文档时说test.pdf,如果我在 PDF 查看器中打开该文件,然后尝试再次打印到该文件名,它会引发异常(由于文件已打开) - 此异常被上面的 try-catch 语句捕获。

这在我的 PC 和其他一些人的 PC 上很好,但是我发现有 2 台 PC 在相同的情况下不会抛出异常。我还WritingCompleted使用以下代码检查了事件是否有错误:

private void DocumentWriterOnWritingCompleted(object sender, WritingCompletedEventArgs e)
{
    if (e.Error != null)
    {
        Console.WriteLine("Error has occurred");
    }
}

这段代码在那些有问题的机器上没有捕捉到任何东西。

附加信息 - 我已经检查过,在没有检测到错误的 PC 上,文档不会被覆盖,它只是无法静默地写入文档。该WritingCompleted事件在所有机器上触发,但没有任何错误。

最奇怪的是,这是我临时设置的用于创建的代码FixedDocument

public FixedDocument DocumentGenerator()
{
    FixedDocument fixedDocument = new FixedDocument();

    for (int numberOfPages = 0; numberOfPages < 50; numberOfPages++)
    {
        PageContent pageContent = new PageContent();

        FixedPage fixedPage = new FixedPage()
        {
            Width = new Size(96 * 8.5, 96 * 11).Width,
            Height = new Size(96 * 8.5, 96 * 11).Height
        };

        //Add a canvas with a TextBlock and a Rectangle as children.
        Canvas canvas = new Canvas();
        fixedPage.Children.Add(canvas);
        TextBlock textBlock = new TextBlock();
        textBlock.Text =
            string.Format("Page {0} / {1}\n\nThis Is Page {0}.",
                i + 1, 1000);
        textBlock.FontSize = 24;
        canvas.Children.Add(textBlock);
        Rectangle rect = new Rectangle();
        rect.Width = 200;
        rect.Height = 200;
        rect.Fill =
            new SolidColorBrush(Color.FromArgb(200, 20, 50, 200));
        canvas.Children.Add(rect);
        ((IAddChild)pageContent).AddChild(fixedPage);

        fixedDocument.Pages.Add(pageContent);
    }

    return fixedDocument;
}

numberOfPages~> 30 时,问题 PC 上没有显示错误,但当numberOfPages~< 20 时,问题 PC 上显示错误。这些边界会根据页面上呈现的内容而变化(因此它似乎取决于文档的大小/复杂性)。

所以我想知道是否有人以前见过这样的东西?为什么FixedDocument由于试图覆盖被另一个程序锁定的文件而引发错误,其中的内容到底有什么影响?

标签: c#wpfprintingxpsdocument

解决方案


尝试处理在 a 中打开的文件catch可能不是最好的设计(尽管我承认我有程序可以做到这一点)。您最好先确定文件是否打开,如果没有打开,则允许将其覆盖。

这样,您就不会依赖错误处理来为您确定它。我已经看到在 Edge 而不是 Adob​​e 中打开 pdf 并完全绕过任何正在使用的文件异常的情况(不好)。

例子

if(IsFileOpen(myfile))
{
     xpsDocumentWriter.WriteAsync(fixedDocument);
}
else
{
     //Display error message
}

参考这篇文章来确定如何检查文件是否打开。


推荐阅读