c# - 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
由于试图覆盖被另一个程序锁定的文件而引发错误,其中的内容到底有什么影响?
解决方案
尝试处理在 a 中打开的文件catch
可能不是最好的设计(尽管我承认我有程序可以做到这一点)。您最好先确定文件是否打开,如果没有打开,则允许将其覆盖。
这样,您就不会依赖错误处理来为您确定它。我已经看到在 Edge 而不是 Adobe 中打开 pdf 并完全绕过任何正在使用的文件异常的情况(不好)。
例子
if(IsFileOpen(myfile))
{
xpsDocumentWriter.WriteAsync(fixedDocument);
}
else
{
//Display error message
}
参考这篇文章来确定如何检查文件是否打开。
推荐阅读
- jpeg - 在 ghostscript 中旋转 jpeg 图像
- c# - ASP.NET Core Web API 提交表单包含文件和文本字段错误
- python - 如何使用 selenium 单击此复选框
- python-3.x - 如何在 Python3 Pandas 中选择每个月的最大日期
- go - 安装后找不到 godotenv 命令
- windows - 有什么方法可以在使用 powershell 的文件夹上找到“元数据”
- ruby-on-rails - Rails 中是否有一些验证可以在字符串提交到数据库之前对其进行编辑?
- r - R sf:多边形列表上的 st_intersection
- c++-cli - 初始化 C++/CLI 结构数组
- javascript - 如何每 10 秒发送一条消息 discord.js?